diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000000..e69de29bb2d diff --git a/404.html b/404.html new file mode 100644 index 00000000000..3d8d7e15693 --- /dev/null +++ b/404.html @@ -0,0 +1,5721 @@ + + + + + + + + + + + + + + + + Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + + + + + + +
+ +
+ + + + +
+
+ + + +
+
+
+ + + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000000..5b5fa2f17e1 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +docs.dasharo.com diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 00000000000..1cf13b9f9d9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/javascripts/bundle.8492ddcf.min.js b/assets/javascripts/bundle.8492ddcf.min.js new file mode 100644 index 00000000000..e606437c5a8 --- /dev/null +++ b/assets/javascripts/bundle.8492ddcf.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var aa=Object.create;var wr=Object.defineProperty;var sa=Object.getOwnPropertyDescriptor;var ca=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,fa=Object.getPrototypeOf,Er=Object.prototype.hasOwnProperty,fn=Object.prototype.propertyIsEnumerable;var cn=(e,t,r)=>t in e?wr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,H=(e,t)=>{for(var r in t||(t={}))Er.call(t,r)&&cn(e,r,t[r]);if(kt)for(var r of kt(t))fn.call(t,r)&&cn(e,r,t[r]);return e};var un=(e,t)=>{var r={};for(var n in e)Er.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&kt)for(var n of kt(e))t.indexOf(n)<0&&fn.call(e,n)&&(r[n]=e[n]);return r};var yt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ua=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ca(t))!Er.call(e,o)&&o!==r&&wr(e,o,{get:()=>t[o],enumerable:!(n=sa(t,o))||n.enumerable});return e};var Ye=(e,t,r)=>(r=e!=null?aa(fa(e)):{},ua(t||!e||!e.__esModule?wr(r,"default",{value:e,enumerable:!0}):r,e));var ln=yt((Sr,pn)=>{(function(e,t){typeof Sr=="object"&&typeof pn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Sr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(_){return!!(_&&_!==document&&_.nodeName!=="HTML"&&_.nodeName!=="BODY"&&"classList"in _&&"contains"in _.classList)}function c(_){var We=_.type,Fe=_.tagName;return!!(Fe==="INPUT"&&s[We]&&!_.readOnly||Fe==="TEXTAREA"&&!_.readOnly||_.isContentEditable)}function f(_){_.classList.contains("focus-visible")||(_.classList.add("focus-visible"),_.setAttribute("data-focus-visible-added",""))}function u(_){!_.hasAttribute("data-focus-visible-added")||(_.classList.remove("focus-visible"),_.removeAttribute("data-focus-visible-added"))}function p(_){_.metaKey||_.altKey||_.ctrlKey||(a(r.activeElement)&&f(r.activeElement),n=!0)}function l(_){n=!1}function d(_){!a(_.target)||(n||c(_.target))&&f(_.target)}function h(_){!a(_.target)||(_.target.classList.contains("focus-visible")||_.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(_.target))}function b(_){document.visibilityState==="hidden"&&(o&&(n=!0),U())}function U(){document.addEventListener("mousemove",W),document.addEventListener("mousedown",W),document.addEventListener("mouseup",W),document.addEventListener("pointermove",W),document.addEventListener("pointerdown",W),document.addEventListener("pointerup",W),document.addEventListener("touchmove",W),document.addEventListener("touchstart",W),document.addEventListener("touchend",W)}function G(){document.removeEventListener("mousemove",W),document.removeEventListener("mousedown",W),document.removeEventListener("mouseup",W),document.removeEventListener("pointermove",W),document.removeEventListener("pointerdown",W),document.removeEventListener("pointerup",W),document.removeEventListener("touchmove",W),document.removeEventListener("touchstart",W),document.removeEventListener("touchend",W)}function W(_){_.target.nodeName&&_.target.nodeName.toLowerCase()==="html"||(n=!1,G())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",l,!0),document.addEventListener("pointerdown",l,!0),document.addEventListener("touchstart",l,!0),document.addEventListener("visibilitychange",b,!0),U(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var mn=yt(Or=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(f){return!1}},r=t(),n=function(f){var u={next:function(){var p=f.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(f){return encodeURIComponent(f).replace(/%20/g,"+")},i=function(f){return decodeURIComponent(String(f).replace(/\+/g," "))},s=function(){var f=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var l=typeof p;if(l!=="undefined")if(l==="string")p!==""&&this._fromString(p);else if(p instanceof f){var d=this;p.forEach(function(G,W){d.append(W,G)})}else if(p!==null&&l==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),f._entries&&(f._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Or);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(c,f){typeof c!="string"&&(c=String(c)),f&&typeof f!="string"&&(f=String(f));var u=document,p;if(f&&(e.location===void 0||f!==e.location.href)){f=f.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=f,u.head.appendChild(p);try{if(p.href.indexOf(f)!==0)throw new Error(p.href)}catch(_){throw new Error("URL unable to set base "+f+" due to "+_)}}var l=u.createElement("a");l.href=c,p&&(u.body.appendChild(l),l.href=l.href);var d=u.createElement("input");if(d.type="url",d.value=c,l.protocol===":"||!/:/.test(l.href)||!d.checkValidity()&&!f)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:l});var h=new e.URLSearchParams(this.search),b=!0,U=!0,G=this;["append","delete","set"].forEach(function(_){var We=h[_];h[_]=function(){We.apply(h,arguments),b&&(U=!1,G.search=h.toString(),U=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var W=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==W&&(W=this.search,U&&(b=!1,this.searchParams._fromString(this.search),b=!0))}})},s=i.prototype,a=function(c){Object.defineProperty(s,c,{get:function(){return this._anchorElement[c]},set:function(f){this._anchorElement[c]=f},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(c){a(c)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(c){this._anchorElement.search=c,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var c=this;return function(){return c.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(c){this._anchorElement.href=c,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(c){this._anchorElement.pathname=c},enumerable:!0},origin:{get:function(){var c={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],f=this._anchorElement.port!=c&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(f?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(c){},enumerable:!0},username:{get:function(){return""},set:function(c){},enumerable:!0}}),i.createObjectURL=function(c){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(c){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Or)});var Pn=yt((Ks,$t)=>{/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */var dn,hn,bn,vn,gn,yn,xn,wn,En,Ht,_r,Sn,On,_n,rt,Tn,Mn,Ln,An,Cn,Rn,kn,Hn,Pt;(function(e){var t=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(n){e(r(t,r(n)))}):typeof $t=="object"&&typeof $t.exports=="object"?e(r(t,r($t.exports))):e(r(t));function r(n,o){return n!==t&&(typeof Object.create=="function"?Object.defineProperty(n,"__esModule",{value:!0}):n.__esModule=!0),function(i,s){return n[i]=o?o(i,s):s}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])};dn=function(n,o){if(typeof o!="function"&&o!==null)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");t(n,o);function i(){this.constructor=n}n.prototype=o===null?Object.create(o):(i.prototype=o.prototype,new i)},hn=Object.assign||function(n){for(var o,i=1,s=arguments.length;i=0;u--)(f=n[u])&&(c=(a<3?f(c):a>3?f(o,i,c):f(o,i))||c);return a>3&&c&&Object.defineProperty(o,i,c),c},gn=function(n,o){return function(i,s){o(i,s,n)}},yn=function(n,o){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,o)},xn=function(n,o,i,s){function a(c){return c instanceof i?c:new i(function(f){f(c)})}return new(i||(i=Promise))(function(c,f){function u(d){try{l(s.next(d))}catch(h){f(h)}}function p(d){try{l(s.throw(d))}catch(h){f(h)}}function l(d){d.done?c(d.value):a(d.value).then(u,p)}l((s=s.apply(n,o||[])).next())})},wn=function(n,o){var i={label:0,sent:function(){if(c[0]&1)throw c[1];return c[1]},trys:[],ops:[]},s,a,c,f;return f={next:u(0),throw:u(1),return:u(2)},typeof Symbol=="function"&&(f[Symbol.iterator]=function(){return this}),f;function u(l){return function(d){return p([l,d])}}function p(l){if(s)throw new TypeError("Generator is already executing.");for(;i;)try{if(s=1,a&&(c=l[0]&2?a.return:l[0]?a.throw||((c=a.return)&&c.call(a),0):a.next)&&!(c=c.call(a,l[1])).done)return c;switch(a=0,c&&(l=[l[0]&2,c.value]),l[0]){case 0:case 1:c=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,a=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(c=i.trys,!(c=c.length>0&&c[c.length-1])&&(l[0]===6||l[0]===2)){i=0;continue}if(l[0]===3&&(!c||l[1]>c[0]&&l[1]=n.length&&(n=void 0),{value:n&&n[s++],done:!n}}};throw new TypeError(o?"Object is not iterable.":"Symbol.iterator is not defined.")},_r=function(n,o){var i=typeof Symbol=="function"&&n[Symbol.iterator];if(!i)return n;var s=i.call(n),a,c=[],f;try{for(;(o===void 0||o-- >0)&&!(a=s.next()).done;)c.push(a.value)}catch(u){f={error:u}}finally{try{a&&!a.done&&(i=s.return)&&i.call(s)}finally{if(f)throw f.error}}return c},Sn=function(){for(var n=[],o=0;o1||u(b,U)})})}function u(b,U){try{p(s[b](U))}catch(G){h(c[0][3],G)}}function p(b){b.value instanceof rt?Promise.resolve(b.value.v).then(l,d):h(c[0][2],b)}function l(b){u("next",b)}function d(b){u("throw",b)}function h(b,U){b(U),c.shift(),c.length&&u(c[0][0],c[0][1])}},Mn=function(n){var o,i;return o={},s("next"),s("throw",function(a){throw a}),s("return"),o[Symbol.iterator]=function(){return this},o;function s(a,c){o[a]=n[a]?function(f){return(i=!i)?{value:rt(n[a](f)),done:a==="return"}:c?c(f):f}:c}},Ln=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o=n[Symbol.asyncIterator],i;return o?o.call(n):(n=typeof Ht=="function"?Ht(n):n[Symbol.iterator](),i={},s("next"),s("throw"),s("return"),i[Symbol.asyncIterator]=function(){return this},i);function s(c){i[c]=n[c]&&function(f){return new Promise(function(u,p){f=n[c](f),a(u,p,f.done,f.value)})}}function a(c,f,u,p){Promise.resolve(p).then(function(l){c({value:l,done:u})},f)}},An=function(n,o){return Object.defineProperty?Object.defineProperty(n,"raw",{value:o}):n.raw=o,n};var r=Object.create?function(n,o){Object.defineProperty(n,"default",{enumerable:!0,value:o})}:function(n,o){n.default=o};Cn=function(n){if(n&&n.__esModule)return n;var o={};if(n!=null)for(var i in n)i!=="default"&&Object.prototype.hasOwnProperty.call(n,i)&&Pt(o,n,i);return r(o,n),o},Rn=function(n){return n&&n.__esModule?n:{default:n}},kn=function(n,o,i,s){if(i==="a"&&!s)throw new TypeError("Private accessor was defined without a getter");if(typeof o=="function"?n!==o||!s:!o.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?s:i==="a"?s.call(n):s?s.value:o.get(n)},Hn=function(n,o,i,s,a){if(s==="m")throw new TypeError("Private method is not writable");if(s==="a"&&!a)throw new TypeError("Private accessor was defined without a setter");if(typeof o=="function"?n!==o||!a:!o.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return s==="a"?a.call(n,i):a?a.value=i:o.set(n,i),i},e("__extends",dn),e("__assign",hn),e("__rest",bn),e("__decorate",vn),e("__param",gn),e("__metadata",yn),e("__awaiter",xn),e("__generator",wn),e("__exportStar",En),e("__createBinding",Pt),e("__values",Ht),e("__read",_r),e("__spread",Sn),e("__spreadArrays",On),e("__spreadArray",_n),e("__await",rt),e("__asyncGenerator",Tn),e("__asyncDelegator",Mn),e("__asyncValues",Ln),e("__makeTemplateObject",An),e("__importStar",Cn),e("__importDefault",Rn),e("__classPrivateFieldGet",kn),e("__classPrivateFieldSet",Hn)})});var Br=yt((At,Yr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof At=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof At=="object"?At.ClipboardJS=r():t.ClipboardJS=r()})(At,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return ia}});var s=i(279),a=i.n(s),c=i(370),f=i.n(c),u=i(817),p=i.n(u);function l(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var O=p()(T);return l("cut"),O},h=d;function b(j){var T=document.documentElement.getAttribute("dir")==="rtl",O=document.createElement("textarea");O.style.fontSize="12pt",O.style.border="0",O.style.padding="0",O.style.margin="0",O.style.position="absolute",O.style[T?"right":"left"]="-9999px";var k=window.pageYOffset||document.documentElement.scrollTop;return O.style.top="".concat(k,"px"),O.setAttribute("readonly",""),O.value=j,O}var U=function(T,O){var k=b(T);O.container.appendChild(k);var $=p()(k);return l("copy"),k.remove(),$},G=function(T){var O=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},k="";return typeof T=="string"?k=U(T,O):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?k=U(T.value,O):(k=p()(T),l("copy")),k},W=G;function _(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?_=function(O){return typeof O}:_=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},_(j)}var We=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},O=T.action,k=O===void 0?"copy":O,$=T.container,q=T.target,Te=T.text;if(k!=="copy"&&k!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&_(q)==="object"&&q.nodeType===1){if(k==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(k==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Te)return W(Te,{container:$});if(q)return k==="cut"?h(q):W(q,{container:$})},Fe=We;function Pe(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Pe=function(O){return typeof O}:Pe=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},Pe(j)}function Ji(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function sn(j,T){for(var O=0;O0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof $.action=="function"?$.action:this.defaultAction,this.target=typeof $.target=="function"?$.target:this.defaultTarget,this.text=typeof $.text=="function"?$.text:this.defaultText,this.container=Pe($.container)==="object"?$.container:document.body}},{key:"listenClick",value:function($){var q=this;this.listener=f()($,"click",function(Te){return q.onClick(Te)})}},{key:"onClick",value:function($){var q=$.delegateTarget||$.currentTarget,Te=this.action(q)||"copy",Rt=Fe({action:Te,container:this.container,target:this.target(q),text:this.text(q)});this.emit(Rt?"success":"error",{action:Te,text:Rt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function($){return xr("action",$)}},{key:"defaultTarget",value:function($){var q=xr("target",$);if(q)return document.querySelector(q)}},{key:"defaultText",value:function($){return xr("text",$)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function($){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return W($,q)}},{key:"cut",value:function($){return h($)}},{key:"isSupported",value:function(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof $=="string"?[$]:$,Te=!!document.queryCommandSupported;return q.forEach(function(Rt){Te=Te&&!!document.queryCommandSupported(Rt)}),Te}}]),O}(a()),ia=oa},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,l,d,h){var b=f.apply(this,arguments);return u.addEventListener(l,b,h),{destroy:function(){u.removeEventListener(l,b,h)}}}function c(u,p,l,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof l=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(b){return a(b,p,l,d,h)}))}function f(u,p,l,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=c},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function c(l,d,h){if(!l&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(l))return f(l,d,h);if(s.nodeList(l))return u(l,d,h);if(s.string(l))return p(l,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function f(l,d,h){return l.addEventListener(d,h),{destroy:function(){l.removeEventListener(d,h)}}}function u(l,d,h){return Array.prototype.forEach.call(l,function(b){b.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(l,function(b){b.removeEventListener(d,h)})}}}function p(l,d,h){return a(document.body,l,d,h)}n.exports=c},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),f=document.createRange();f.selectNodeContents(i),c.removeAllRanges(),c.addRange(f),s=c.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function f(){c.off(i,f),s.apply(a,arguments)}return f._=s,this.on(i,f,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,f=a.length;for(c;c{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var Ms=/["'&<>]/;Si.exports=Ls;function Ls(e){var t=""+e,r=Ms.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Tr:(this.currentObservers=null,a.push(r),new $e(function(){n.currentObservers=null,Ue(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new Qn(r,n)},t}(F);var Qn=function(e){ne(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Tr},t}(E);var wt={now:function(){return(wt.delegate||Date).now()},delegate:void 0};var Et=function(e){ne(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=wt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,c=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=at.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(at.cancelAnimationFrame(n),r._scheduled=void 0)},t}(zt);var Gn=function(e){ne(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Nt);var xe=new Gn(Bn);var R=new F(function(e){return e.complete()});function qt(e){return e&&L(e.schedule)}function Hr(e){return e[e.length-1]}function Ve(e){return L(Hr(e))?e.pop():void 0}function Ee(e){return qt(Hr(e))?e.pop():void 0}function Kt(e,t){return typeof Hr(e)=="number"?e.pop():t}var st=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Qt(e){return L(e==null?void 0:e.then)}function Yt(e){return L(e[it])}function Bt(e){return Symbol.asyncIterator&&L(e==null?void 0:e[Symbol.asyncIterator])}function Gt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function ya(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Jt=ya();function Xt(e){return L(e==null?void 0:e[Jt])}function Zt(e){return jn(this,arguments,function(){var r,n,o,i;return It(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,jt(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,jt(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,jt(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function er(e){return L(e==null?void 0:e.getReader)}function z(e){if(e instanceof F)return e;if(e!=null){if(Yt(e))return xa(e);if(st(e))return wa(e);if(Qt(e))return Ea(e);if(Bt(e))return Jn(e);if(Xt(e))return Sa(e);if(er(e))return Oa(e)}throw Gt(e)}function xa(e){return new F(function(t){var r=e[it]();if(L(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function wa(e){return new F(function(t){for(var r=0;r=2,!0))}function ie(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new E}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(f){var u,p,l,d=0,h=!1,b=!1,U=function(){p==null||p.unsubscribe(),p=void 0},G=function(){U(),u=l=void 0,h=b=!1},W=function(){var _=u;G(),_==null||_.unsubscribe()};return g(function(_,We){d++,!b&&!h&&U();var Fe=l=l!=null?l:r();We.add(function(){d--,d===0&&!b&&!h&&(p=Dr(W,c))}),Fe.subscribe(We),!u&&d>0&&(u=new Ge({next:function(Pe){return Fe.next(Pe)},error:function(Pe){b=!0,U(),p=Dr(G,o,Pe),Fe.error(Pe)},complete:function(){h=!0,U(),p=Dr(G,s),Fe.complete()}}),z(_).subscribe(u))})(f)}}function Dr(e,t){for(var r=[],n=2;ne.next(document)),e}function Q(e,t=document){return Array.from(t.querySelectorAll(e))}function K(e,t=document){let r=pe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function pe(e,t=document){return t.querySelector(e)||void 0}function Ie(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function nr(e){return A(v(document.body,"focusin"),v(document.body,"focusout")).pipe(Re(1),m(()=>{let t=Ie();return typeof t!="undefined"?e.contains(t):!1}),N(e===Ie()),B())}function qe(e){return{x:e.offsetLeft,y:e.offsetTop}}function yo(e){return A(v(window,"load"),v(window,"resize")).pipe(Ae(0,xe),m(()=>qe(e)),N(qe(e)))}function or(e){return{x:e.scrollLeft,y:e.scrollTop}}function pt(e){return A(v(e,"scroll"),v(window,"resize")).pipe(Ae(0,xe),m(()=>or(e)),N(or(e)))}var wo=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!qr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),Ka?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!qr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=qa.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Eo=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Oo=typeof WeakMap!="undefined"?new WeakMap:new wo,_o=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=Qa.getInstance(),n=new ns(t,r,this);Oo.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){_o.prototype[e]=function(){var t;return(t=Oo.get(this))[e].apply(t,arguments)}});var os=function(){return typeof ir.ResizeObserver!="undefined"?ir.ResizeObserver:_o}(),To=os;var Mo=new E,is=P(()=>I(new To(e=>{for(let t of e)Mo.next(t)}))).pipe(S(e=>A(Se,I(e)).pipe(C(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ve(e){return is.pipe(w(t=>t.observe(e)),S(t=>Mo.pipe(x(({target:r})=>r===e),C(()=>t.unobserve(e)),m(()=>he(e)))),N(he(e)))}function mt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var Lo=new E,as=P(()=>I(new IntersectionObserver(e=>{for(let t of e)Lo.next(t)},{threshold:0}))).pipe(S(e=>A(Se,I(e)).pipe(C(()=>e.disconnect()))),X(1));function fr(e){return as.pipe(w(t=>t.observe(e)),S(t=>Lo.pipe(x(({target:r})=>r===e),C(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function Ao(e,t=16){return pt(e).pipe(m(({y:r})=>{let n=he(e),o=mt(e);return r>=o.height-n.height-t}),B())}var ur={drawer:K("[data-md-toggle=drawer]"),search:K("[data-md-toggle=search]")};function Co(e){return ur[e].checked}function Ke(e,t){ur[e].checked!==t&&ur[e].click()}function dt(e){let t=ur[e];return v(t,"change").pipe(m(()=>t.checked),N(t.checked))}function ss(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ro(){return v(window,"keydown").pipe(x(e=>!(e.metaKey||e.ctrlKey)),m(e=>({mode:Co("search")?"search":"global",type:e.key,claim(){e.preventDefault(),e.stopPropagation()}})),x(({mode:e,type:t})=>{if(e==="global"){let r=Ie();if(typeof r!="undefined")return!ss(r,t)}return!0}),ie())}function Oe(){return new URL(location.href)}function pr(e){location.href=e.href}function ko(){return new E}function Ho(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Ho(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)Ho(n,o);return n}function Po(e,t){let r=t;if(e.length>r){for(;e[r]!==" "&&--r>0;);return`${e.substring(0,r)}...`}return e}function lr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function $o(){return location.hash.substring(1)}function Io(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function cs(){return v(window,"hashchange").pipe(m($o),N($o()),x(e=>e.length>0),X(1))}function jo(){return cs().pipe(m(e=>pe(`[id="${e}"]`)),x(e=>typeof e!="undefined"))}function Kr(e){let t=matchMedia(e);return rr(r=>t.addListener(()=>r(t.matches))).pipe(N(t.matches))}function Fo(){let e=matchMedia("print");return A(v(window,"beforeprint").pipe(m(()=>!0)),v(window,"afterprint").pipe(m(()=>!1))).pipe(N(e.matches))}function Qr(e,t){return e.pipe(S(r=>r?t():R))}function mr(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(ce(()=>R),S(r=>r.status!==200?Ot(()=>new Error(r.statusText)):I(r)))}function je(e,t){return mr(e,t).pipe(S(r=>r.json()),X(1))}function Uo(e,t){let r=new DOMParser;return mr(e,t).pipe(S(n=>n.text()),m(n=>r.parseFromString(n,"text/xml")),X(1))}function Do(e){let t=M("script",{src:e});return P(()=>(document.head.appendChild(t),A(v(t,"load"),v(t,"error").pipe(S(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),C(()=>document.head.removeChild(t)),oe(1))))}function Wo(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function Vo(){return A(v(window,"scroll",{passive:!0}),v(window,"resize",{passive:!0})).pipe(m(Wo),N(Wo()))}function zo(){return{width:innerWidth,height:innerHeight}}function No(){return v(window,"resize",{passive:!0}).pipe(m(zo),N(zo()))}function qo(){return Y([Vo(),No()]).pipe(m(([e,t])=>({offset:e,size:t})),X(1))}function dr(e,{viewport$:t,header$:r}){let n=t.pipe(J("size")),o=Y([n,r]).pipe(m(()=>qe(e)));return Y([r,t,o]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:f}])=>({offset:{x:s.x-c,y:s.y-f+i},size:a})))}function Ko(e,{tx$:t}){let r=v(e,"message").pipe(m(({data:n})=>n));return t.pipe(Lt(()=>r,{leading:!0,trailing:!0}),w(n=>e.postMessage(n)),S(()=>r),ie())}var fs=K("#__config"),ht=JSON.parse(fs.textContent);ht.base=`${new URL(ht.base,Oe())}`;function le(){return ht}function Z(e){return ht.features.includes(e)}function re(e,t){return typeof t!="undefined"?ht.translations[e].replace("#",t.toString()):ht.translations[e]}function _e(e,t=document){return K(`[data-md-component=${e}]`,t)}function te(e,t=document){return Q(`[data-md-component=${e}]`,t)}function us(e){let t=K(".md-typeset > :first-child",e);return v(t,"click",{once:!0}).pipe(m(()=>K(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function Qo(e){return!Z("announce.dismiss")||!e.childElementCount?R:P(()=>{let t=new E;return t.pipe(N({hash:__md_get("__announce")})).subscribe(({hash:r})=>{var n;r&&r===((n=__md_get("__announce"))!=null?n:r)&&(e.hidden=!0,__md_set("__announce",r))}),us(e).pipe(w(r=>t.next(r)),C(()=>t.complete()),m(r=>H({ref:e},r)))})}function ps(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function Yo(e,t){let r=new E;return r.subscribe(({hidden:n})=>{e.hidden=n}),ps(e,t).pipe(w(n=>r.next(n)),C(()=>r.complete()),m(n=>H({ref:e},n)))}var ii=Ye(Br());function Gr(e){return M("div",{class:"md-tooltip",id:e},M("div",{class:"md-tooltip__inner md-typeset"}))}function Bo(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return M("aside",{class:"md-annotation",tabIndex:0},Gr(t),M("a",{href:r,class:"md-annotation__index",tabIndex:-1},M("span",{"data-md-annotation-id":e})))}else return M("aside",{class:"md-annotation",tabIndex:0},Gr(t),M("span",{class:"md-annotation__index",tabIndex:-1},M("span",{"data-md-annotation-id":e})))}function Go(e){return M("button",{class:"md-clipboard md-icon",title:re("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Jr(e,t){let r=t&2,n=t&1,o=Object.keys(e.terms).filter(a=>!e.terms[a]).reduce((a,c)=>[...a,M("del",null,c)," "],[]).slice(0,-1),i=new URL(e.location);Z("search.highlight")&&i.searchParams.set("h",Object.entries(e.terms).filter(([,a])=>a).reduce((a,[c])=>`${a} ${c}`.trim(),""));let{tags:s}=le();return M("a",{href:`${i}`,class:"md-search-result__link",tabIndex:-1},M("article",{class:["md-search-result__article",...r?["md-search-result__article--document"]:[]].join(" "),"data-md-score":e.score.toFixed(2)},r>0&&M("div",{class:"md-search-result__icon md-icon"}),M("h1",{class:"md-search-result__title"},e.title),n>0&&e.text.length>0&&M("p",{class:"md-search-result__teaser"},Po(e.text,320)),e.tags&&M("div",{class:"md-typeset"},e.tags.map(a=>{let c=a.replace(/<[^>]+>/g,""),f=s?c in s?`md-tag-icon md-tag-icon--${s[c]}`:"md-tag-icon":"";return M("span",{class:`md-tag ${f}`},a)})),n>0&&o.length>0&&M("p",{class:"md-search-result__terms"},re("search.result.term.missing"),": ",...o)))}function Jo(e){let t=e[0].score,r=[...e],n=r.findIndex(f=>!f.location.includes("#")),[o]=r.splice(n,1),i=r.findIndex(f=>f.scoreJr(f,1)),...a.length?[M("details",{class:"md-search-result__more"},M("summary",{tabIndex:-1},a.length>0&&a.length===1?re("search.result.more.one"):re("search.result.more.other",a.length)),...a.map(f=>Jr(f,1)))]:[]];return M("li",{class:"md-search-result__item"},c)}function Xo(e){return M("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>M("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?lr(r):r)))}function Xr(e){let t=`tabbed-control tabbed-control--${e}`;return M("div",{class:t,hidden:!0},M("button",{class:"tabbed-button",tabIndex:-1}))}function Zo(e){return M("div",{class:"md-typeset__scrollwrap"},M("div",{class:"md-typeset__table"},e))}function ls(e){let t=le(),r=new URL(`../${e.version}/`,t.base);return M("li",{class:"md-version__item"},M("a",{href:`${r}`,class:"md-version__link"},e.title))}function ei(e,t){return M("div",{class:"md-version"},M("button",{class:"md-version__current","aria-label":re("select.version.title")},t.title),M("ul",{class:"md-version__list"},e.map(ls)))}function ms(e,t){let r=P(()=>Y([yo(e),pt(t)])).pipe(m(([{x:n,y:o},i])=>{let{width:s,height:a}=he(e);return{x:n-i.x+s/2,y:o-i.y+a/2}}));return nr(e).pipe(S(n=>r.pipe(m(o=>({active:n,offset:o})),oe(+!n||1/0))))}function ti(e,t,{target$:r}){let[n,o]=Array.from(e.children);return P(()=>{let i=new E,s=i.pipe(de(1));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),fr(e).pipe(ee(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),A(i.pipe(x(({active:a})=>a)),i.pipe(Re(250),x(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(n):n.remove()},complete(){e.prepend(n)}}),i.pipe(Ae(16,xe)).subscribe(({active:a})=>{n.classList.toggle("md-tooltip--active",a)}),i.pipe(zr(125,xe),x(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),v(o,"click").pipe(ee(s),x(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>a.preventDefault()),v(o,"mousedown").pipe(ee(s),ae(i)).subscribe(([a,{active:c}])=>{var f;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let u=e.parentElement.closest(".md-annotation");u instanceof HTMLElement?u.focus():(f=Ie())==null||f.blur()}}),r.pipe(ee(s),x(a=>a===n),ke(125)).subscribe(()=>e.focus()),ms(e,t).pipe(w(a=>i.next(a)),C(()=>i.complete()),m(a=>H({ref:e},a)))})}function ds(e){let t=[];for(let r of Q(".c, .c1, .cm",e)){let n=[],o=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=o.nextNode();i;i=o.nextNode())n.push(i);for(let i of n){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let f=i.splitText(s.index);i=f.splitText(a.length),t.push(f)}else{i.textContent=a,t.push(i);break}}}}return t}function ri(e,t){t.append(...Array.from(e.childNodes))}function ni(e,t,{target$:r,print$:n}){let o=t.closest("[id]"),i=o==null?void 0:o.id,s=new Map;for(let a of ds(t)){let[,c]=a.textContent.match(/\((\d+)\)/);pe(`li:nth-child(${c})`,e)&&(s.set(c,Bo(c,i)),a.replaceWith(s.get(c)))}return s.size===0?R:P(()=>{let a=new E,c=[];for(let[f,u]of s)c.push([K(".md-typeset",u),K(`li:nth-child(${f})`,e)]);return n.pipe(ee(a.pipe(de(1)))).subscribe(f=>{e.hidden=!f;for(let[u,p]of c)f?ri(u,p):ri(p,u)}),A(...[...s].map(([,f])=>ti(f,t,{target$:r}))).pipe(C(()=>a.complete()),ie())})}var hs=0;function ai(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return ai(t)}}function oi(e){return ve(e).pipe(m(({width:t})=>({scrollable:mt(e).width>t})),J("scrollable"))}function si(e,t){let{matches:r}=matchMedia("(hover)"),n=P(()=>{let o=new E;if(o.subscribe(({scrollable:s})=>{s&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}),ii.default.isSupported()){let s=e.closest("pre");s.id=`__code_${++hs}`,s.insertBefore(Go(s.id),e)}let i=e.closest(".highlight");if(i instanceof HTMLElement){let s=ai(i);if(typeof s!="undefined"&&(i.classList.contains("annotate")||Z("content.code.annotate"))){let a=ni(s,e,t);return oi(e).pipe(w(c=>o.next(c)),C(()=>o.complete()),m(c=>H({ref:e},c)),et(ve(i).pipe(m(({width:c,height:f})=>c&&f),B(),S(c=>c?a:R))))}}return oi(e).pipe(w(s=>o.next(s)),C(()=>o.complete()),m(s=>H({ref:e},s)))});return Z("content.lazy")?fr(e).pipe(x(o=>o),oe(1),S(()=>n)):n}var ci=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:transparent}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color)}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}defs #flowchart-circleEnd,defs #flowchart-circleStart,defs #flowchart-crossEnd,defs #flowchart-crossStart,defs #flowchart-pointEnd,defs #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}.actor,defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{stroke:var(--md-mermaid-node-fg-color)}text.actor>tspan{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-default-fg-color--lighter)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-edge-color)}.loopText>tspan,.messageText,.noteText>tspan{font-family:var(--md-mermaid-font-family)!important}#arrowhead path,.loopText>tspan,.messageText,.noteText>tspan{fill:var(--md-mermaid-edge-color);stroke:none}.loopLine{stroke:var(--md-mermaid-node-fg-color)}.labelBox,.loopLine{fill:var(--md-mermaid-node-bg-color)}.labelBox{stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-node-fg-color);font-family:var(--md-mermaid-font-family)}";var Zr,vs=0;function gs(){return typeof mermaid=="undefined"||mermaid instanceof Element?Do("https://unpkg.com/mermaid@9.1.7/dist/mermaid.min.js"):I(void 0)}function fi(e){return e.classList.remove("mermaid"),Zr||(Zr=gs().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:ci,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),X(1))),Zr.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${vs++}`,r=M("div",{class:"mermaid"});mermaid.mermaidAPI.render(t,e.textContent,n=>{let o=r.attachShadow({mode:"closed"});o.innerHTML=n,e.replaceWith(r)})}),Zr.pipe(m(()=>({ref:e})))}function ys(e,{target$:t,print$:r}){let n=!0;return A(t.pipe(m(o=>o.closest("details:not([open])")),x(o=>e===o),m(()=>({action:"open",reveal:!0}))),r.pipe(x(o=>o||!n),w(()=>n=e.open),m(o=>({action:o?"open":"close"}))))}function ui(e,t){return P(()=>{let r=new E;return r.subscribe(({action:n,reveal:o})=>{e.toggleAttribute("open",n==="open"),o&&e.scrollIntoView()}),ys(e,t).pipe(w(n=>r.next(n)),C(()=>r.complete()),m(n=>H({ref:e},n)))})}var pi=M("table");function li(e){return e.replaceWith(pi),pi.replaceWith(Zo(e)),I({ref:e})}function xs(e){let t=Q(":scope > input",e),r=t.find(n=>n.checked)||t[0];return A(...t.map(n=>v(n,"change").pipe(m(()=>K(`label[for="${n.id}"]`))))).pipe(N(K(`label[for="${r.id}"]`)),m(n=>({active:n})))}function mi(e,{viewport$:t}){let r=Xr("prev");e.append(r);let n=Xr("next");e.append(n);let o=K(".tabbed-labels",e);return P(()=>{let i=new E,s=i.pipe(de(1));return Y([i,ve(e)]).pipe(Ae(1,xe),ee(s)).subscribe({next([{active:a},c]){let f=qe(a),{width:u}=he(a);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let p=or(o);(f.xp.x+c.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),Y([pt(o),ve(o)]).pipe(ee(s)).subscribe(([a,c])=>{let f=mt(o);r.hidden=a.x<16,n.hidden=a.x>f.width-c.width-16}),A(v(r,"click").pipe(m(()=>-1)),v(n,"click").pipe(m(()=>1))).pipe(ee(s)).subscribe(a=>{let{width:c}=he(o);o.scrollBy({left:c*a,behavior:"smooth"})}),Z("content.tabs.link")&&i.pipe(He(1),ae(t)).subscribe(([{active:a},{offset:c}])=>{let f=a.innerText.trim();if(a.hasAttribute("data-md-switching"))a.removeAttribute("data-md-switching");else{let u=e.offsetTop-c.y;for(let l of Q("[data-tabs]"))for(let d of Q(":scope > input",l)){let h=K(`label[for="${d.id}"]`);if(h!==a&&h.innerText.trim()===f){h.setAttribute("data-md-switching",""),d.click();break}}window.scrollTo({top:e.offsetTop-u});let p=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...p])])}}),xs(e).pipe(w(a=>i.next(a)),C(()=>i.complete()),m(a=>H({ref:e},a)))}).pipe(Je(fe))}function di(e,{viewport$:t,target$:r,print$:n}){return A(...Q("pre:not(.mermaid) > code",e).map(o=>si(o,{target$:r,print$:n})),...Q("pre.mermaid",e).map(o=>fi(o)),...Q("table:not([class])",e).map(o=>li(o)),...Q("details",e).map(o=>ui(o,{target$:r,print$:n})),...Q("[data-tabs]",e).map(o=>mi(o,{viewport$:t})))}function ws(e,{alert$:t}){return t.pipe(S(r=>A(I(!0),I(!1).pipe(ke(2e3))).pipe(m(n=>({message:r,active:n})))))}function hi(e,t){let r=K(".md-typeset",e);return P(()=>{let n=new E;return n.subscribe(({message:o,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=o}),ws(e,t).pipe(w(o=>n.next(o)),C(()=>n.complete()),m(o=>H({ref:e},o)))})}function Es({viewport$:e}){if(!Z("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:o}})=>o),Ce(2,1),m(([o,i])=>[oMath.abs(i-o.y)>100),m(([,[o]])=>o),B()),n=dt("search");return Y([e,n]).pipe(m(([{offset:o},i])=>o.y>400&&!i),B(),S(o=>o?r:I(!1)),N(!1))}function bi(e,t){return P(()=>Y([ve(e),Es(t)])).pipe(m(([{height:r},n])=>({height:r,hidden:n})),B((r,n)=>r.height===n.height&&r.hidden===n.hidden),X(1))}function vi(e,{header$:t,main$:r}){return P(()=>{let n=new E,o=n.pipe(de(1));return n.pipe(J("active"),Ze(t)).subscribe(([{active:i},{hidden:s}])=>{e.classList.toggle("md-header--shadow",i&&!s),e.hidden=s}),r.subscribe(n),t.pipe(ee(o),m(i=>H({ref:e},i)))})}function Ss(e,{viewport$:t,header$:r}){return dr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:n}})=>{let{height:o}=he(e);return{active:n>=o}}),J("active"))}function gi(e,t){return P(()=>{let r=new E;r.subscribe(({active:o})=>{e.classList.toggle("md-header__title--active",o)});let n=pe("article h1");return typeof n=="undefined"?R:Ss(n,t).pipe(w(o=>r.next(o)),C(()=>r.complete()),m(o=>H({ref:e},o)))})}function yi(e,{viewport$:t,header$:r}){let n=r.pipe(m(({height:i})=>i),B()),o=n.pipe(S(()=>ve(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),J("bottom"))));return Y([n,o,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:f}}])=>(f=Math.max(0,f-Math.max(0,s-c,i)-Math.max(0,f+c-a)),{offset:s-i,height:f,active:s-i<=c})),B((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function Os(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return I(...e).pipe(se(r=>v(r,"change").pipe(m(()=>r))),N(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),X(1))}function xi(e){return P(()=>{let t=new E;t.subscribe(n=>{document.body.setAttribute("data-md-color-switching","");for(let[o,i]of Object.entries(n.color))document.body.setAttribute(`data-md-color-${o}`,i);for(let o=0;o{document.body.removeAttribute("data-md-color-switching")});let r=Q("input",e);return Os(r).pipe(w(n=>t.next(n)),C(()=>t.complete()),m(n=>H({ref:e},n)))})}var en=Ye(Br());function _s(e){e.setAttribute("data-md-copying","");let t=e.innerText;return e.removeAttribute("data-md-copying"),t}function wi({alert$:e}){en.default.isSupported()&&new F(t=>{new en.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||_s(K(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>re("clipboard.copied"))).subscribe(e)}function Ts(e){if(e.length<2)return[""];let[t,r]=[...e].sort((o,i)=>o.length-i.length).map(o=>o.replace(/[^/]+$/,"")),n=0;if(t===r)n=t.length;else for(;t.charCodeAt(n)===r.charCodeAt(n);)n++;return e.map(o=>o.replace(t.slice(0,n),""))}function hr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return I(t);{let r=le();return Uo(new URL("sitemap.xml",e||r.base)).pipe(m(n=>Ts(Q("loc",n).map(o=>o.textContent))),ce(()=>R),De([]),w(n=>__md_set("__sitemap",n,sessionStorage,e)))}}function Ei({document$:e,location$:t,viewport$:r}){let n=le();if(location.protocol==="file:")return;"scrollRestoration"in history&&(history.scrollRestoration="manual",v(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}));let o=pe("link[rel=icon]");typeof o!="undefined"&&(o.href=o.href);let i=hr().pipe(m(f=>f.map(u=>`${new URL(u,n.base)}`)),S(f=>v(document.body,"click").pipe(x(u=>!u.metaKey&&!u.ctrlKey),S(u=>{if(u.target instanceof Element){let p=u.target.closest("a");if(p&&!p.target){let l=new URL(p.href);if(l.search="",l.hash="",l.pathname!==location.pathname&&f.includes(l.toString()))return u.preventDefault(),I({url:new URL(p.href)})}}return Se}))),ie()),s=v(window,"popstate").pipe(x(f=>f.state!==null),m(f=>({url:new URL(location.href),offset:f.state})),ie());A(i,s).pipe(B((f,u)=>f.url.href===u.url.href),m(({url:f})=>f)).subscribe(t);let a=t.pipe(J("pathname"),S(f=>mr(f.href).pipe(ce(()=>(pr(f),Se)))),ie());i.pipe(ut(a)).subscribe(({url:f})=>{history.pushState({},"",`${f}`)});let c=new DOMParser;a.pipe(S(f=>f.text()),m(f=>c.parseFromString(f,"text/html"))).subscribe(e),e.pipe(He(1)).subscribe(f=>{for(let u of["title","link[rel=canonical]","meta[name=author]","meta[name=description]","[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...Z("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let p=pe(u),l=pe(u,f);typeof p!="undefined"&&typeof l!="undefined"&&p.replaceWith(l)}}),e.pipe(He(1),m(()=>_e("container")),S(f=>Q("script",f)),Ir(f=>{let u=M("script");if(f.src){for(let p of f.getAttributeNames())u.setAttribute(p,f.getAttribute(p));return f.replaceWith(u),new F(p=>{u.onload=()=>p.complete()})}else return u.textContent=f.textContent,f.replaceWith(u),R})).subscribe(),A(i,s).pipe(ut(e)).subscribe(({url:f,offset:u})=>{f.hash&&!u?Io(f.hash):window.scrollTo(0,(u==null?void 0:u.y)||0)}),r.pipe(Mt(i),Re(250),J("offset")).subscribe(({offset:f})=>{history.replaceState(f,"")}),A(i,s).pipe(Ce(2,1),x(([f,u])=>f.url.pathname===u.url.pathname),m(([,f])=>f)).subscribe(({offset:f})=>{window.scrollTo(0,(f==null?void 0:f.y)||0)})}var As=Ye(tn());var Oi=Ye(tn());function rn(e,t){let r=new RegExp(e.separator,"img"),n=(o,i,s)=>`${i}${s}`;return o=>{o=o.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator})(${o.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(t?(0,Oi.default)(s):s).replace(i,n).replace(/<\/mark>(\s+)]*>/img,"$1")}}function _i(e){return e.split(/"([^"]+)"/g).map((t,r)=>r&1?t.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g," +"):t).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g,"").trim()}function bt(e){return e.type===1}function Ti(e){return e.type===2}function vt(e){return e.type===3}function Rs({config:e,docs:t}){e.lang.length===1&&e.lang[0]==="en"&&(e.lang=[re("search.config.lang")]),e.separator==="[\\s\\-]+"&&(e.separator=re("search.config.separator"));let n={pipeline:re("search.config.pipeline").split(/\s*,\s*/).filter(Boolean),suggestions:Z("search.suggest")};return{config:e,docs:t,options:n}}function Mi(e,t){let r=le(),n=new Worker(e),o=new E,i=Ko(n,{tx$:o}).pipe(m(s=>{if(vt(s))for(let a of s.data.items)for(let c of a)c.location=`${new URL(c.location,r.base)}`;return s}),ie());return ue(t).pipe(m(s=>({type:0,data:Rs(s)}))).subscribe(o.next.bind(o)),{tx$:o,rx$:i}}function Li({document$:e}){let t=le(),r=je(new URL("../versions.json",t.base)).pipe(ce(()=>R)),n=r.pipe(m(o=>{let[,i]=t.base.match(/([^/]+)\/?$/);return o.find(({version:s,aliases:a})=>s===i||a.includes(i))||o[0]}));r.pipe(m(o=>new Map(o.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),S(o=>v(document.body,"click").pipe(x(i=>!i.metaKey&&!i.ctrlKey),ae(n),S(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&o.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&o.get(c)===s?R:(i.preventDefault(),I(c))}}return R}),S(i=>{let{version:s}=o.get(i);return hr(new URL(i)).pipe(m(a=>{let f=Oe().href.replace(t.base,"");return a.includes(f.split("#")[0])?new URL(`../${s}/${f}`,t.base):new URL(i)}))})))).subscribe(o=>pr(o)),Y([r,n]).subscribe(([o,i])=>{K(".md-header__topic").appendChild(ei(o,i))}),e.pipe(S(()=>n)).subscribe(o=>{var s;let i=__md_get("__outdated",sessionStorage);if(i===null){let a=((s=t.version)==null?void 0:s.default)||"latest";i=!o.aliases.includes(a),__md_set("__outdated",i,sessionStorage)}if(i)for(let a of te("outdated"))a.hidden=!1})}function ks(e,{rx$:t}){let r=(__search==null?void 0:__search.transform)||_i,{searchParams:n}=Oe();n.has("q")&&Ke("search",!0);let o=t.pipe(x(bt),oe(1),m(()=>n.get("q")||""));dt("search").pipe(x(a=>!a),oe(1)).subscribe(()=>{let a=new URL(location.href);a.searchParams.delete("q"),history.replaceState({},"",`${a}`)}),o.subscribe(a=>{a&&(e.value=a,e.focus())});let i=nr(e),s=A(v(e,"keyup"),v(e,"focus").pipe(ke(1)),o).pipe(m(()=>r(e.value)),N(""),B());return Y([s,i]).pipe(m(([a,c])=>({value:a,focus:c})),X(1))}function Ai(e,{tx$:t,rx$:r}){let n=new E,o=n.pipe(de(1));return n.pipe(J("value"),m(({value:i})=>({type:2,data:i}))).subscribe(t.next.bind(t)),n.pipe(J("focus")).subscribe(({focus:i})=>{i?(Ke("search",i),e.placeholder=""):e.placeholder=re("search.placeholder")}),v(e.form,"reset").pipe(ee(o)).subscribe(()=>e.focus()),ks(e,{tx$:t,rx$:r}).pipe(w(i=>n.next(i)),C(()=>n.complete()),m(i=>H({ref:e},i)),ie())}function Ci(e,{rx$:t},{query$:r}){let n=new E,o=Ao(e.parentElement).pipe(x(Boolean)),i=K(":scope > :first-child",e),s=K(":scope > :last-child",e),a=t.pipe(x(bt),oe(1));return n.pipe(ae(r),Mt(a)).subscribe(([{items:f},{value:u}])=>{if(u)switch(f.length){case 0:i.textContent=re("search.result.none");break;case 1:i.textContent=re("search.result.one");break;default:i.textContent=re("search.result.other",lr(f.length))}else i.textContent=re("search.result.placeholder")}),n.pipe(w(()=>s.innerHTML=""),S(({items:f})=>A(I(...f.slice(0,10)),I(...f.slice(10)).pipe(Ce(4),Nr(o),S(([u])=>u))))).subscribe(f=>s.appendChild(Jo(f))),t.pipe(x(vt),m(({data:f})=>f)).pipe(w(f=>n.next(f)),C(()=>n.complete()),m(f=>H({ref:e},f)))}function Hs(e,{query$:t}){return t.pipe(m(({value:r})=>{let n=Oe();return n.hash="",n.searchParams.delete("h"),n.searchParams.set("q",r),{url:n}}))}function Ri(e,t){let r=new E;return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),v(e,"click").subscribe(n=>n.preventDefault()),Hs(e,t).pipe(w(n=>r.next(n)),C(()=>r.complete()),m(n=>H({ref:e},n)))}function ki(e,{rx$:t},{keyboard$:r}){let n=new E,o=_e("search-query"),i=A(v(o,"keydown"),v(o,"focus")).pipe(Le(fe),m(()=>o.value),B());return n.pipe(Ze(i),m(([{suggestions:a},c])=>{let f=c.split(/([\s-]+)/);if((a==null?void 0:a.length)&&f[f.length-1]){let u=a[a.length-1];u.startsWith(f[f.length-1])&&(f[f.length-1]=u)}else f.length=0;return f})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(x(({mode:a})=>a==="search")).subscribe(a=>{switch(a.type){case"ArrowRight":e.innerText.length&&o.selectionStart===o.value.length&&(o.value=e.innerText);break}}),t.pipe(x(vt),m(({data:a})=>a)).pipe(w(a=>n.next(a)),C(()=>n.complete()),m(()=>({ref:e})))}function Hi(e,{index$:t,keyboard$:r}){let n=le();try{let o=(__search==null?void 0:__search.worker)||n.search,i=Mi(o,t),s=_e("search-query",e),a=_e("search-result",e),{tx$:c,rx$:f}=i;c.pipe(x(Ti),ut(f.pipe(x(bt))),oe(1)).subscribe(c.next.bind(c)),r.pipe(x(({mode:l})=>l==="search")).subscribe(l=>{let d=Ie();switch(l.type){case"Enter":if(d===s){let h=new Map;for(let b of Q(":first-child [href]",a)){let U=b.firstElementChild;h.set(b,parseFloat(U.getAttribute("data-md-score")))}if(h.size){let[[b]]=[...h].sort(([,U],[,G])=>G-U);b.click()}l.claim()}break;case"Escape":case"Tab":Ke("search",!1),s.blur();break;case"ArrowUp":case"ArrowDown":if(typeof d=="undefined")s.focus();else{let h=[s,...Q(":not(details) > [href], summary, details[open] [href]",a)],b=Math.max(0,(Math.max(0,h.indexOf(d))+h.length+(l.type==="ArrowUp"?-1:1))%h.length);h[b].focus()}l.claim();break;default:s!==Ie()&&s.focus()}}),r.pipe(x(({mode:l})=>l==="global")).subscribe(l=>{switch(l.type){case"f":case"s":case"/":s.focus(),s.select(),l.claim();break}});let u=Ai(s,i),p=Ci(a,i,{query$:u});return A(u,p).pipe(et(...te("search-share",e).map(l=>Ri(l,{query$:u})),...te("search-suggest",e).map(l=>ki(l,i,{keyboard$:r}))))}catch(o){return e.hidden=!0,Se}}function Pi(e,{index$:t,location$:r}){return Y([t,r.pipe(N(Oe()),x(n=>!!n.searchParams.get("h")))]).pipe(m(([n,o])=>rn(n.config,!0)(o.searchParams.get("h"))),m(n=>{var s;let o=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,f=n(c);f.length>c.length&&o.set(a,f)}for(let[a,c]of o){let{childNodes:f}=M("span",null,c);a.replaceWith(...Array.from(f))}return{ref:e,nodes:o}}))}function Ps(e,{viewport$:t,main$:r}){let n=e.parentElement,o=n.offsetTop-n.parentElement.offsetTop;return Y([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(o,Math.max(0,a-i))-o,{height:s,locked:a>=i+o})),B((i,s)=>i.height===s.height&&i.locked===s.locked))}function nn(e,n){var o=n,{header$:t}=o,r=un(o,["header$"]);let i=K(".md-sidebar__scrollwrap",e),{y:s}=qe(i);return P(()=>{let a=new E;return a.pipe(Ae(0,xe),ae(t)).subscribe({next([{height:c},{height:f}]){i.style.height=`${c-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),a.pipe(Le(xe),oe(1)).subscribe(()=>{for(let c of Q(".md-nav__link--active[href]",e)){let f=cr(c);if(typeof f!="undefined"){let u=c.offsetTop-f.offsetTop,{height:p}=he(f);f.scrollTo({top:u-p/2})}}}),Ps(e,r).pipe(w(c=>a.next(c)),C(()=>a.complete()),m(c=>H({ref:e},c)))})}function $i(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return _t(je(`${r}/releases/latest`).pipe(ce(()=>R),m(n=>({version:n.tag_name})),De({})),je(r).pipe(ce(()=>R),m(n=>({stars:n.stargazers_count,forks:n.forks_count})),De({}))).pipe(m(([n,o])=>H(H({},n),o)))}else{let r=`https://api.github.com/users/${e}`;return je(r).pipe(m(n=>({repositories:n.public_repos})),De({}))}}function Ii(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return je(r).pipe(ce(()=>R),m(({star_count:n,forks_count:o})=>({stars:n,forks:o})),De({}))}function ji(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,n]=t;return $i(r,n)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,n]=t;return Ii(r,n)}return R}var $s;function Is(e){return $s||($s=P(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(te("consent").length){let n=__md_get("__consent");if(!(n&&n.github))return R}return ji(e.href).pipe(w(n=>__md_set("__source",n,sessionStorage)))}).pipe(ce(()=>R),x(t=>Object.keys(t).length>0),m(t=>({facts:t})),X(1)))}function Fi(e){let t=K(":scope > :last-child",e);return P(()=>{let r=new E;return r.subscribe(({facts:n})=>{t.appendChild(Xo(n)),t.classList.add("md-source__repository--active")}),Is(e).pipe(w(n=>r.next(n)),C(()=>r.complete()),m(n=>H({ref:e},n)))})}function js(e,{viewport$:t,header$:r}){return ve(document.body).pipe(S(()=>dr(e,{header$:r,viewport$:t})),m(({offset:{y:n}})=>({hidden:n>=10})),J("hidden"))}function Ui(e,t){return P(()=>{let r=new E;return r.subscribe({next({hidden:n}){e.hidden=n},complete(){e.hidden=!1}}),(Z("navigation.tabs.sticky")?I({hidden:!1}):js(e,t)).pipe(w(n=>r.next(n)),C(()=>r.complete()),m(n=>H({ref:e},n)))})}function Fs(e,{viewport$:t,header$:r}){let n=new Map,o=Q("[href^=\\#]",e);for(let a of o){let c=decodeURIComponent(a.hash.substring(1)),f=pe(`[id="${c}"]`);typeof f!="undefined"&&n.set(a,f)}let i=r.pipe(J("height"),m(({height:a})=>{let c=_e("main"),f=K(":scope > :first-child",c);return a+.8*(f.offsetTop-c.offsetTop)}),ie());return ve(document.body).pipe(J("height"),S(a=>P(()=>{let c=[];return I([...n].reduce((f,[u,p])=>{for(;c.length&&n.get(c[c.length-1]).tagName>=p.tagName;)c.pop();let l=p.offsetTop;for(;!l&&p.parentElement;)p=p.parentElement,l=p.offsetTop;return f.set([...c=[...c,u]].reverse(),l)},new Map))}).pipe(m(c=>new Map([...c].sort(([,f],[,u])=>f-u))),Ze(i),S(([c,f])=>t.pipe(Ur(([u,p],{offset:{y:l},size:d})=>{let h=l+d.height>=Math.floor(a.height);for(;p.length;){let[,b]=p[0];if(b-f=l&&!h)p=[u.pop(),...p];else break}return[u,p]},[[],[...c]]),B((u,p)=>u[0]===p[0]&&u[1]===p[1])))))).pipe(m(([a,c])=>({prev:a.map(([f])=>f),next:c.map(([f])=>f)})),N({prev:[],next:[]}),Ce(2,1),m(([a,c])=>a.prev.length{let o=new E,i=o.pipe(de(1));if(o.subscribe(({prev:s,next:a})=>{for(let[c]of a)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[f]]of s.entries())f.classList.add("md-nav__link--passed"),f.classList.toggle("md-nav__link--active",c===s.length-1)}),Z("toc.follow")){let s=A(t.pipe(Re(1),m(()=>{})),t.pipe(Re(250),m(()=>"smooth")));o.pipe(x(({prev:a})=>a.length>0),ae(s)).subscribe(([{prev:a},c])=>{let[f]=a[a.length-1];if(f.offsetHeight){let u=cr(f);if(typeof u!="undefined"){let p=f.offsetTop-u.offsetTop,{height:l}=he(u);u.scrollTo({top:p-l/2,behavior:c})}}})}return Z("navigation.tracking")&&t.pipe(ee(i),J("offset"),Re(250),He(1),ee(n.pipe(He(1))),Tt({delay:250}),ae(o)).subscribe(([,{prev:s}])=>{let a=Oe(),c=s[s.length-1];if(c&&c.length){let[f]=c,{hash:u}=new URL(f.href);a.hash!==u&&(a.hash=u,history.replaceState({},"",`${a}`))}else a.hash="",history.replaceState({},"",`${a}`)}),Fs(e,{viewport$:t,header$:r}).pipe(w(s=>o.next(s)),C(()=>o.complete()),m(s=>H({ref:e},s)))})}function Us(e,{viewport$:t,main$:r,target$:n}){let o=t.pipe(m(({offset:{y:s}})=>s),Ce(2,1),m(([s,a])=>s>a&&a>0),B()),i=r.pipe(m(({active:s})=>s));return Y([i,o]).pipe(m(([s,a])=>!(s&&a)),B(),ee(n.pipe(He(1))),Fr(!0),Tt({delay:250}),m(s=>({hidden:s})))}function Wi(e,{viewport$:t,header$:r,main$:n,target$:o}){let i=new E,s=i.pipe(de(1));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(ee(s),J("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),Us(e,{viewport$:t,main$:n,target$:o}).pipe(w(a=>i.next(a)),C(()=>i.complete()),m(a=>H({ref:e},a)))}function Vi({document$:e,tablet$:t}){e.pipe(S(()=>Q(".md-toggle--indeterminate, [data-md-state=indeterminate]")),w(r=>{r.indeterminate=!0,r.checked=!1}),se(r=>v(r,"change").pipe(Wr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ae(t)).subscribe(([r,n])=>{r.classList.remove("md-toggle--indeterminate"),n&&(r.checked=!1)})}function Ds(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function zi({document$:e}){e.pipe(S(()=>Q("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),x(Ds),se(t=>v(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Ni({viewport$:e,tablet$:t}){Y([dt("search"),t]).pipe(m(([r,n])=>r&&!n),S(r=>I(r).pipe(ke(r?400:100))),ae(e)).subscribe(([r,{offset:{y:n}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${n}px`;else{let o=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",o&&window.scrollTo(0,o)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let n=e[r];typeof n=="string"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?t.insertBefore(this.previousSibling,n):t.replaceChild(n,this)}}}));document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var tt=go(),vr=ko(),gt=jo(),on=Ro(),we=qo(),gr=Kr("(min-width: 960px)"),Ki=Kr("(min-width: 1220px)"),Qi=Fo(),Yi=le(),Bi=document.forms.namedItem("search")?(__search==null?void 0:__search.index)||je(new URL("search/search_index.json",Yi.base)):Se,an=new E;wi({alert$:an});Z("navigation.instant")&&Ei({document$:tt,location$:vr,viewport$:we});var qi;((qi=Yi.version)==null?void 0:qi.provider)==="mike"&&Li({document$:tt});A(vr,gt).pipe(ke(125)).subscribe(()=>{Ke("drawer",!1),Ke("search",!1)});on.pipe(x(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=pe("[href][rel=prev]");typeof t!="undefined"&&t.click();break;case"n":case".":let r=pe("[href][rel=next]");typeof r!="undefined"&&r.click();break}});Vi({document$:tt,tablet$:gr});zi({document$:tt});Ni({viewport$:we,tablet$:gr});var Qe=bi(_e("header"),{viewport$:we}),br=tt.pipe(m(()=>_e("main")),S(e=>yi(e,{viewport$:we,header$:Qe})),X(1)),Ws=A(...te("consent").map(e=>Yo(e,{target$:gt})),...te("dialog").map(e=>hi(e,{alert$:an})),...te("header").map(e=>vi(e,{viewport$:we,header$:Qe,main$:br})),...te("palette").map(e=>xi(e)),...te("search").map(e=>Hi(e,{index$:Bi,keyboard$:on})),...te("source").map(e=>Fi(e))),Vs=P(()=>A(...te("announce").map(e=>Qo(e)),...te("content").map(e=>di(e,{viewport$:we,target$:gt,print$:Qi})),...te("content").map(e=>Z("search.highlight")?Pi(e,{index$:Bi,location$:vr}):R),...te("header-title").map(e=>gi(e,{viewport$:we,header$:Qe})),...te("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Qr(Ki,()=>nn(e,{viewport$:we,header$:Qe,main$:br})):Qr(gr,()=>nn(e,{viewport$:we,header$:Qe,main$:br}))),...te("tabs").map(e=>Ui(e,{viewport$:we,header$:Qe})),...te("toc").map(e=>Di(e,{viewport$:we,header$:Qe,target$:gt})),...te("top").map(e=>Wi(e,{viewport$:we,header$:Qe,main$:br,target$:gt})))),Gi=tt.pipe(S(()=>Vs),et(Ws),X(1));Gi.subscribe();window.document$=tt;window.location$=vr;window.target$=gt;window.keyboard$=on;window.viewport$=we;window.tablet$=gr;window.screen$=Ki;window.print$=Qi;window.alert$=an;window.component$=Gi;})(); +//# sourceMappingURL=bundle.8492ddcf.min.js.map + diff --git a/assets/javascripts/bundle.8492ddcf.min.js.map b/assets/javascripts/bundle.8492ddcf.min.js.map new file mode 100644 index 00000000000..94913558b16 --- /dev/null +++ b/assets/javascripts/bundle.8492ddcf.min.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/url-polyfill/url-polyfill.js", "node_modules/rxjs/node_modules/tslib/tslib.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "node_modules/array-flat-polyfill/index.mjs", "src/assets/javascripts/bundle.ts", "node_modules/unfetch/polyfill/index.js", "node_modules/rxjs/node_modules/tslib/modules/index.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/concatMap.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/sample.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/assets/javascripts/browser/document/index.ts", "src/assets/javascripts/browser/element/_/index.ts", "src/assets/javascripts/browser/element/focus/index.ts", "src/assets/javascripts/browser/element/offset/_/index.ts", "src/assets/javascripts/browser/element/offset/content/index.ts", "node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js", "src/assets/javascripts/browser/element/size/_/index.ts", "src/assets/javascripts/browser/element/size/content/index.ts", "src/assets/javascripts/browser/element/visibility/index.ts", "src/assets/javascripts/browser/toggle/index.ts", "src/assets/javascripts/browser/keyboard/index.ts", "src/assets/javascripts/browser/location/_/index.ts", "src/assets/javascripts/utilities/h/index.ts", "src/assets/javascripts/utilities/string/index.ts", "src/assets/javascripts/browser/location/hash/index.ts", "src/assets/javascripts/browser/media/index.ts", "src/assets/javascripts/browser/request/index.ts", "src/assets/javascripts/browser/script/index.ts", "src/assets/javascripts/browser/viewport/offset/index.ts", "src/assets/javascripts/browser/viewport/size/index.ts", "src/assets/javascripts/browser/viewport/_/index.ts", "src/assets/javascripts/browser/viewport/at/index.ts", "src/assets/javascripts/browser/worker/index.ts", "src/assets/javascripts/_/index.ts", "src/assets/javascripts/components/_/index.ts", "src/assets/javascripts/components/announce/index.ts", "src/assets/javascripts/components/consent/index.ts", "src/assets/javascripts/components/content/code/_/index.ts", "src/assets/javascripts/templates/tooltip/index.tsx", "src/assets/javascripts/templates/annotation/index.tsx", "src/assets/javascripts/templates/clipboard/index.tsx", "src/assets/javascripts/templates/search/index.tsx", "src/assets/javascripts/templates/source/index.tsx", "src/assets/javascripts/templates/tabbed/index.tsx", "src/assets/javascripts/templates/table/index.tsx", "src/assets/javascripts/templates/version/index.tsx", "src/assets/javascripts/components/content/annotation/_/index.ts", "src/assets/javascripts/components/content/annotation/list/index.ts", "src/assets/javascripts/components/content/code/mermaid/index.ts", "src/assets/javascripts/components/content/details/index.ts", "src/assets/javascripts/components/content/table/index.ts", "src/assets/javascripts/components/content/tabs/index.ts", "src/assets/javascripts/components/content/_/index.ts", "src/assets/javascripts/components/dialog/index.ts", "src/assets/javascripts/components/header/_/index.ts", "src/assets/javascripts/components/header/title/index.ts", "src/assets/javascripts/components/main/index.ts", "src/assets/javascripts/components/palette/index.ts", "src/assets/javascripts/integrations/clipboard/index.ts", "src/assets/javascripts/integrations/sitemap/index.ts", "src/assets/javascripts/integrations/instant/index.ts", "src/assets/javascripts/integrations/search/document/index.ts", "src/assets/javascripts/integrations/search/highlighter/index.ts", "src/assets/javascripts/integrations/search/query/transform/index.ts", "src/assets/javascripts/integrations/search/worker/message/index.ts", "src/assets/javascripts/integrations/search/worker/_/index.ts", "src/assets/javascripts/integrations/version/index.ts", "src/assets/javascripts/components/search/query/index.ts", "src/assets/javascripts/components/search/result/index.ts", "src/assets/javascripts/components/search/share/index.ts", "src/assets/javascripts/components/search/suggest/index.ts", "src/assets/javascripts/components/search/_/index.ts", "src/assets/javascripts/components/search/highlight/index.ts", "src/assets/javascripts/components/sidebar/index.ts", "src/assets/javascripts/components/source/facts/github/index.ts", "src/assets/javascripts/components/source/facts/gitlab/index.ts", "src/assets/javascripts/components/source/facts/_/index.ts", "src/assets/javascripts/components/source/_/index.ts", "src/assets/javascripts/components/tabs/index.ts", "src/assets/javascripts/components/toc/index.ts", "src/assets/javascripts/components/top/index.ts", "src/assets/javascripts/patches/indeterminate/index.ts", "src/assets/javascripts/patches/scrollfix/index.ts", "src/assets/javascripts/patches/scrolllock/index.ts", "src/assets/javascripts/polyfills/index.ts"], + "sourceRoot": "../../../..", + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if (iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(String(value).replace(/\\+/g, ' '));\r\n };\r\n\r\n var polyfillURLSearchParams = function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { writable: true, value: {} });\r\n var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\r\n }\r\n } else if (searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(name, value);\r\n });\r\n } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if (name in this._entries) {\r\n this._entries[name].push(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [String(value)];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for (var name in this._entries) {\r\n if (this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for (var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n if (iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n var checkIfURLSearchParamsSupported = function() {\r\n try {\r\n var URLSearchParams = global.URLSearchParams;\r\n\r\n return (\r\n (new URLSearchParams('?a=1').toString() === 'a=1') &&\r\n (typeof URLSearchParams.prototype.set === 'function') &&\r\n (typeof URLSearchParams.prototype.entries === 'function')\r\n );\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n if (!checkIfURLSearchParamsSupported()) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = global.URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\r\n }\r\n\r\n if (typeof proto._fromString !== 'function') {\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for (var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n });\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new global.URL('b', 'http://a');\r\n u.pathname = 'c d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if (typeof url !== 'string') url = String(url);\r\n if (base && typeof base !== 'string') base = String(base);\r\n\r\n // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n base = base.toLowerCase();\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\r\n\r\n var inputElement = doc.createElement('input');\r\n inputElement.type = 'url';\r\n inputElement.value = url;\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || (!inputElement.checkValidity() && !base)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n\r\n\r\n // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new global.URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href': {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/, '');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname': {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = { 'http:': 80, 'https:': 443, 'ftp:': 21 }[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== '';\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if (!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if ((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch (e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "Array.prototype.flat||Object.defineProperty(Array.prototype,\"flat\",{configurable:!0,value:function r(){var t=isNaN(arguments[0])?1:Number(arguments[0]);return t?Array.prototype.reduce.call(this,function(a,e){return Array.isArray(e)?a.push.apply(a,r.call(e,t-1)):a.push(e),a},[]):Array.prototype.slice.call(this)},writable:!0}),Array.prototype.flatMap||Object.defineProperty(Array.prototype,\"flatMap\",{configurable:!0,value:function(r){return Array.prototype.map.apply(this,arguments).flat()},writable:!0})\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"array-flat-polyfill\"\nimport \"focus-visible\"\nimport \"unfetch/polyfill\"\nimport \"url-polyfill\"\n\nimport {\n EMPTY,\n NEVER,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getOptionalElement,\n requestJSON,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantLoading,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget()\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? __search?.index || requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up instant loading, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantLoading({ document$, location$, viewport$ })\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"[href][rel=prev]\")\n if (typeof prev !== \"undefined\")\n prev.click()\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"[href][rel=next]\")\n if (typeof next !== \"undefined\")\n next.click()\n break\n }\n })\n\n/* Set up patches */\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, { viewport$, header$, target$ })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.component$ = component$ /* Component observable */\n", "self.fetch||(self.fetch=function(e,n){return n=n||{},new Promise(function(t,s){var r=new XMLHttpRequest,o=[],u=[],i={},a=function(){return{ok:2==(r.status/100|0),statusText:r.statusText,status:r.status,url:r.responseURL,text:function(){return Promise.resolve(r.responseText)},json:function(){return Promise.resolve(r.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([r.response]))},clone:a,headers:{keys:function(){return o},entries:function(){return u},get:function(e){return i[e.toLowerCase()]},has:function(e){return e.toLowerCase()in i}}}};for(var c in r.open(n.method||\"get\",e,!0),r.onload=function(){r.getAllResponseHeaders().replace(/^(.*?):[^\\S\\n]*([\\s\\S]*?)$/gm,function(e,n,t){o.push(n=n.toLowerCase()),u.push([n,t]),i[n]=i[n]?i[n]+\",\"+t:t}),t(a())},r.onerror=s,r.withCredentials=\"include\"==n.credentials,n.headers)r.setRequestHeader(c,n.headers[c]);r.send(n.body||null)})});\n", "import tslib from '../tslib.js';\r\nconst {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n} = tslib;\r\nexport {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n};\r\n", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n ReplaySubject,\n Subject,\n fromEvent\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch document\n *\n * Documents are implemented as subjects, so all downstream observables are\n * automatically updated when a new document is emitted.\n *\n * @returns Document subject\n */\nexport function watchDocument(): Subject {\n const document$ = new ReplaySubject(1)\n fromEvent(document, \"DOMContentLoaded\", { once: true })\n .subscribe(() => document$.next(document))\n\n /* Return document */\n return document$\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve all elements matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Elements\n */\nexport function getElements(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T][]\n\nexport function getElements(\n selector: string, node?: ParentNode\n): T[]\n\nexport function getElements(\n selector: string, node: ParentNode = document\n): T[] {\n return Array.from(node.querySelectorAll(selector))\n}\n\n/**\n * Retrieve an element matching a query selector or throw a reference error\n *\n * Note that this function assumes that the element is present. If unsure if an\n * element is existent, use the `getOptionalElement` function instead.\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Element\n */\nexport function getElement(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T]\n\nexport function getElement(\n selector: string, node?: ParentNode\n): T\n\nexport function getElement(\n selector: string, node: ParentNode = document\n): T {\n const el = getOptionalElement(selector, node)\n if (typeof el === \"undefined\")\n throw new ReferenceError(\n `Missing element: expected \"${selector}\" to be present`\n )\n\n /* Return element */\n return el\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Retrieve an optional element matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Element or nothing\n */\nexport function getOptionalElement(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T] | undefined\n\nexport function getOptionalElement(\n selector: string, node?: ParentNode\n): T | undefined\n\nexport function getOptionalElement(\n selector: string, node: ParentNode = document\n): T | undefined {\n return node.querySelector(selector) || undefined\n}\n\n/**\n * Retrieve the currently active element\n *\n * @returns Element or nothing\n */\nexport function getActiveElement(): HTMLElement | undefined {\n return document.activeElement instanceof HTMLElement\n ? document.activeElement || undefined\n : undefined\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n debounceTime,\n distinctUntilChanged,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\nimport { getActiveElement } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch element focus\n *\n * Previously, this function used `focus` and `blur` events to determine whether\n * an element is focused, but this doesn't work if there are focusable elements\n * within the elements itself. A better solutions are `focusin` and `focusout`\n * events, which bubble up the tree and allow for more fine-grained control.\n *\n * `debounceTime` is necessary, because when a focus change happens inside an\n * element, the observable would first emit `false` and then `true` again.\n *\n * @param el - Element\n *\n * @returns Element focus observable\n */\nexport function watchElementFocus(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(document.body, \"focusin\"),\n fromEvent(document.body, \"focusout\")\n )\n .pipe(\n debounceTime(1),\n map(() => {\n const active = getActiveElement()\n return typeof active !== \"undefined\"\n ? el.contains(active)\n : false\n }),\n startWith(el === getActiveElement()),\n distinctUntilChanged()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n animationFrameScheduler,\n auditTime,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementOffset {\n x: number /* Horizontal offset */\n y: number /* Vertical offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element offset\n *\n * @param el - Element\n *\n * @returns Element offset\n */\nexport function getElementOffset(\n el: HTMLElement\n): ElementOffset {\n return {\n x: el.offsetLeft,\n y: el.offsetTop\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element offset\n *\n * @param el - Element\n *\n * @returns Element offset observable\n */\nexport function watchElementOffset(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(window, \"load\"),\n fromEvent(window, \"resize\")\n )\n .pipe(\n auditTime(0, animationFrameScheduler),\n map(() => getElementOffset(el)),\n startWith(getElementOffset(el))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n animationFrameScheduler,\n auditTime,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\nimport { ElementOffset } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element content offset (= scroll offset)\n *\n * @param el - Element\n *\n * @returns Element content offset\n */\nexport function getElementContentOffset(\n el: HTMLElement\n): ElementOffset {\n return {\n x: el.scrollLeft,\n y: el.scrollTop\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element content offset\n *\n * @param el - Element\n *\n * @returns Element content offset observable\n */\nexport function watchElementContentOffset(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(el, \"scroll\"),\n fromEvent(window, \"resize\")\n )\n .pipe(\n auditTime(0, animationFrameScheduler),\n map(() => getElementContentOffset(el)),\n startWith(getElementContentOffset(el))\n )\n}\n", "/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\r\n/* eslint-disable require-jsdoc, valid-jsdoc */\r\nvar MapShim = (function () {\r\n if (typeof Map !== 'undefined') {\r\n return Map;\r\n }\r\n /**\r\n * Returns index in provided array that matches the specified key.\r\n *\r\n * @param {Array} arr\r\n * @param {*} key\r\n * @returns {number}\r\n */\r\n function getIndex(arr, key) {\r\n var result = -1;\r\n arr.some(function (entry, index) {\r\n if (entry[0] === key) {\r\n result = index;\r\n return true;\r\n }\r\n return false;\r\n });\r\n return result;\r\n }\r\n return /** @class */ (function () {\r\n function class_1() {\r\n this.__entries__ = [];\r\n }\r\n Object.defineProperty(class_1.prototype, \"size\", {\r\n /**\r\n * @returns {boolean}\r\n */\r\n get: function () {\r\n return this.__entries__.length;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @param {*} key\r\n * @returns {*}\r\n */\r\n class_1.prototype.get = function (key) {\r\n var index = getIndex(this.__entries__, key);\r\n var entry = this.__entries__[index];\r\n return entry && entry[1];\r\n };\r\n /**\r\n * @param {*} key\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\n class_1.prototype.set = function (key, value) {\r\n var index = getIndex(this.__entries__, key);\r\n if (~index) {\r\n this.__entries__[index][1] = value;\r\n }\r\n else {\r\n this.__entries__.push([key, value]);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.delete = function (key) {\r\n var entries = this.__entries__;\r\n var index = getIndex(entries, key);\r\n if (~index) {\r\n entries.splice(index, 1);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.has = function (key) {\r\n return !!~getIndex(this.__entries__, key);\r\n };\r\n /**\r\n * @returns {void}\r\n */\r\n class_1.prototype.clear = function () {\r\n this.__entries__.splice(0);\r\n };\r\n /**\r\n * @param {Function} callback\r\n * @param {*} [ctx=null]\r\n * @returns {void}\r\n */\r\n class_1.prototype.forEach = function (callback, ctx) {\r\n if (ctx === void 0) { ctx = null; }\r\n for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\r\n var entry = _a[_i];\r\n callback.call(ctx, entry[1], entry[0]);\r\n }\r\n };\r\n return class_1;\r\n }());\r\n})();\n\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\r\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;\n\n// Returns global object of a current environment.\r\nvar global$1 = (function () {\r\n if (typeof global !== 'undefined' && global.Math === Math) {\r\n return global;\r\n }\r\n if (typeof self !== 'undefined' && self.Math === Math) {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined' && window.Math === Math) {\r\n return window;\r\n }\r\n // eslint-disable-next-line no-new-func\r\n return Function('return this')();\r\n})();\n\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\r\nvar requestAnimationFrame$1 = (function () {\r\n if (typeof requestAnimationFrame === 'function') {\r\n // It's required to use a bounded function because IE sometimes throws\r\n // an \"Invalid calling object\" error if rAF is invoked without the global\r\n // object on the left hand side.\r\n return requestAnimationFrame.bind(global$1);\r\n }\r\n return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };\r\n})();\n\n// Defines minimum timeout before adding a trailing call.\r\nvar trailingTimeout = 2;\r\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\r\nfunction throttle (callback, delay) {\r\n var leadingCall = false, trailingCall = false, lastCallTime = 0;\r\n /**\r\n * Invokes the original callback function and schedules new invocation if\r\n * the \"proxy\" was called during current request.\r\n *\r\n * @returns {void}\r\n */\r\n function resolvePending() {\r\n if (leadingCall) {\r\n leadingCall = false;\r\n callback();\r\n }\r\n if (trailingCall) {\r\n proxy();\r\n }\r\n }\r\n /**\r\n * Callback invoked after the specified delay. It will further postpone\r\n * invocation of the original function delegating it to the\r\n * requestAnimationFrame.\r\n *\r\n * @returns {void}\r\n */\r\n function timeoutCallback() {\r\n requestAnimationFrame$1(resolvePending);\r\n }\r\n /**\r\n * Schedules invocation of the original function.\r\n *\r\n * @returns {void}\r\n */\r\n function proxy() {\r\n var timeStamp = Date.now();\r\n if (leadingCall) {\r\n // Reject immediately following calls.\r\n if (timeStamp - lastCallTime < trailingTimeout) {\r\n return;\r\n }\r\n // Schedule new call to be in invoked when the pending one is resolved.\r\n // This is important for \"transitions\" which never actually start\r\n // immediately so there is a chance that we might miss one if change\r\n // happens amids the pending invocation.\r\n trailingCall = true;\r\n }\r\n else {\r\n leadingCall = true;\r\n trailingCall = false;\r\n setTimeout(timeoutCallback, delay);\r\n }\r\n lastCallTime = timeStamp;\r\n }\r\n return proxy;\r\n}\n\n// Minimum delay before invoking the update of observers.\r\nvar REFRESH_DELAY = 20;\r\n// A list of substrings of CSS properties used to find transition events that\r\n// might affect dimensions of observed elements.\r\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];\r\n// Check if MutationObserver is available.\r\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\r\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\r\nvar ResizeObserverController = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserverController.\r\n *\r\n * @private\r\n */\r\n function ResizeObserverController() {\r\n /**\r\n * Indicates whether DOM listeners have been added.\r\n *\r\n * @private {boolean}\r\n */\r\n this.connected_ = false;\r\n /**\r\n * Tells that controller has subscribed for Mutation Events.\r\n *\r\n * @private {boolean}\r\n */\r\n this.mutationEventsAdded_ = false;\r\n /**\r\n * Keeps reference to the instance of MutationObserver.\r\n *\r\n * @private {MutationObserver}\r\n */\r\n this.mutationsObserver_ = null;\r\n /**\r\n * A list of connected observers.\r\n *\r\n * @private {Array}\r\n */\r\n this.observers_ = [];\r\n this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\r\n this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\r\n }\r\n /**\r\n * Adds observer to observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be added.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.addObserver = function (observer) {\r\n if (!~this.observers_.indexOf(observer)) {\r\n this.observers_.push(observer);\r\n }\r\n // Add listeners if they haven't been added yet.\r\n if (!this.connected_) {\r\n this.connect_();\r\n }\r\n };\r\n /**\r\n * Removes observer from observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.removeObserver = function (observer) {\r\n var observers = this.observers_;\r\n var index = observers.indexOf(observer);\r\n // Remove observer if it's present in registry.\r\n if (~index) {\r\n observers.splice(index, 1);\r\n }\r\n // Remove listeners if controller has no connected observers.\r\n if (!observers.length && this.connected_) {\r\n this.disconnect_();\r\n }\r\n };\r\n /**\r\n * Invokes the update of observers. It will continue running updates insofar\r\n * it detects changes.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.refresh = function () {\r\n var changesDetected = this.updateObservers_();\r\n // Continue running updates if changes have been detected as there might\r\n // be future ones caused by CSS transitions.\r\n if (changesDetected) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Updates every observer from observers list and notifies them of queued\r\n * entries.\r\n *\r\n * @private\r\n * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n * dimensions of it's elements.\r\n */\r\n ResizeObserverController.prototype.updateObservers_ = function () {\r\n // Collect observers that have active observations.\r\n var activeObservers = this.observers_.filter(function (observer) {\r\n return observer.gatherActive(), observer.hasActive();\r\n });\r\n // Deliver notifications in a separate cycle in order to avoid any\r\n // collisions between observers, e.g. when multiple instances of\r\n // ResizeObserver are tracking the same element and the callback of one\r\n // of them changes content dimensions of the observed target. Sometimes\r\n // this may result in notifications being blocked for the rest of observers.\r\n activeObservers.forEach(function (observer) { return observer.broadcastActive(); });\r\n return activeObservers.length > 0;\r\n };\r\n /**\r\n * Initializes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.connect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already added.\r\n if (!isBrowser || this.connected_) {\r\n return;\r\n }\r\n // Subscription to the \"Transitionend\" event is used as a workaround for\r\n // delayed transitions. This way it's possible to capture at least the\r\n // final state of an element.\r\n document.addEventListener('transitionend', this.onTransitionEnd_);\r\n window.addEventListener('resize', this.refresh);\r\n if (mutationObserverSupported) {\r\n this.mutationsObserver_ = new MutationObserver(this.refresh);\r\n this.mutationsObserver_.observe(document, {\r\n attributes: true,\r\n childList: true,\r\n characterData: true,\r\n subtree: true\r\n });\r\n }\r\n else {\r\n document.addEventListener('DOMSubtreeModified', this.refresh);\r\n this.mutationEventsAdded_ = true;\r\n }\r\n this.connected_ = true;\r\n };\r\n /**\r\n * Removes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.disconnect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already removed.\r\n if (!isBrowser || !this.connected_) {\r\n return;\r\n }\r\n document.removeEventListener('transitionend', this.onTransitionEnd_);\r\n window.removeEventListener('resize', this.refresh);\r\n if (this.mutationsObserver_) {\r\n this.mutationsObserver_.disconnect();\r\n }\r\n if (this.mutationEventsAdded_) {\r\n document.removeEventListener('DOMSubtreeModified', this.refresh);\r\n }\r\n this.mutationsObserver_ = null;\r\n this.mutationEventsAdded_ = false;\r\n this.connected_ = false;\r\n };\r\n /**\r\n * \"Transitionend\" event handler.\r\n *\r\n * @private\r\n * @param {TransitionEvent} event\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\r\n var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;\r\n // Detect whether transition may affect dimensions of an element.\r\n var isReflowProperty = transitionKeys.some(function (key) {\r\n return !!~propertyName.indexOf(key);\r\n });\r\n if (isReflowProperty) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Returns instance of the ResizeObserverController.\r\n *\r\n * @returns {ResizeObserverController}\r\n */\r\n ResizeObserverController.getInstance = function () {\r\n if (!this.instance_) {\r\n this.instance_ = new ResizeObserverController();\r\n }\r\n return this.instance_;\r\n };\r\n /**\r\n * Holds reference to the controller's instance.\r\n *\r\n * @private {ResizeObserverController}\r\n */\r\n ResizeObserverController.instance_ = null;\r\n return ResizeObserverController;\r\n}());\n\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\r\nvar defineConfigurable = (function (target, props) {\r\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n Object.defineProperty(target, key, {\r\n value: props[key],\r\n enumerable: false,\r\n writable: false,\r\n configurable: true\r\n });\r\n }\r\n return target;\r\n});\n\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\r\nvar getWindowOf = (function (target) {\r\n // Assume that the element is an instance of Node, which means that it\r\n // has the \"ownerDocument\" property from which we can retrieve a\r\n // corresponding global object.\r\n var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;\r\n // Return the local global object if it's not possible extract one from\r\n // provided element.\r\n return ownerGlobal || global$1;\r\n});\n\n// Placeholder of an empty content rectangle.\r\nvar emptyRect = createRectInit(0, 0, 0, 0);\r\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\r\nfunction toFloat(value) {\r\n return parseFloat(value) || 0;\r\n}\r\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\r\nfunction getBordersSize(styles) {\r\n var positions = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n positions[_i - 1] = arguments[_i];\r\n }\r\n return positions.reduce(function (size, position) {\r\n var value = styles['border-' + position + '-width'];\r\n return size + toFloat(value);\r\n }, 0);\r\n}\r\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\r\nfunction getPaddings(styles) {\r\n var positions = ['top', 'right', 'bottom', 'left'];\r\n var paddings = {};\r\n for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\r\n var position = positions_1[_i];\r\n var value = styles['padding-' + position];\r\n paddings[position] = toFloat(value);\r\n }\r\n return paddings;\r\n}\r\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n * to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getSVGContentRect(target) {\r\n var bbox = target.getBBox();\r\n return createRectInit(0, 0, bbox.width, bbox.height);\r\n}\r\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getHTMLElementContentRect(target) {\r\n // Client width & height properties can't be\r\n // used exclusively as they provide rounded values.\r\n var clientWidth = target.clientWidth, clientHeight = target.clientHeight;\r\n // By this condition we can catch all non-replaced inline, hidden and\r\n // detached elements. Though elements with width & height properties less\r\n // than 0.5 will be discarded as well.\r\n //\r\n // Without it we would need to implement separate methods for each of\r\n // those cases and it's not possible to perform a precise and performance\r\n // effective test for hidden elements. E.g. even jQuery's ':visible' filter\r\n // gives wrong results for elements with width & height less than 0.5.\r\n if (!clientWidth && !clientHeight) {\r\n return emptyRect;\r\n }\r\n var styles = getWindowOf(target).getComputedStyle(target);\r\n var paddings = getPaddings(styles);\r\n var horizPad = paddings.left + paddings.right;\r\n var vertPad = paddings.top + paddings.bottom;\r\n // Computed styles of width & height are being used because they are the\r\n // only dimensions available to JS that contain non-rounded values. It could\r\n // be possible to utilize the getBoundingClientRect if only it's data wasn't\r\n // affected by CSS transformations let alone paddings, borders and scroll bars.\r\n var width = toFloat(styles.width), height = toFloat(styles.height);\r\n // Width & height include paddings and borders when the 'border-box' box\r\n // model is applied (except for IE).\r\n if (styles.boxSizing === 'border-box') {\r\n // Following conditions are required to handle Internet Explorer which\r\n // doesn't include paddings and borders to computed CSS dimensions.\r\n //\r\n // We can say that if CSS dimensions + paddings are equal to the \"client\"\r\n // properties then it's either IE, and thus we don't need to subtract\r\n // anything, or an element merely doesn't have paddings/borders styles.\r\n if (Math.round(width + horizPad) !== clientWidth) {\r\n width -= getBordersSize(styles, 'left', 'right') + horizPad;\r\n }\r\n if (Math.round(height + vertPad) !== clientHeight) {\r\n height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\r\n }\r\n }\r\n // Following steps can't be applied to the document's root element as its\r\n // client[Width/Height] properties represent viewport area of the window.\r\n // Besides, it's as well not necessary as the itself neither has\r\n // rendered scroll bars nor it can be clipped.\r\n if (!isDocumentElement(target)) {\r\n // In some browsers (only in Firefox, actually) CSS width & height\r\n // include scroll bars size which can be removed at this step as scroll\r\n // bars are the only difference between rounded dimensions + paddings\r\n // and \"client\" properties, though that is not always true in Chrome.\r\n var vertScrollbar = Math.round(width + horizPad) - clientWidth;\r\n var horizScrollbar = Math.round(height + vertPad) - clientHeight;\r\n // Chrome has a rather weird rounding of \"client\" properties.\r\n // E.g. for an element with content width of 314.2px it sometimes gives\r\n // the client width of 315px and for the width of 314.7px it may give\r\n // 314px. And it doesn't happen all the time. So just ignore this delta\r\n // as a non-relevant.\r\n if (Math.abs(vertScrollbar) !== 1) {\r\n width -= vertScrollbar;\r\n }\r\n if (Math.abs(horizScrollbar) !== 1) {\r\n height -= horizScrollbar;\r\n }\r\n }\r\n return createRectInit(paddings.left, paddings.top, width, height);\r\n}\r\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nvar isSVGGraphicsElement = (function () {\r\n // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\r\n // interface.\r\n if (typeof SVGGraphicsElement !== 'undefined') {\r\n return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };\r\n }\r\n // If it's so, then check that element is at least an instance of the\r\n // SVGElement and that it has the \"getBBox\" method.\r\n // eslint-disable-next-line no-extra-parens\r\n return function (target) { return (target instanceof getWindowOf(target).SVGElement &&\r\n typeof target.getBBox === 'function'); };\r\n})();\r\n/**\r\n * Checks whether provided element is a document element ().\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nfunction isDocumentElement(target) {\r\n return target === getWindowOf(target).document.documentElement;\r\n}\r\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getContentRect(target) {\r\n if (!isBrowser) {\r\n return emptyRect;\r\n }\r\n if (isSVGGraphicsElement(target)) {\r\n return getSVGContentRect(target);\r\n }\r\n return getHTMLElementContentRect(target);\r\n}\r\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\r\nfunction createReadOnlyRect(_a) {\r\n var x = _a.x, y = _a.y, width = _a.width, height = _a.height;\r\n // If DOMRectReadOnly is available use it as a prototype for the rectangle.\r\n var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\r\n var rect = Object.create(Constr.prototype);\r\n // Rectangle's properties are not writable and non-enumerable.\r\n defineConfigurable(rect, {\r\n x: x, y: y, width: width, height: height,\r\n top: y,\r\n right: x + width,\r\n bottom: height + y,\r\n left: x\r\n });\r\n return rect;\r\n}\r\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction createRectInit(x, y, width, height) {\r\n return { x: x, y: y, width: width, height: height };\r\n}\n\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\r\nvar ResizeObservation = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObservation.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n */\r\n function ResizeObservation(target) {\r\n /**\r\n * Broadcasted width of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastWidth = 0;\r\n /**\r\n * Broadcasted height of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastHeight = 0;\r\n /**\r\n * Reference to the last observed content rectangle.\r\n *\r\n * @private {DOMRectInit}\r\n */\r\n this.contentRect_ = createRectInit(0, 0, 0, 0);\r\n this.target = target;\r\n }\r\n /**\r\n * Updates content rectangle and tells whether it's width or height properties\r\n * have changed since the last broadcast.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObservation.prototype.isActive = function () {\r\n var rect = getContentRect(this.target);\r\n this.contentRect_ = rect;\r\n return (rect.width !== this.broadcastWidth ||\r\n rect.height !== this.broadcastHeight);\r\n };\r\n /**\r\n * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n * from the corresponding properties of the last observed content rectangle.\r\n *\r\n * @returns {DOMRectInit} Last observed content rectangle.\r\n */\r\n ResizeObservation.prototype.broadcastRect = function () {\r\n var rect = this.contentRect_;\r\n this.broadcastWidth = rect.width;\r\n this.broadcastHeight = rect.height;\r\n return rect;\r\n };\r\n return ResizeObservation;\r\n}());\n\nvar ResizeObserverEntry = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObserverEntry.\r\n *\r\n * @param {Element} target - Element that is being observed.\r\n * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n */\r\n function ResizeObserverEntry(target, rectInit) {\r\n var contentRect = createReadOnlyRect(rectInit);\r\n // According to the specification following properties are not writable\r\n // and are also not enumerable in the native implementation.\r\n //\r\n // Property accessors are not being used as they'd require to define a\r\n // private WeakMap storage which may cause memory leaks in browsers that\r\n // don't support this type of collections.\r\n defineConfigurable(this, { target: target, contentRect: contentRect });\r\n }\r\n return ResizeObserverEntry;\r\n}());\n\nvar ResizeObserverSPI = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n * when one of the observed elements changes it's content dimensions.\r\n * @param {ResizeObserverController} controller - Controller instance which\r\n * is responsible for the updates of observer.\r\n * @param {ResizeObserver} callbackCtx - Reference to the public\r\n * ResizeObserver instance which will be passed to callback function.\r\n */\r\n function ResizeObserverSPI(callback, controller, callbackCtx) {\r\n /**\r\n * Collection of resize observations that have detected changes in dimensions\r\n * of elements.\r\n *\r\n * @private {Array}\r\n */\r\n this.activeObservations_ = [];\r\n /**\r\n * Registry of the ResizeObservation instances.\r\n *\r\n * @private {Map}\r\n */\r\n this.observations_ = new MapShim();\r\n if (typeof callback !== 'function') {\r\n throw new TypeError('The callback provided as parameter 1 is not a function.');\r\n }\r\n this.callback_ = callback;\r\n this.controller_ = controller;\r\n this.callbackCtx_ = callbackCtx;\r\n }\r\n /**\r\n * Starts observing provided element.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.observe = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is already being observed.\r\n if (observations.has(target)) {\r\n return;\r\n }\r\n observations.set(target, new ResizeObservation(target));\r\n this.controller_.addObserver(this);\r\n // Force the update of observations.\r\n this.controller_.refresh();\r\n };\r\n /**\r\n * Stops observing provided element.\r\n *\r\n * @param {Element} target - Element to stop observing.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.unobserve = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is not being observed.\r\n if (!observations.has(target)) {\r\n return;\r\n }\r\n observations.delete(target);\r\n if (!observations.size) {\r\n this.controller_.removeObserver(this);\r\n }\r\n };\r\n /**\r\n * Stops observing all elements.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.disconnect = function () {\r\n this.clearActive();\r\n this.observations_.clear();\r\n this.controller_.removeObserver(this);\r\n };\r\n /**\r\n * Collects observation instances the associated element of which has changed\r\n * it's content rectangle.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.gatherActive = function () {\r\n var _this = this;\r\n this.clearActive();\r\n this.observations_.forEach(function (observation) {\r\n if (observation.isActive()) {\r\n _this.activeObservations_.push(observation);\r\n }\r\n });\r\n };\r\n /**\r\n * Invokes initial callback function with a list of ResizeObserverEntry\r\n * instances collected from active resize observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.broadcastActive = function () {\r\n // Do nothing if observer doesn't have active observations.\r\n if (!this.hasActive()) {\r\n return;\r\n }\r\n var ctx = this.callbackCtx_;\r\n // Create ResizeObserverEntry instance for every active observation.\r\n var entries = this.activeObservations_.map(function (observation) {\r\n return new ResizeObserverEntry(observation.target, observation.broadcastRect());\r\n });\r\n this.callback_.call(ctx, entries, ctx);\r\n this.clearActive();\r\n };\r\n /**\r\n * Clears the collection of active observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.clearActive = function () {\r\n this.activeObservations_.splice(0);\r\n };\r\n /**\r\n * Tells whether observer has active observations.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObserverSPI.prototype.hasActive = function () {\r\n return this.activeObservations_.length > 0;\r\n };\r\n return ResizeObserverSPI;\r\n}());\n\n// Registry of internal observers. If WeakMap is not available use current shim\r\n// for the Map collection as it has all required methods and because WeakMap\r\n// can't be fully polyfilled anyway.\r\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\r\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\r\nvar ResizeObserver = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n * dimensions of the observed elements change.\r\n */\r\n function ResizeObserver(callback) {\r\n if (!(this instanceof ResizeObserver)) {\r\n throw new TypeError('Cannot call a class as a function.');\r\n }\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n var controller = ResizeObserverController.getInstance();\r\n var observer = new ResizeObserverSPI(callback, controller, this);\r\n observers.set(this, observer);\r\n }\r\n return ResizeObserver;\r\n}());\r\n// Expose public methods of ResizeObserver.\r\n[\r\n 'observe',\r\n 'unobserve',\r\n 'disconnect'\r\n].forEach(function (method) {\r\n ResizeObserver.prototype[method] = function () {\r\n var _a;\r\n return (_a = observers.get(this))[method].apply(_a, arguments);\r\n };\r\n});\n\nvar index = (function () {\r\n // Export existing implementation if available.\r\n if (typeof global$1.ResizeObserver !== 'undefined') {\r\n return global$1.ResizeObserver;\r\n }\r\n return ResizeObserver;\r\n})();\n\nexport default index;\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ResizeObserver from \"resize-observer-polyfill\"\nimport {\n NEVER,\n Observable,\n Subject,\n defer,\n filter,\n finalize,\n map,\n merge,\n of,\n shareReplay,\n startWith,\n switchMap,\n tap\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementSize {\n width: number /* Element width */\n height: number /* Element height */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Resize observer entry subject\n */\nconst entry$ = new Subject()\n\n/**\n * Resize observer observable\n *\n * This observable will create a `ResizeObserver` on the first subscription\n * and will automatically terminate it when there are no more subscribers.\n * It's quite important to centralize observation in a single `ResizeObserver`,\n * as the performance difference can be quite dramatic, as the link shows.\n *\n * @see https://bit.ly/3iIYfEm - Google Groups on performance\n */\nconst observer$ = defer(() => of(\n new ResizeObserver(entries => {\n for (const entry of entries)\n entry$.next(entry)\n })\n))\n .pipe(\n switchMap(observer => merge(NEVER, of(observer))\n .pipe(\n finalize(() => observer.disconnect())\n )\n ),\n shareReplay(1)\n )\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element size\n *\n * @param el - Element\n *\n * @returns Element size\n */\nexport function getElementSize(\n el: HTMLElement\n): ElementSize {\n return {\n width: el.offsetWidth,\n height: el.offsetHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element size\n *\n * This function returns an observable that subscribes to a single internal\n * instance of `ResizeObserver` upon subscription, and emit resize events until\n * termination. Note that this function should not be called with the same\n * element twice, as the first unsubscription will terminate observation.\n *\n * Sadly, we can't use the `DOMRect` objects returned by the observer, because\n * we need the emitted values to be consistent with `getElementSize`, which will\n * return the used values (rounded) and not actual values (unrounded). Thus, we\n * use the `offset*` properties. See the linked GitHub issue.\n *\n * @see https://bit.ly/3m0k3he - GitHub issue\n *\n * @param el - Element\n *\n * @returns Element size observable\n */\nexport function watchElementSize(\n el: HTMLElement\n): Observable {\n return observer$\n .pipe(\n tap(observer => observer.observe(el)),\n switchMap(observer => entry$\n .pipe(\n filter(({ target }) => target === el),\n finalize(() => observer.unobserve(el)),\n map(() => getElementSize(el))\n )\n ),\n startWith(getElementSize(el))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ElementSize } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element content size (= scroll width and height)\n *\n * @param el - Element\n *\n * @returns Element content size\n */\nexport function getElementContentSize(\n el: HTMLElement\n): ElementSize {\n return {\n width: el.scrollWidth,\n height: el.scrollHeight\n }\n}\n\n/**\n * Retrieve the overflowing container of an element, if any\n *\n * @param el - Element\n *\n * @returns Overflowing container or nothing\n */\nexport function getElementContainer(\n el: HTMLElement\n): HTMLElement | undefined {\n let parent = el.parentElement\n while (parent)\n if (\n el.scrollWidth <= parent.scrollWidth &&\n el.scrollHeight <= parent.scrollHeight\n )\n parent = (el = parent).parentElement\n else\n break\n\n /* Return overflowing container */\n return parent ? el : undefined\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n NEVER,\n Observable,\n Subject,\n defer,\n distinctUntilChanged,\n filter,\n finalize,\n map,\n merge,\n of,\n shareReplay,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport {\n getElementContentSize,\n getElementSize,\n watchElementContentOffset\n} from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Intersection observer entry subject\n */\nconst entry$ = new Subject()\n\n/**\n * Intersection observer observable\n *\n * This observable will create an `IntersectionObserver` on first subscription\n * and will automatically terminate it when there are no more subscribers.\n *\n * @see https://bit.ly/3iIYfEm - Google Groups on performance\n */\nconst observer$ = defer(() => of(\n new IntersectionObserver(entries => {\n for (const entry of entries)\n entry$.next(entry)\n }, {\n threshold: 0\n })\n))\n .pipe(\n switchMap(observer => merge(NEVER, of(observer))\n .pipe(\n finalize(() => observer.disconnect())\n )\n ),\n shareReplay(1)\n )\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch element visibility\n *\n * @param el - Element\n *\n * @returns Element visibility observable\n */\nexport function watchElementVisibility(\n el: HTMLElement\n): Observable {\n return observer$\n .pipe(\n tap(observer => observer.observe(el)),\n switchMap(observer => entry$\n .pipe(\n filter(({ target }) => target === el),\n finalize(() => observer.unobserve(el)),\n map(({ isIntersecting }) => isIntersecting)\n )\n )\n )\n}\n\n/**\n * Watch element boundary\n *\n * This function returns an observable which emits whether the bottom content\n * boundary (= scroll offset) of an element is within a certain threshold.\n *\n * @param el - Element\n * @param threshold - Threshold\n *\n * @returns Element boundary observable\n */\nexport function watchElementBoundary(\n el: HTMLElement, threshold = 16\n): Observable {\n return watchElementContentOffset(el)\n .pipe(\n map(({ y }) => {\n const visible = getElementSize(el)\n const content = getElementContentSize(el)\n return y >= (\n content.height - visible.height - threshold\n )\n }),\n distinctUntilChanged()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n startWith\n} from \"rxjs\"\n\nimport { getElement } from \"../element\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle\n */\nexport type Toggle =\n | \"drawer\" /* Toggle for drawer */\n | \"search\" /* Toggle for search */\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle map\n */\nconst toggles: Record = {\n drawer: getElement(\"[data-md-toggle=drawer]\"),\n search: getElement(\"[data-md-toggle=search]\")\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve the value of a toggle\n *\n * @param name - Toggle\n *\n * @returns Toggle value\n */\nexport function getToggle(name: Toggle): boolean {\n return toggles[name].checked\n}\n\n/**\n * Set toggle\n *\n * Simulating a click event seems to be the most cross-browser compatible way\n * of changing the value while also emitting a `change` event. Before, Material\n * used `CustomEvent` to programmatically change the value of a toggle, but this\n * is a much simpler and cleaner solution which doesn't require a polyfill.\n *\n * @param name - Toggle\n * @param value - Toggle value\n */\nexport function setToggle(name: Toggle, value: boolean): void {\n if (toggles[name].checked !== value)\n toggles[name].click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch toggle\n *\n * @param name - Toggle\n *\n * @returns Toggle value observable\n */\nexport function watchToggle(name: Toggle): Observable {\n const el = toggles[name]\n return fromEvent(el, \"change\")\n .pipe(\n map(() => el.checked),\n startWith(el.checked)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n filter,\n fromEvent,\n map,\n share\n} from \"rxjs\"\n\nimport { getActiveElement } from \"../element\"\nimport { getToggle } from \"../toggle\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Keyboard mode\n */\nexport type KeyboardMode =\n | \"global\" /* Global */\n | \"search\" /* Search is open */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Keyboard\n */\nexport interface Keyboard {\n mode: KeyboardMode /* Keyboard mode */\n type: string /* Key type */\n claim(): void /* Key claim */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Check whether an element may receive keyboard input\n *\n * @param el - Element\n * @param type - Key type\n *\n * @returns Test result\n */\nfunction isSusceptibleToKeyboard(\n el: HTMLElement, type: string\n): boolean {\n switch (el.constructor) {\n\n /* Input elements */\n case HTMLInputElement:\n /* @ts-expect-error - omit unnecessary type cast */\n if (el.type === \"radio\")\n return /^Arrow/.test(type)\n else\n return true\n\n /* Select element and textarea */\n case HTMLSelectElement:\n case HTMLTextAreaElement:\n return true\n\n /* Everything else */\n default:\n return el.isContentEditable\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch keyboard\n *\n * @returns Keyboard observable\n */\nexport function watchKeyboard(): Observable {\n return fromEvent(window, \"keydown\")\n .pipe(\n filter(ev => !(ev.metaKey || ev.ctrlKey)),\n map(ev => ({\n mode: getToggle(\"search\") ? \"search\" : \"global\",\n type: ev.key,\n claim() {\n ev.preventDefault()\n ev.stopPropagation()\n }\n } as Keyboard)),\n filter(({ mode, type }) => {\n if (mode === \"global\") {\n const active = getActiveElement()\n if (typeof active !== \"undefined\")\n return !isSusceptibleToKeyboard(active, type)\n }\n return true\n }),\n share()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Subject } from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location\n *\n * This function returns a `URL` object (and not `Location`) to normalize the\n * typings across the application. Furthermore, locations need to be tracked\n * without setting them and `Location` is a singleton which represents the\n * current location.\n *\n * @returns URL\n */\nexport function getLocation(): URL {\n return new URL(location.href)\n}\n\n/**\n * Set location\n *\n * @param url - URL to change to\n */\nexport function setLocation(url: URL): void {\n location.href = url.href\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location\n *\n * @returns Location subject\n */\nexport function watchLocation(): Subject {\n return new Subject()\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { JSX as JSXInternal } from \"preact\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * HTML attributes\n */\ntype Attributes =\n & JSXInternal.HTMLAttributes\n & JSXInternal.SVGAttributes\n & Record\n\n/**\n * Child element\n */\ntype Child =\n | HTMLElement\n | Text\n | string\n | number\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Append a child node to an element\n *\n * @param el - Element\n * @param child - Child node(s)\n */\nfunction appendChild(el: HTMLElement, child: Child | Child[]): void {\n\n /* Handle primitive types (including raw HTML) */\n if (typeof child === \"string\" || typeof child === \"number\") {\n el.innerHTML += child.toString()\n\n /* Handle nodes */\n } else if (child instanceof Node) {\n el.appendChild(child)\n\n /* Handle nested children */\n } else if (Array.isArray(child)) {\n for (const node of child)\n appendChild(el, node)\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * JSX factory\n *\n * @template T - Element type\n *\n * @param tag - HTML tag\n * @param attributes - HTML attributes\n * @param children - Child elements\n *\n * @returns Element\n */\nexport function h(\n tag: T, attributes?: Attributes | null, ...children: Child[]\n): HTMLElementTagNameMap[T]\n\nexport function h(\n tag: string, attributes?: Attributes | null, ...children: Child[]\n): T\n\nexport function h(\n tag: string, attributes?: Attributes | null, ...children: Child[]\n): T {\n const el = document.createElement(tag)\n\n /* Set attributes, if any */\n if (attributes)\n for (const attr of Object.keys(attributes)) {\n if (typeof attributes[attr] === \"undefined\")\n continue\n\n /* Set default attribute or boolean */\n if (typeof attributes[attr] !== \"boolean\")\n el.setAttribute(attr, attributes[attr])\n else\n el.setAttribute(attr, \"\")\n }\n\n /* Append child nodes */\n for (const child of children)\n appendChild(el, child)\n\n /* Return element */\n return el as T\n}\n\n/* ----------------------------------------------------------------------------\n * Namespace\n * ------------------------------------------------------------------------- */\n\nexport declare namespace h {\n namespace JSX {\n type Element = HTMLElement\n type IntrinsicElements = JSXInternal.IntrinsicElements\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Truncate a string after the given number of characters\n *\n * This is not a very reasonable approach, since the summaries kind of suck.\n * It would be better to create something more intelligent, highlighting the\n * search occurrences and making a better summary out of it, but this note was\n * written three years ago, so who knows if we'll ever fix it.\n *\n * @param value - Value to be truncated\n * @param n - Number of characters\n *\n * @returns Truncated value\n */\nexport function truncate(value: string, n: number): string {\n let i = n\n if (value.length > i) {\n while (value[i] !== \" \" && --i > 0) { /* keep eating */ }\n return `${value.substring(0, i)}...`\n }\n return value\n}\n\n/**\n * Round a number for display with repository facts\n *\n * This is a reverse-engineered version of GitHub's weird rounding algorithm\n * for stars, forks and all other numbers. While all numbers below `1,000` are\n * returned as-is, bigger numbers are converted to fixed numbers:\n *\n * - `1,049` => `1k`\n * - `1,050` => `1.1k`\n * - `1,949` => `1.9k`\n * - `1,950` => `2k`\n *\n * @param value - Original value\n *\n * @returns Rounded value\n */\nexport function round(value: number): string {\n if (value > 999) {\n const digits = +((value - 950) % 1000 > 99)\n return `${((value + 0.000001) / 1000).toFixed(digits)}k`\n } else {\n return value.toString()\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n filter,\n fromEvent,\n map,\n shareReplay,\n startWith\n} from \"rxjs\"\n\nimport { getOptionalElement } from \"~/browser\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location hash\n *\n * @returns Location hash\n */\nexport function getLocationHash(): string {\n return location.hash.substring(1)\n}\n\n/**\n * Set location hash\n *\n * Setting a new fragment identifier via `location.hash` will have no effect\n * if the value doesn't change. When a new fragment identifier is set, we want\n * the browser to target the respective element at all times, which is why we\n * use this dirty little trick.\n *\n * @param hash - Location hash\n */\nexport function setLocationHash(hash: string): void {\n const el = h(\"a\", { href: hash })\n el.addEventListener(\"click\", ev => ev.stopPropagation())\n el.click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location hash\n *\n * @returns Location hash observable\n */\nexport function watchLocationHash(): Observable {\n return fromEvent(window, \"hashchange\")\n .pipe(\n map(getLocationHash),\n startWith(getLocationHash()),\n filter(hash => hash.length > 0),\n shareReplay(1)\n )\n}\n\n/**\n * Watch location target\n *\n * @returns Location target observable\n */\nexport function watchLocationTarget(): Observable {\n return watchLocationHash()\n .pipe(\n map(id => getOptionalElement(`[id=\"${id}\"]`)!),\n filter(el => typeof el !== \"undefined\")\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n fromEvent,\n fromEventPattern,\n map,\n merge,\n startWith,\n switchMap\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch media query\n *\n * Note that although `MediaQueryList.addListener` is deprecated we have to\n * use it, because it's the only way to ensure proper downward compatibility.\n *\n * @see https://bit.ly/3dUBH2m - GitHub issue\n *\n * @param query - Media query\n *\n * @returns Media observable\n */\nexport function watchMedia(query: string): Observable {\n const media = matchMedia(query)\n return fromEventPattern(next => (\n media.addListener(() => next(media.matches))\n ))\n .pipe(\n startWith(media.matches)\n )\n}\n\n/**\n * Watch print mode\n *\n * @returns Print observable\n */\nexport function watchPrint(): Observable {\n const media = matchMedia(\"print\")\n return merge(\n fromEvent(window, \"beforeprint\").pipe(map(() => true)),\n fromEvent(window, \"afterprint\").pipe(map(() => false))\n )\n .pipe(\n startWith(media.matches)\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Toggle an observable with a media observable\n *\n * @template T - Data type\n *\n * @param query$ - Media observable\n * @param factory - Observable factory\n *\n * @returns Toggled observable\n */\nexport function at(\n query$: Observable, factory: () => Observable\n): Observable {\n return query$\n .pipe(\n switchMap(active => active ? factory() : EMPTY)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n catchError,\n from,\n map,\n of,\n shareReplay,\n switchMap,\n throwError\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch the given URL\n *\n * If the request fails (e.g. when dispatched from `file://` locations), the\n * observable will complete without emitting a value.\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Response observable\n */\nexport function request(\n url: URL | string, options: RequestInit = { credentials: \"same-origin\" }\n): Observable {\n return from(fetch(`${url}`, options))\n .pipe(\n catchError(() => EMPTY),\n switchMap(res => res.status !== 200\n ? throwError(() => new Error(res.statusText))\n : of(res)\n )\n )\n}\n\n/**\n * Fetch JSON from the given URL\n *\n * @template T - Data type\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Data observable\n */\nexport function requestJSON(\n url: URL | string, options?: RequestInit\n): Observable {\n return request(url, options)\n .pipe(\n switchMap(res => res.json()),\n shareReplay(1)\n )\n}\n\n/**\n * Fetch XML from the given URL\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Data observable\n */\nexport function requestXML(\n url: URL | string, options?: RequestInit\n): Observable {\n const dom = new DOMParser()\n return request(url, options)\n .pipe(\n switchMap(res => res.text()),\n map(res => dom.parseFromString(res, \"text/xml\")),\n shareReplay(1)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n defer,\n finalize,\n fromEvent,\n map,\n merge,\n switchMap,\n take,\n throwError\n} from \"rxjs\"\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create and load a `script` element\n *\n * This function returns an observable that will emit when the script was\n * successfully loaded, or throw an error if it didn't.\n *\n * @param src - Script URL\n *\n * @returns Script observable\n */\nexport function watchScript(src: string): Observable {\n const script = h(\"script\", { src })\n return defer(() => {\n document.head.appendChild(script)\n return merge(\n fromEvent(script, \"load\"),\n fromEvent(script, \"error\")\n .pipe(\n switchMap(() => (\n throwError(() => new ReferenceError(`Invalid script: ${src}`))\n ))\n )\n )\n .pipe(\n map(() => undefined),\n finalize(() => document.head.removeChild(script)),\n take(1)\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport offset\n */\nexport interface ViewportOffset {\n x: number /* Horizontal offset */\n y: number /* Vertical offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve viewport offset\n *\n * On iOS Safari, viewport offset can be negative due to overflow scrolling.\n * As this may induce strange behaviors downstream, we'll just limit it to 0.\n *\n * @returns Viewport offset\n */\nexport function getViewportOffset(): ViewportOffset {\n return {\n x: Math.max(0, scrollX),\n y: Math.max(0, scrollY)\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport offset\n *\n * @returns Viewport offset observable\n */\nexport function watchViewportOffset(): Observable {\n return merge(\n fromEvent(window, \"scroll\", { passive: true }),\n fromEvent(window, \"resize\", { passive: true })\n )\n .pipe(\n map(getViewportOffset),\n startWith(getViewportOffset())\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n startWith\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport size\n */\nexport interface ViewportSize {\n width: number /* Viewport width */\n height: number /* Viewport height */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve viewport size\n *\n * @returns Viewport size\n */\nexport function getViewportSize(): ViewportSize {\n return {\n width: innerWidth,\n height: innerHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport size\n *\n * @returns Viewport size observable\n */\nexport function watchViewportSize(): Observable {\n return fromEvent(window, \"resize\", { passive: true })\n .pipe(\n map(getViewportSize),\n startWith(getViewportSize())\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n map,\n shareReplay\n} from \"rxjs\"\n\nimport {\n ViewportOffset,\n watchViewportOffset\n} from \"../offset\"\nimport {\n ViewportSize,\n watchViewportSize\n} from \"../size\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport\n */\nexport interface Viewport {\n offset: ViewportOffset /* Viewport offset */\n size: ViewportSize /* Viewport size */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport\n *\n * @returns Viewport observable\n */\nexport function watchViewport(): Observable {\n return combineLatest([\n watchViewportOffset(),\n watchViewportSize()\n ])\n .pipe(\n map(([offset, size]) => ({ offset, size })),\n shareReplay(1)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n distinctUntilKeyChanged,\n map\n} from \"rxjs\"\n\nimport { Header } from \"~/components\"\n\nimport { getElementOffset } from \"../../element\"\nimport { Viewport } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
/* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport relative to element\n *\n * @param el - Element\n * @param options - Options\n *\n * @returns Viewport observable\n */\nexport function watchViewportAt(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n const size$ = viewport$\n .pipe(\n distinctUntilKeyChanged(\"size\")\n )\n\n /* Compute element offset */\n const offset$ = combineLatest([size$, header$])\n .pipe(\n map(() => getElementOffset(el))\n )\n\n /* Compute relative viewport, return hot observable */\n return combineLatest([header$, viewport$, offset$])\n .pipe(\n map(([{ height }, { offset, size }, { x, y }]) => ({\n offset: {\n x: offset.x - x,\n y: offset.y - y + height\n },\n size\n }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n fromEvent,\n map,\n share,\n switchMap,\n tap,\n throttle\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Worker message\n */\nexport interface WorkerMessage {\n type: unknown /* Message type */\n data?: unknown /* Message data */\n}\n\n/**\n * Worker handler\n *\n * @template T - Message type\n */\nexport interface WorkerHandler<\n T extends WorkerMessage\n> {\n tx$: Subject /* Message transmission subject */\n rx$: Observable /* Message receive observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n *\n * @template T - Worker message type\n */\ninterface WatchOptions {\n tx$: Observable /* Message transmission observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch a web worker\n *\n * This function returns an observable that sends all values emitted by the\n * message observable to the web worker. Web worker communication is expected\n * to be bidirectional (request-response) and synchronous. Messages that are\n * emitted during a pending request are throttled, the last one is emitted.\n *\n * @param worker - Web worker\n * @param options - Options\n *\n * @returns Worker message observable\n */\nexport function watchWorker(\n worker: Worker, { tx$ }: WatchOptions\n): Observable {\n\n /* Intercept messages from worker-like objects */\n const rx$ = fromEvent(worker, \"message\")\n .pipe(\n map(({ data }) => data as T)\n )\n\n /* Send and receive messages, return hot observable */\n return tx$\n .pipe(\n throttle(() => rx$, { leading: true, trailing: true }),\n tap(message => worker.postMessage(message)),\n switchMap(() => rx$),\n share()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getElement, getLocation } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Feature flag\n */\nexport type Flag =\n | \"announce.dismiss\" /* Dismissable announcement bar */\n | \"content.code.annotate\" /* Code annotations */\n | \"content.lazy\" /* Lazy content elements */\n | \"content.tabs.link\" /* Link content tabs */\n | \"header.autohide\" /* Hide header */\n | \"navigation.expand\" /* Automatic expansion */\n | \"navigation.indexes\" /* Section pages */\n | \"navigation.instant\" /* Instant loading */\n | \"navigation.sections\" /* Section navigation */\n | \"navigation.tabs\" /* Tabs navigation */\n | \"navigation.tabs.sticky\" /* Tabs navigation (sticky) */\n | \"navigation.top\" /* Back-to-top button */\n | \"navigation.tracking\" /* Anchor tracking */\n | \"search.highlight\" /* Search highlighting */\n | \"search.share\" /* Search sharing */\n | \"search.suggest\" /* Search suggestions */\n | \"toc.follow\" /* Following table of contents */\n | \"toc.integrate\" /* Integrated table of contents */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Translation\n */\nexport type Translation =\n | \"clipboard.copy\" /* Copy to clipboard */\n | \"clipboard.copied\" /* Copied to clipboard */\n | \"search.config.lang\" /* Search language */\n | \"search.config.pipeline\" /* Search pipeline */\n | \"search.config.separator\" /* Search separator */\n | \"search.placeholder\" /* Search */\n | \"search.result.placeholder\" /* Type to start searching */\n | \"search.result.none\" /* No matching documents */\n | \"search.result.one\" /* 1 matching document */\n | \"search.result.other\" /* # matching documents */\n | \"search.result.more.one\" /* 1 more on this page */\n | \"search.result.more.other\" /* # more on this page */\n | \"search.result.term.missing\" /* Missing */\n | \"select.version.title\" /* Version selector */\n\n/**\n * Translations\n */\nexport type Translations = Record\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Versioning\n */\nexport interface Versioning {\n provider: \"mike\" /* Version provider */\n default?: string /* Default version */\n}\n\n/**\n * Configuration\n */\nexport interface Config {\n base: string /* Base URL */\n features: Flag[] /* Feature flags */\n translations: Translations /* Translations */\n search: string /* Search worker URL */\n tags?: Record /* Tags mapping */\n version?: Versioning /* Versioning */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve global configuration and make base URL absolute\n */\nconst script = getElement(\"#__config\")\nconst config: Config = JSON.parse(script.textContent!)\nconfig.base = `${new URL(config.base, getLocation())}`\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve global configuration\n *\n * @returns Global configuration\n */\nexport function configuration(): Config {\n return config\n}\n\n/**\n * Check whether a feature flag is enabled\n *\n * @param flag - Feature flag\n *\n * @returns Test result\n */\nexport function feature(flag: Flag): boolean {\n return config.features.includes(flag)\n}\n\n/**\n * Retrieve the translation for the given key\n *\n * @param key - Key to be translated\n * @param value - Positional value, if any\n *\n * @returns Translation\n */\nexport function translation(\n key: Translation, value?: string | number\n): string {\n return typeof value !== \"undefined\"\n ? config.translations[key].replace(\"#\", value.toString())\n : config.translations[key]\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getElement, getElements } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Component type\n */\nexport type ComponentType =\n | \"announce\" /* Announcement bar */\n | \"container\" /* Container */\n | \"consent\" /* Consent */\n | \"content\" /* Content */\n | \"dialog\" /* Dialog */\n | \"header\" /* Header */\n | \"header-title\" /* Header title */\n | \"header-topic\" /* Header topic */\n | \"main\" /* Main area */\n | \"outdated\" /* Version warning */\n | \"palette\" /* Color palette */\n | \"search\" /* Search */\n | \"search-query\" /* Search input */\n | \"search-result\" /* Search results */\n | \"search-share\" /* Search sharing */\n | \"search-suggest\" /* Search suggestions */\n | \"sidebar\" /* Sidebar */\n | \"skip\" /* Skip link */\n | \"source\" /* Repository information */\n | \"tabs\" /* Navigation tabs */\n | \"toc\" /* Table of contents */\n | \"top\" /* Back-to-top button */\n\n/**\n * Component\n *\n * @template T - Component type\n * @template U - Reference type\n */\nexport type Component<\n T extends {} = {},\n U extends HTMLElement = HTMLElement\n> =\n T & {\n ref: U /* Component reference */\n }\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Component type map\n */\ninterface ComponentTypeMap {\n \"announce\": HTMLElement /* Announcement bar */\n \"container\": HTMLElement /* Container */\n \"consent\": HTMLElement /* Consent */\n \"content\": HTMLElement /* Content */\n \"dialog\": HTMLElement /* Dialog */\n \"header\": HTMLElement /* Header */\n \"header-title\": HTMLElement /* Header title */\n \"header-topic\": HTMLElement /* Header topic */\n \"main\": HTMLElement /* Main area */\n \"outdated\": HTMLElement /* Version warning */\n \"palette\": HTMLElement /* Color palette */\n \"search\": HTMLElement /* Search */\n \"search-query\": HTMLInputElement /* Search input */\n \"search-result\": HTMLElement /* Search results */\n \"search-share\": HTMLAnchorElement /* Search sharing */\n \"search-suggest\": HTMLElement /* Search suggestions */\n \"sidebar\": HTMLElement /* Sidebar */\n \"skip\": HTMLAnchorElement /* Skip link */\n \"source\": HTMLAnchorElement /* Repository information */\n \"tabs\": HTMLElement /* Navigation tabs */\n \"toc\": HTMLElement /* Table of contents */\n \"top\": HTMLAnchorElement /* Back-to-top button */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve the element for a given component or throw a reference error\n *\n * @template T - Component type\n *\n * @param type - Component type\n * @param node - Node of reference\n *\n * @returns Element\n */\nexport function getComponentElement(\n type: T, node: ParentNode = document\n): ComponentTypeMap[T] {\n return getElement(`[data-md-component=${type}]`, node)\n}\n\n/**\n * Retrieve all elements for a given component\n *\n * @template T - Component type\n *\n * @param type - Component type\n * @param node - Node of reference\n *\n * @returns Elements\n */\nexport function getComponentElements(\n type: T, node: ParentNode = document\n): ComponentTypeMap[T][] {\n return getElements(`[data-md-component=${type}]`, node)\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n finalize,\n fromEvent,\n map,\n startWith,\n tap\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport { getElement } from \"~/browser\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Announcement bar\n */\nexport interface Announce {\n hash: number /* Content hash */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch announcement bar\n *\n * @param el - Announcement bar element\n *\n * @returns Announcement bar observable\n */\nexport function watchAnnounce(\n el: HTMLElement\n): Observable {\n const button = getElement(\".md-typeset > :first-child\", el)\n return fromEvent(button, \"click\", { once: true })\n .pipe(\n map(() => getElement(\".md-typeset\", el)),\n map(content => ({ hash: __md_hash(content.innerHTML) }))\n )\n}\n\n/**\n * Mount announcement bar\n *\n * @param el - Announcement bar element\n *\n * @returns Announcement bar component observable\n */\nexport function mountAnnounce(\n el: HTMLElement\n): Observable> {\n if (!feature(\"announce.dismiss\") || !el.childElementCount)\n return EMPTY\n\n /* Mount component on subscription */\n return defer(() => {\n const push$ = new Subject()\n push$\n .pipe(\n startWith({ hash: __md_get(\"__announce\") })\n )\n .subscribe(({ hash }) => {\n if (hash && hash === (__md_get(\"__announce\") ?? hash)) {\n el.hidden = true\n\n /* Persist preference in local storage */\n __md_set(\"__announce\", hash)\n }\n })\n\n /* Create and return component */\n return watchAnnounce(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n finalize,\n map,\n tap\n} from \"rxjs\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Consent\n */\nexport interface Consent {\n hidden: boolean /* Consent is hidden */\n}\n\n/**\n * Consent defaults\n */\nexport interface ConsentDefaults {\n analytics?: boolean /* Consent for Analytics */\n github?: boolean /* Consent for GitHub */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n target$: Observable /* Target observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch consent\n *\n * @param el - Consent element\n * @param options - Options\n *\n * @returns Consent observable\n */\nexport function watchConsent(\n el: HTMLElement, { target$ }: WatchOptions\n): Observable {\n return target$\n .pipe(\n map(target => ({ hidden: target !== el }))\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Mount consent\n *\n * @param el - Consent element\n * @param options - Options\n *\n * @returns Consent component observable\n */\nexport function mountConsent(\n el: HTMLElement, options: MountOptions\n): Observable> {\n const internal$ = new Subject()\n internal$.subscribe(({ hidden }) => {\n el.hidden = hidden\n })\n\n /* Create and return component */\n return watchConsent(el, options)\n .pipe(\n tap(state => internal$.next(state)),\n finalize(() => internal$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ClipboardJS from \"clipboard\"\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n finalize,\n map,\n mergeWith,\n switchMap,\n take,\n tap\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n getElementContentSize,\n watchElementSize,\n watchElementVisibility\n} from \"~/browser\"\nimport { renderClipboardButton } from \"~/templates\"\n\nimport { Component } from \"../../../_\"\nimport {\n Annotation,\n mountAnnotationList\n} from \"../../annotation\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Code block\n */\nexport interface CodeBlock {\n scrollable: boolean /* Code block overflows */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Global sequence number for code blocks\n */\nlet sequence = 0\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Find candidate list element directly following a code block\n *\n * @param el - Code block element\n *\n * @returns List element or nothing\n */\nfunction findCandidateList(el: HTMLElement): HTMLElement | undefined {\n if (el.nextElementSibling) {\n const sibling = el.nextElementSibling as HTMLElement\n if (sibling.tagName === \"OL\")\n return sibling\n\n /* Skip empty paragraphs - see https://bit.ly/3r4ZJ2O */\n else if (sibling.tagName === \"P\" && !sibling.children.length)\n return findCandidateList(sibling)\n }\n\n /* Everything else */\n return undefined\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch code block\n *\n * This function monitors size changes of the viewport, as well as switches of\n * content tabs with embedded code blocks, as both may trigger overflow.\n *\n * @param el - Code block element\n *\n * @returns Code block observable\n */\nexport function watchCodeBlock(\n el: HTMLElement\n): Observable {\n return watchElementSize(el)\n .pipe(\n map(({ width }) => {\n const content = getElementContentSize(el)\n return {\n scrollable: content.width > width\n }\n }),\n distinctUntilKeyChanged(\"scrollable\")\n )\n}\n\n/**\n * Mount code block\n *\n * This function ensures that an overflowing code block is focusable through\n * keyboard, so it can be scrolled without a mouse to improve on accessibility.\n * Furthermore, if code annotations are enabled, they are mounted if and only\n * if the code block is currently visible, e.g., not in a hidden content tab.\n *\n * Note that code blocks may be mounted eagerly or lazily. If they're mounted\n * lazily (on first visibility), code annotation anchor links will not work,\n * as they are evaluated on initial page load, and code annotations in general\n * might feel a little bumpier.\n *\n * @param el - Code block element\n * @param options - Options\n *\n * @returns Code block and annotation component observable\n */\nexport function mountCodeBlock(\n el: HTMLElement, options: MountOptions\n): Observable> {\n const { matches: hover } = matchMedia(\"(hover)\")\n\n /* Defer mounting of code block - see https://bit.ly/3vHVoVD */\n const factory$ = defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ scrollable }) => {\n if (scrollable && hover)\n el.setAttribute(\"tabindex\", \"0\")\n else\n el.removeAttribute(\"tabindex\")\n })\n\n /* Render button for Clipboard.js integration */\n if (ClipboardJS.isSupported()) {\n const parent = el.closest(\"pre\")!\n parent.id = `__code_${++sequence}`\n parent.insertBefore(\n renderClipboardButton(parent.id),\n el\n )\n }\n\n /* Handle code annotations */\n const container = el.closest(\".highlight\")\n if (container instanceof HTMLElement) {\n const list = findCandidateList(container)\n\n /* Mount code annotations, if enabled */\n if (typeof list !== \"undefined\" && (\n container.classList.contains(\"annotate\") ||\n feature(\"content.code.annotate\")\n )) {\n const annotations$ = mountAnnotationList(list, el, options)\n\n /* Create and return component */\n return watchCodeBlock(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state })),\n mergeWith(\n watchElementSize(container)\n .pipe(\n map(({ width, height }) => width && height),\n distinctUntilChanged(),\n switchMap(active => active ? annotations$ : EMPTY)\n )\n )\n )\n }\n }\n\n /* Create and return component */\n return watchCodeBlock(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n\n /* Mount code block lazily */\n if (feature(\"content.lazy\"))\n return watchElementVisibility(el)\n .pipe(\n filter(visible => visible),\n take(1),\n switchMap(() => factory$)\n )\n\n /* Mount code block */\n return factory$\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a tooltip\n *\n * @param id - Tooltip identifier\n *\n * @returns Element\n */\nexport function renderTooltip(id?: string): HTMLElement {\n return (\n
\n
\n
\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\nimport { renderTooltip } from \"../tooltip\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render an annotation\n *\n * @param id - Annotation identifier\n * @param prefix - Tooltip identifier prefix\n *\n * @returns Element\n */\nexport function renderAnnotation(\n id: string | number, prefix?: string\n): HTMLElement {\n prefix = prefix ? `${prefix}_annotation_${id}` : undefined\n\n /* Render tooltip with anchor, if given */\n if (prefix) {\n const anchor = prefix ? `#${prefix}` : undefined\n return (\n \n )\n } else {\n return (\n \n )\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { translation } from \"~/_\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a 'copy-to-clipboard' button\n *\n * @param id - Unique identifier\n *\n * @returns Element\n */\nexport function renderClipboardButton(id: string): HTMLElement {\n return (\n code`}\n >\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ComponentChild } from \"preact\"\n\nimport { configuration, feature, translation } from \"~/_\"\nimport {\n SearchDocument,\n SearchMetadata,\n SearchResultItem\n} from \"~/integrations/search\"\nimport { h, truncate } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Render flag\n */\nconst enum Flag {\n TEASER = 1, /* Render teaser */\n PARENT = 2 /* Render as parent */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper function\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a search document\n *\n * @param document - Search document\n * @param flag - Render flags\n *\n * @returns Element\n */\nfunction renderSearchDocument(\n document: SearchDocument & SearchMetadata, flag: Flag\n): HTMLElement {\n const parent = flag & Flag.PARENT\n const teaser = flag & Flag.TEASER\n\n /* Render missing query terms */\n const missing = Object.keys(document.terms)\n .filter(key => !document.terms[key])\n .reduce((list, key) => [\n ...list, {key}, \" \"\n ], [])\n .slice(0, -1)\n\n /* Assemble query string for highlighting */\n const url = new URL(document.location)\n if (feature(\"search.highlight\"))\n url.searchParams.set(\"h\", Object.entries(document.terms)\n .filter(([, match]) => match)\n .reduce((highlight, [value]) => `${highlight} ${value}`.trim(), \"\")\n )\n\n /* Render article or section, depending on flags */\n const { tags } = configuration()\n return (\n \n \n {parent > 0 &&
}\n

{document.title}

\n {teaser > 0 && document.text.length > 0 &&\n

\n {truncate(document.text, 320)}\n

\n }\n {document.tags && (\n
\n {document.tags.map(tag => {\n const id = tag.replace(/<[^>]+>/g, \"\")\n const type = tags\n ? id in tags\n ? `md-tag-icon md-tag-icon--${tags[id]}`\n : \"md-tag-icon\"\n : \"\"\n return (\n {tag}\n )\n })}\n
\n )}\n {teaser > 0 && missing.length > 0 &&\n

\n {translation(\"search.result.term.missing\")}: {...missing}\n

\n }\n \n
\n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a search result\n *\n * @param result - Search result\n *\n * @returns Element\n */\nexport function renderSearchResultItem(\n result: SearchResultItem\n): HTMLElement {\n const threshold = result[0].score\n const docs = [...result]\n\n /* Find and extract parent article */\n const parent = docs.findIndex(doc => !doc.location.includes(\"#\"))\n const [article] = docs.splice(parent, 1)\n\n /* Determine last index above threshold */\n let index = docs.findIndex(doc => doc.score < threshold)\n if (index === -1)\n index = docs.length\n\n /* Partition sections */\n const best = docs.slice(0, index)\n const more = docs.slice(index)\n\n /* Render children */\n const children = [\n renderSearchDocument(article, Flag.PARENT | +(!parent && index === 0)),\n ...best.map(section => renderSearchDocument(section, Flag.TEASER)),\n ...more.length ? [\n
\n \n {more.length > 0 && more.length === 1\n ? translation(\"search.result.more.one\")\n : translation(\"search.result.more.other\", more.length)\n }\n \n {...more.map(section => renderSearchDocument(section, Flag.TEASER))}\n
\n ] : []\n ]\n\n /* Render search result */\n return (\n
  • \n {children}\n
  • \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { SourceFacts } from \"~/components\"\nimport { h, round } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render repository facts\n *\n * @param facts - Repository facts\n *\n * @returns Element\n */\nexport function renderSourceFacts(facts: SourceFacts): HTMLElement {\n return (\n
      \n {Object.entries(facts).map(([key, value]) => (\n
    • \n {typeof value === \"number\" ? round(value) : value}\n
    • \n ))}\n
    \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Tabbed control type\n */\ntype TabbedControlType =\n | \"prev\"\n | \"next\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render control for content tabs\n *\n * @param type - Control type\n *\n * @returns Element\n */\nexport function renderTabbedControl(\n type: TabbedControlType\n): HTMLElement {\n const classes = `tabbed-control tabbed-control--${type}`\n return (\n \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a table inside a wrapper to improve scrolling on mobile\n *\n * @param table - Table element\n *\n * @returns Element\n */\nexport function renderTable(table: HTMLElement): HTMLElement {\n return (\n
    \n
    \n {table}\n
    \n
    \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { configuration, translation } from \"~/_\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Version\n */\nexport interface Version {\n version: string /* Version identifier */\n title: string /* Version title */\n aliases: string[] /* Version aliases */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a version\n *\n * @param version - Version\n *\n * @returns Element\n */\nfunction renderVersion(version: Version): HTMLElement {\n const config = configuration()\n\n /* Ensure trailing slash - see https://bit.ly/3rL5u3f */\n const url = new URL(`../${version.version}/`, config.base)\n return (\n
  • \n \n {version.title}\n \n
  • \n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a version selector\n *\n * @param versions - Versions\n * @param active - Active version\n *\n * @returns Element\n */\nexport function renderVersionSelector(\n versions: Version[], active: Version\n): HTMLElement {\n return (\n
    \n \n {active.title}\n \n
      \n {versions.map(renderVersion)}\n
    \n
    \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n animationFrameScheduler,\n auditTime,\n combineLatest,\n debounceTime,\n defer,\n delay,\n filter,\n finalize,\n fromEvent,\n map,\n merge,\n switchMap,\n take,\n takeLast,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom\n} from \"rxjs\"\n\nimport {\n ElementOffset,\n getActiveElement,\n getElementSize,\n watchElementContentOffset,\n watchElementFocus,\n watchElementOffset,\n watchElementVisibility\n} from \"~/browser\"\n\nimport { Component } from \"../../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Annotation\n */\nexport interface Annotation {\n active: boolean /* Annotation is active */\n offset: ElementOffset /* Annotation offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Location target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch annotation\n *\n * @param el - Annotation element\n * @param container - Containing element\n *\n * @returns Annotation observable\n */\nexport function watchAnnotation(\n el: HTMLElement, container: HTMLElement\n): Observable {\n const offset$ = defer(() => combineLatest([\n watchElementOffset(el),\n watchElementContentOffset(container)\n ]))\n .pipe(\n map(([{ x, y }, scroll]): ElementOffset => {\n const { width, height } = getElementSize(el)\n return ({\n x: x - scroll.x + width / 2,\n y: y - scroll.y + height / 2\n })\n })\n )\n\n /* Actively watch annotation on focus */\n return watchElementFocus(el)\n .pipe(\n switchMap(active => offset$\n .pipe(\n map(offset => ({ active, offset })),\n take(+!active || Infinity)\n )\n )\n )\n}\n\n/**\n * Mount annotation\n *\n * @param el - Annotation element\n * @param container - Containing element\n * @param options - Options\n *\n * @returns Annotation component observable\n */\nexport function mountAnnotation(\n el: HTMLElement, container: HTMLElement, { target$ }: MountOptions\n): Observable> {\n const [tooltip, index] = Array.from(el.children)\n\n /* Mount component on subscription */\n return defer(() => {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n push$.subscribe({\n\n /* Handle emission */\n next({ offset }) {\n el.style.setProperty(\"--md-tooltip-x\", `${offset.x}px`)\n el.style.setProperty(\"--md-tooltip-y\", `${offset.y}px`)\n },\n\n /* Handle complete */\n complete() {\n el.style.removeProperty(\"--md-tooltip-x\")\n el.style.removeProperty(\"--md-tooltip-y\")\n }\n })\n\n /* Start animation only when annotation is visible */\n watchElementVisibility(el)\n .pipe(\n takeUntil(done$)\n )\n .subscribe(visible => {\n el.toggleAttribute(\"data-md-visible\", visible)\n })\n\n /* Toggle tooltip presence to mitigate empty lines when copying */\n merge(\n push$.pipe(filter(({ active }) => active)),\n push$.pipe(debounceTime(250), filter(({ active }) => !active))\n )\n .subscribe({\n\n /* Handle emission */\n next({ active }) {\n if (active)\n el.prepend(tooltip)\n else\n tooltip.remove()\n },\n\n /* Handle complete */\n complete() {\n el.prepend(tooltip)\n }\n })\n\n /* Toggle tooltip visibility */\n push$\n .pipe(\n auditTime(16, animationFrameScheduler)\n )\n .subscribe(({ active }) => {\n tooltip.classList.toggle(\"md-tooltip--active\", active)\n })\n\n /* Track relative origin of tooltip */\n push$\n .pipe(\n throttleTime(125, animationFrameScheduler),\n filter(() => !!el.offsetParent),\n map(() => el.offsetParent!.getBoundingClientRect()),\n map(({ x }) => x)\n )\n .subscribe({\n\n /* Handle emission */\n next(origin) {\n if (origin)\n el.style.setProperty(\"--md-tooltip-0\", `${-origin}px`)\n else\n el.style.removeProperty(\"--md-tooltip-0\")\n },\n\n /* Handle complete */\n complete() {\n el.style.removeProperty(\"--md-tooltip-0\")\n }\n })\n\n /* Allow to copy link without scrolling to anchor */\n fromEvent(index, \"click\")\n .pipe(\n takeUntil(done$),\n filter(ev => !(ev.metaKey || ev.ctrlKey))\n )\n .subscribe(ev => ev.preventDefault())\n\n /* Allow to open link in new tab or blur on close */\n fromEvent(index, \"mousedown\")\n .pipe(\n takeUntil(done$),\n withLatestFrom(push$)\n )\n .subscribe(([ev, { active }]) => {\n\n /* Open in new tab */\n if (ev.button !== 0 || ev.metaKey || ev.ctrlKey) {\n ev.preventDefault()\n\n /* Close annotation */\n } else if (active) {\n ev.preventDefault()\n\n /* Focus parent annotation, if any */\n const parent = el.parentElement!.closest(\".md-annotation\")\n if (parent instanceof HTMLElement)\n parent.focus()\n else\n getActiveElement()?.blur()\n }\n })\n\n /* Open and focus annotation on location target */\n target$\n .pipe(\n takeUntil(done$),\n filter(target => target === tooltip),\n delay(125)\n )\n .subscribe(() => el.focus())\n\n /* Create and return component */\n return watchAnnotation(el, container)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n finalize,\n merge,\n share,\n takeLast,\n takeUntil\n} from \"rxjs\"\n\nimport {\n getElement,\n getElements,\n getOptionalElement\n} from \"~/browser\"\nimport { renderAnnotation } from \"~/templates\"\n\nimport { Component } from \"../../../_\"\nimport {\n Annotation,\n mountAnnotation\n} from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Find all annotation markers in the given code block\n *\n * @param container - Containing element\n *\n * @returns Annotation markers\n */\nfunction findAnnotationMarkers(container: HTMLElement): Text[] {\n const markers: Text[] = []\n for (const el of getElements(\".c, .c1, .cm\", container)) {\n const nodes: Text[] = []\n\n /* Find all text nodes in current element */\n const it = document.createNodeIterator(el, NodeFilter.SHOW_TEXT)\n for (let node = it.nextNode(); node; node = it.nextNode())\n nodes.push(node as Text)\n\n /* Find all markers in each text node */\n for (let text of nodes) {\n let match: RegExpExecArray | null\n\n /* Split text at marker and add to list */\n while ((match = /(\\(\\d+\\))(!)?/.exec(text.textContent!))) {\n const [, id, force] = match\n if (typeof force === \"undefined\") {\n const marker = text.splitText(match.index)\n text = marker.splitText(id.length)\n markers.push(marker)\n\n /* Replace entire text with marker */\n } else {\n text.textContent = id\n markers.push(text)\n break\n }\n }\n }\n }\n return markers\n}\n\n/**\n * Swap the child nodes of two elements\n *\n * @param source - Source element\n * @param target - Target element\n */\nfunction swap(source: HTMLElement, target: HTMLElement): void {\n target.append(...Array.from(source.childNodes))\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount annotation list\n *\n * This function analyzes the containing code block and checks for markers\n * referring to elements in the given annotation list. If no markers are found,\n * the list is left untouched. Otherwise, list elements are rendered as\n * annotations inside the code block.\n *\n * @param el - Annotation list element\n * @param container - Containing element\n * @param options - Options\n *\n * @returns Annotation component observable\n */\nexport function mountAnnotationList(\n el: HTMLElement, container: HTMLElement, { target$, print$ }: MountOptions\n): Observable> {\n\n /* Compute prefix for tooltip anchors */\n const parent = container.closest(\"[id]\")\n const prefix = parent?.id\n\n /* Find and replace all markers with empty annotations */\n const annotations = new Map()\n for (const marker of findAnnotationMarkers(container)) {\n const [, id] = marker.textContent!.match(/\\((\\d+)\\)/)!\n if (getOptionalElement(`li:nth-child(${id})`, el)) {\n annotations.set(id, renderAnnotation(id, prefix))\n marker.replaceWith(annotations.get(id)!)\n }\n }\n\n /* Keep list if there are no annotations to render */\n if (annotations.size === 0)\n return EMPTY\n\n /* Mount component on subscription */\n return defer(() => {\n const done$ = new Subject()\n\n /* Retrieve container pairs for swapping */\n const pairs: [HTMLElement, HTMLElement][] = []\n for (const [id, annotation] of annotations)\n pairs.push([\n getElement(\".md-typeset\", annotation),\n getElement(`li:nth-child(${id})`, el)\n ])\n\n /* Handle print mode - see https://bit.ly/3rgPdpt */\n print$\n .pipe(\n takeUntil(done$.pipe(takeLast(1)))\n )\n .subscribe(active => {\n el.hidden = !active\n\n /* Show annotations in code block or list (print) */\n for (const [inner, child] of pairs)\n if (!active)\n swap(child, inner)\n else\n swap(inner, child)\n })\n\n /* Create and return component */\n return merge(...[...annotations]\n .map(([, annotation]) => (\n mountAnnotation(annotation, container, { target$ })\n ))\n )\n .pipe(\n finalize(() => done$.complete()),\n share()\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n map,\n of,\n shareReplay,\n tap\n} from \"rxjs\"\n\nimport { watchScript } from \"~/browser\"\nimport { h } from \"~/utilities\"\n\nimport { Component } from \"../../../_\"\n\nimport themeCSS from \"./index.css\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mermaid diagram\n */\nexport interface Mermaid {}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Mermaid instance observable\n */\nlet mermaid$: Observable\n\n/**\n * Global sequence number for diagrams\n */\nlet sequence = 0\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch Mermaid script\n *\n * @returns Mermaid scripts observable\n */\nfunction fetchScripts(): Observable {\n return typeof mermaid === \"undefined\" || mermaid instanceof Element\n ? watchScript(\"https://unpkg.com/mermaid@9.1.7/dist/mermaid.min.js\")\n : of(undefined)\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount Mermaid diagram\n *\n * @param el - Code block element\n *\n * @returns Mermaid diagram component observable\n */\nexport function mountMermaid(\n el: HTMLElement\n): Observable> {\n el.classList.remove(\"mermaid\") // Hack: mitigate https://bit.ly/3CiN6Du\n mermaid$ ||= fetchScripts()\n .pipe(\n tap(() => mermaid.initialize({\n startOnLoad: false,\n themeCSS,\n sequence: {\n actorFontSize: \"16px\", // Hack: mitigate https://bit.ly/3y0NEi3\n messageFontSize: \"16px\",\n noteFontSize: \"16px\"\n }\n })),\n map(() => undefined),\n shareReplay(1)\n )\n\n /* Render diagram */\n mermaid$.subscribe(() => {\n el.classList.add(\"mermaid\") // Hack: mitigate https://bit.ly/3CiN6Du\n const id = `__mermaid_${sequence++}`\n const host = h(\"div\", { class: \"mermaid\" })\n mermaid.mermaidAPI.render(id, el.textContent, (svg: string) => {\n\n /* Create a shadow root and inject diagram */\n const shadow = host.attachShadow({ mode: \"closed\" })\n shadow.innerHTML = svg\n\n /* Replace code block with diagram */\n el.replaceWith(host)\n })\n })\n\n /* Create and return component */\n return mermaid$\n .pipe(\n map(() => ({ ref: el }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n defer,\n filter,\n finalize,\n map,\n merge,\n tap\n} from \"rxjs\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Details\n */\nexport interface Details {\n action: \"open\" | \"close\" /* Details state */\n reveal?: boolean /* Details is revealed */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch details\n *\n * @param el - Details element\n * @param options - Options\n *\n * @returns Details observable\n */\nexport function watchDetails(\n el: HTMLDetailsElement, { target$, print$ }: WatchOptions\n): Observable
    {\n let open = true\n return merge(\n\n /* Open and focus details on location target */\n target$\n .pipe(\n map(target => target.closest(\"details:not([open])\")!),\n filter(details => el === details),\n map(() => ({\n action: \"open\", reveal: true\n }) as Details)\n ),\n\n /* Open details on print and close afterwards */\n print$\n .pipe(\n filter(active => active || !open),\n tap(() => open = el.open),\n map(active => ({\n action: active ? \"open\" : \"close\"\n }) as Details)\n )\n )\n}\n\n/**\n * Mount details\n *\n * This function ensures that `details` tags are opened on anchor jumps and\n * prior to printing, so the whole content of the page is visible.\n *\n * @param el - Details element\n * @param options - Options\n *\n * @returns Details component observable\n */\nexport function mountDetails(\n el: HTMLDetailsElement, options: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject
    ()\n push$.subscribe(({ action, reveal }) => {\n el.toggleAttribute(\"open\", action === \"open\")\n if (reveal)\n el.scrollIntoView()\n })\n\n /* Create and return component */\n return watchDetails(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, of } from \"rxjs\"\n\nimport { renderTable } from \"~/templates\"\nimport { h } from \"~/utilities\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Data table\n */\nexport interface DataTable {}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Sentinel for replacement\n */\nconst sentinel = h(\"table\")\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount data table\n *\n * This function wraps a data table in another scrollable container, so it can\n * be smoothly scrolled on smaller screen sizes and won't break the layout.\n *\n * @param el - Data table element\n *\n * @returns Data table component observable\n */\nexport function mountDataTable(\n el: HTMLElement\n): Observable> {\n el.replaceWith(sentinel)\n sentinel.replaceWith(renderTable(el))\n\n /* Create and return component */\n return of({ ref: el })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n animationFrameScheduler,\n asyncScheduler,\n auditTime,\n combineLatest,\n defer,\n finalize,\n fromEvent,\n map,\n merge,\n skip,\n startWith,\n subscribeOn,\n takeLast,\n takeUntil,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n getElement,\n getElementContentOffset,\n getElementContentSize,\n getElementOffset,\n getElementSize,\n getElements,\n watchElementContentOffset,\n watchElementSize\n} from \"~/browser\"\nimport { renderTabbedControl } from \"~/templates\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Content tabs\n */\nexport interface ContentTabs {\n active: HTMLLabelElement /* Active tab label */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch content tabs\n *\n * @param el - Content tabs element\n *\n * @returns Content tabs observable\n */\nexport function watchContentTabs(\n el: HTMLElement\n): Observable {\n const inputs = getElements(\":scope > input\", el)\n const initial = inputs.find(input => input.checked) || inputs[0]\n return merge(...inputs.map(input => fromEvent(input, \"change\")\n .pipe(\n map(() => getElement(`label[for=\"${input.id}\"]`))\n )\n ))\n .pipe(\n startWith(getElement(`label[for=\"${initial.id}\"]`)),\n map(active => ({ active }))\n )\n}\n\n/**\n * Mount content tabs\n *\n * This function scrolls the active tab into view. While this functionality is\n * provided by browsers as part of `scrollInfoView`, browsers will always also\n * scroll the vertical axis, which we do not want. Thus, we decided to provide\n * this functionality ourselves.\n *\n * @param el - Content tabs element\n * @param options - Options\n *\n * @returns Content tabs component observable\n */\nexport function mountContentTabs(\n el: HTMLElement, { viewport$ }: MountOptions\n): Observable> {\n\n /* Render content tab previous button for pagination */\n const prev = renderTabbedControl(\"prev\")\n el.append(prev)\n\n /* Render content tab next button for pagination */\n const next = renderTabbedControl(\"next\")\n el.append(next)\n\n /* Mount component on subscription */\n const container = getElement(\".tabbed-labels\", el)\n return defer(() => {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n combineLatest([push$, watchElementSize(el)])\n .pipe(\n auditTime(1, animationFrameScheduler),\n takeUntil(done$)\n )\n .subscribe({\n\n /* Handle emission */\n next([{ active }, size]) {\n const offset = getElementOffset(active)\n const { width } = getElementSize(active)\n\n /* Set tab indicator offset and width */\n el.style.setProperty(\"--md-indicator-x\", `${offset.x}px`)\n el.style.setProperty(\"--md-indicator-width\", `${width}px`)\n\n /* Scroll container to active content tab */\n const content = getElementContentOffset(container)\n if (\n offset.x < content.x ||\n offset.x + width > content.x + size.width\n )\n container.scrollTo({\n left: Math.max(0, offset.x - 16),\n behavior: \"smooth\"\n })\n },\n\n /* Handle complete */\n complete() {\n el.style.removeProperty(\"--md-indicator-x\")\n el.style.removeProperty(\"--md-indicator-width\")\n }\n })\n\n /* Hide content tab buttons on borders */\n combineLatest([\n watchElementContentOffset(container),\n watchElementSize(container)\n ])\n .pipe(\n takeUntil(done$)\n )\n .subscribe(([offset, size]) => {\n const content = getElementContentSize(container)\n prev.hidden = offset.x < 16\n next.hidden = offset.x > content.width - size.width - 16\n })\n\n /* Paginate content tab container on click */\n merge(\n fromEvent(prev, \"click\").pipe(map(() => -1)),\n fromEvent(next, \"click\").pipe(map(() => +1))\n )\n .pipe(\n takeUntil(done$)\n )\n .subscribe(direction => {\n const { width } = getElementSize(container)\n container.scrollBy({\n left: width * direction,\n behavior: \"smooth\"\n })\n })\n\n /* Set up linking of content tabs, if enabled */\n if (feature(\"content.tabs.link\"))\n push$.pipe(\n skip(1),\n withLatestFrom(viewport$)\n )\n .subscribe(([{ active }, { offset }]) => {\n const tab = active.innerText.trim()\n if (active.hasAttribute(\"data-md-switching\")) {\n active.removeAttribute(\"data-md-switching\")\n\n /* Determine viewport offset of active tab */\n } else {\n const y = el.offsetTop - offset.y\n\n /* Passively activate other tabs */\n for (const set of getElements(\"[data-tabs]\"))\n for (const input of getElements(\n \":scope > input\", set\n )) {\n const label = getElement(`label[for=\"${input.id}\"]`)\n if (\n label !== active &&\n label.innerText.trim() === tab\n ) {\n label.setAttribute(\"data-md-switching\", \"\")\n input.click()\n break\n }\n }\n\n /* Bring active tab into view */\n window.scrollTo({\n top: el.offsetTop - y\n })\n\n /* Persist active tabs in local storage */\n const tabs = __md_get(\"__tabs\") || []\n __md_set(\"__tabs\", [...new Set([tab, ...tabs])])\n }\n })\n\n /* Create and return component */\n return watchContentTabs(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n .pipe(\n subscribeOn(asyncScheduler)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, merge } from \"rxjs\"\n\nimport { Viewport, getElements } from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { Annotation } from \"../annotation\"\nimport {\n CodeBlock,\n Mermaid,\n mountCodeBlock,\n mountMermaid\n} from \"../code\"\nimport {\n Details,\n mountDetails\n} from \"../details\"\nimport {\n DataTable,\n mountDataTable\n} from \"../table\"\nimport {\n ContentTabs,\n mountContentTabs\n} from \"../tabs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Content\n */\nexport type Content =\n | Annotation\n | ContentTabs\n | CodeBlock\n | Mermaid\n | DataTable\n | Details\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount content\n *\n * This function mounts all components that are found in the content of the\n * actual article, including code blocks, data tables and details.\n *\n * @param el - Content element\n * @param options - Options\n *\n * @returns Content component observable\n */\nexport function mountContent(\n el: HTMLElement, { viewport$, target$, print$ }: MountOptions\n): Observable> {\n return merge(\n\n /* Code blocks */\n ...getElements(\"pre:not(.mermaid) > code\", el)\n .map(child => mountCodeBlock(child, { target$, print$ })),\n\n /* Mermaid diagrams */\n ...getElements(\"pre.mermaid\", el)\n .map(child => mountMermaid(child)),\n\n /* Data tables */\n ...getElements(\"table:not([class])\", el)\n .map(child => mountDataTable(child)),\n\n /* Details */\n ...getElements(\"details\", el)\n .map(child => mountDetails(child, { target$, print$ })),\n\n /* Content tabs */\n ...getElements(\"[data-tabs]\", el)\n .map(child => mountContentTabs(child, { viewport$ }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n defer,\n delay,\n finalize,\n map,\n merge,\n of,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport { getElement } from \"~/browser\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Dialog\n */\nexport interface Dialog {\n message: string /* Dialog message */\n active: boolean /* Dialog is active */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n alert$: Subject /* Alert subject */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n alert$: Subject /* Alert subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch dialog\n *\n * @param _el - Dialog element\n * @param options - Options\n *\n * @returns Dialog observable\n */\nexport function watchDialog(\n _el: HTMLElement, { alert$ }: WatchOptions\n): Observable {\n return alert$\n .pipe(\n switchMap(message => merge(\n of(true),\n of(false).pipe(delay(2000))\n )\n .pipe(\n map(active => ({ message, active }))\n )\n )\n )\n}\n\n/**\n * Mount dialog\n *\n * This function reveals the dialog in the right corner when a new alert is\n * emitted through the subject that is passed as part of the options.\n *\n * @param el - Dialog element\n * @param options - Options\n *\n * @returns Dialog component observable\n */\nexport function mountDialog(\n el: HTMLElement, options: MountOptions\n): Observable> {\n const inner = getElement(\".md-typeset\", el)\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ message, active }) => {\n el.classList.toggle(\"md-dialog--active\", active)\n inner.textContent = message\n })\n\n /* Create and return component */\n return watchDialog(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n combineLatest,\n combineLatestWith,\n defer,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n map,\n of,\n shareReplay,\n startWith,\n switchMap,\n takeLast,\n takeUntil\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n watchElementSize,\n watchToggle\n} from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { Main } from \"../../main\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Header\n */\nexport interface Header {\n height: number /* Header visible height */\n hidden: boolean /* Header is hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n main$: Observable
    /* Main area observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Compute whether the header is hidden\n *\n * If the user scrolls past a certain threshold, the header can be hidden when\n * scrolling down, and shown when scrolling up.\n *\n * @param options - Options\n *\n * @returns Toggle observable\n */\nfunction isHidden({ viewport$ }: WatchOptions): Observable {\n if (!feature(\"header.autohide\"))\n return of(false)\n\n /* Compute direction and turning point */\n const direction$ = viewport$\n .pipe(\n map(({ offset: { y } }) => y),\n bufferCount(2, 1),\n map(([a, b]) => [a < b, b] as const),\n distinctUntilKeyChanged(0)\n )\n\n /* Compute whether header should be hidden */\n const hidden$ = combineLatest([viewport$, direction$])\n .pipe(\n filter(([{ offset }, [, y]]) => Math.abs(y - offset.y) > 100),\n map(([, [direction]]) => direction),\n distinctUntilChanged()\n )\n\n /* Compute threshold for hiding */\n const search$ = watchToggle(\"search\")\n return combineLatest([viewport$, search$])\n .pipe(\n map(([{ offset }, search]) => offset.y > 400 && !search),\n distinctUntilChanged(),\n switchMap(active => active ? hidden$ : of(false)),\n startWith(false)\n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch header\n *\n * @param el - Header element\n * @param options - Options\n *\n * @returns Header observable\n */\nexport function watchHeader(\n el: HTMLElement, options: WatchOptions\n): Observable
    {\n return defer(() => combineLatest([\n watchElementSize(el),\n isHidden(options)\n ]))\n .pipe(\n map(([{ height }, hidden]) => ({\n height,\n hidden\n })),\n distinctUntilChanged((a, b) => (\n a.height === b.height &&\n a.hidden === b.hidden\n )),\n shareReplay(1)\n )\n}\n\n/**\n * Mount header\n *\n * This function manages the different states of the header, i.e. whether it's\n * hidden or rendered with a shadow. This depends heavily on the main area.\n *\n * @param el - Header element\n * @param options - Options\n *\n * @returns Header component observable\n */\nexport function mountHeader(\n el: HTMLElement, { header$, main$ }: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject
    ()\n const done$ = push$.pipe(takeLast(1))\n push$\n .pipe(\n distinctUntilKeyChanged(\"active\"),\n combineLatestWith(header$)\n )\n .subscribe(([{ active }, { hidden }]) => {\n el.classList.toggle(\"md-header--shadow\", active && !hidden)\n el.hidden = hidden\n })\n\n /* Link to main area */\n main$.subscribe(push$)\n\n /* Create and return component */\n return header$\n .pipe(\n takeUntil(done$),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n distinctUntilKeyChanged,\n finalize,\n map,\n tap\n} from \"rxjs\"\n\nimport {\n Viewport,\n getElementSize,\n getOptionalElement,\n watchViewportAt\n} from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { Header } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Header\n */\nexport interface HeaderTitle {\n active: boolean /* Header title is active */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch header title\n *\n * @param el - Heading element\n * @param options - Options\n *\n * @returns Header title observable\n */\nexport function watchHeaderTitle(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n return watchViewportAt(el, { viewport$, header$ })\n .pipe(\n map(({ offset: { y } }) => {\n const { height } = getElementSize(el)\n return {\n active: y >= height\n }\n }),\n distinctUntilKeyChanged(\"active\")\n )\n}\n\n/**\n * Mount header title\n *\n * This function swaps the header title from the site title to the title of the\n * current page when the user scrolls past the first headline.\n *\n * @param el - Header title element\n * @param options - Options\n *\n * @returns Header title component observable\n */\nexport function mountHeaderTitle(\n el: HTMLElement, options: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ active }) => {\n el.classList.toggle(\"md-header__title--active\", active)\n })\n\n /* Obtain headline, if any */\n const heading = getOptionalElement(\"article h1\")\n if (typeof heading === \"undefined\")\n return EMPTY\n\n /* Create and return component */\n return watchHeaderTitle(heading, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n map,\n switchMap\n} from \"rxjs\"\n\nimport {\n Viewport,\n watchElementSize\n} from \"~/browser\"\n\nimport { Header } from \"../header\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Main area\n */\nexport interface Main {\n offset: number /* Main area top offset */\n height: number /* Main area visible height */\n active: boolean /* Main area is active */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch main area\n *\n * This function returns an observable that computes the visual parameters of\n * the main area which depends on the viewport vertical offset and height, as\n * well as the height of the header element, if the header is fixed.\n *\n * @param el - Main area element\n * @param options - Options\n *\n * @returns Main area observable\n */\nexport function watchMain(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable
    {\n\n /* Compute necessary adjustment for header */\n const adjust$ = header$\n .pipe(\n map(({ height }) => height),\n distinctUntilChanged()\n )\n\n /* Compute the main area's top and bottom borders */\n const border$ = adjust$\n .pipe(\n switchMap(() => watchElementSize(el)\n .pipe(\n map(({ height }) => ({\n top: el.offsetTop,\n bottom: el.offsetTop + height\n })),\n distinctUntilKeyChanged(\"bottom\")\n )\n )\n )\n\n /* Compute the main area's offset, visible height and if we scrolled past */\n return combineLatest([adjust$, border$, viewport$])\n .pipe(\n map(([header, { top, bottom }, { offset: { y }, size: { height } }]) => {\n height = Math.max(0, height\n - Math.max(0, top - y, header)\n - Math.max(0, height + y - bottom)\n )\n return {\n offset: top - header,\n height,\n active: top - header <= y\n }\n }),\n distinctUntilChanged((a, b) => (\n a.offset === b.offset &&\n a.height === b.height &&\n a.active === b.active\n ))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n asyncScheduler,\n defer,\n finalize,\n fromEvent,\n map,\n mergeMap,\n observeOn,\n of,\n shareReplay,\n startWith,\n tap\n} from \"rxjs\"\n\nimport { getElements } from \"~/browser\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Palette colors\n */\nexport interface PaletteColor {\n scheme?: string /* Color scheme */\n primary?: string /* Primary color */\n accent?: string /* Accent color */\n}\n\n/**\n * Palette\n */\nexport interface Palette {\n index: number /* Palette index */\n color: PaletteColor /* Palette colors */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch color palette\n *\n * @param inputs - Color palette element\n *\n * @returns Color palette observable\n */\nexport function watchPalette(\n inputs: HTMLInputElement[]\n): Observable {\n const current = __md_get(\"__palette\") || {\n index: inputs.findIndex(input => matchMedia(\n input.getAttribute(\"data-md-color-media\")!\n ).matches)\n }\n\n /* Emit changes in color palette */\n return of(...inputs)\n .pipe(\n mergeMap(input => fromEvent(input, \"change\")\n .pipe(\n map(() => input)\n )\n ),\n startWith(inputs[Math.max(0, current.index)]),\n map(input => ({\n index: inputs.indexOf(input),\n color: {\n scheme: input.getAttribute(\"data-md-color-scheme\"),\n primary: input.getAttribute(\"data-md-color-primary\"),\n accent: input.getAttribute(\"data-md-color-accent\")\n }\n } as Palette)),\n shareReplay(1)\n )\n}\n\n/**\n * Mount color palette\n *\n * @param el - Color palette element\n *\n * @returns Color palette component observable\n */\nexport function mountPalette(\n el: HTMLElement\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(palette => {\n document.body.setAttribute(\"data-md-color-switching\", \"\")\n\n /* Set color palette */\n for (const [key, value] of Object.entries(palette.color))\n document.body.setAttribute(`data-md-color-${key}`, value)\n\n /* Toggle visibility */\n for (let index = 0; index < inputs.length; index++) {\n const label = inputs[index].nextElementSibling\n if (label instanceof HTMLElement)\n label.hidden = palette.index !== index\n }\n\n /* Persist preference in local storage */\n __md_set(\"__palette\", palette)\n })\n\n /* Revert transition durations after color switch */\n push$.pipe(observeOn(asyncScheduler))\n .subscribe(() => {\n document.body.removeAttribute(\"data-md-color-switching\")\n })\n\n /* Create and return component */\n const inputs = getElements(\"input\", el)\n return watchPalette(inputs)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ClipboardJS from \"clipboard\"\nimport {\n Observable,\n Subject,\n map,\n tap\n} from \"rxjs\"\n\nimport { translation } from \"~/_\"\nimport { getElement } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n alert$: Subject /* Alert subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Extract text to copy\n *\n * @param el - HTML element\n *\n * @returns Extracted text\n */\nfunction extract(el: HTMLElement): string {\n el.setAttribute(\"data-md-copying\", \"\")\n const text = el.innerText\n el.removeAttribute(\"data-md-copying\")\n return text\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up Clipboard.js integration\n *\n * @param options - Options\n */\nexport function setupClipboardJS(\n { alert$ }: SetupOptions\n): void {\n if (ClipboardJS.isSupported()) {\n new Observable(subscriber => {\n new ClipboardJS(\"[data-clipboard-target], [data-clipboard-text]\", {\n text: el => (\n el.getAttribute(\"data-clipboard-text\")! ||\n extract(getElement(\n el.getAttribute(\"data-clipboard-target\")!\n ))\n )\n })\n .on(\"success\", ev => subscriber.next(ev))\n })\n .pipe(\n tap(ev => {\n const trigger = ev.trigger as HTMLElement\n trigger.focus()\n }),\n map(() => translation(\"clipboard.copied\"))\n )\n .subscribe(alert$)\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n catchError,\n defaultIfEmpty,\n map,\n of,\n tap\n} from \"rxjs\"\n\nimport { configuration } from \"~/_\"\nimport { getElements, requestXML } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Sitemap, i.e. a list of URLs\n */\nexport type Sitemap = string[]\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Preprocess a list of URLs\n *\n * This function replaces the `site_url` in the sitemap with the actual base\n * URL, to allow instant loading to work in occasions like Netlify previews.\n *\n * @param urls - URLs\n *\n * @returns URL path parts\n */\nfunction preprocess(urls: Sitemap): Sitemap {\n if (urls.length < 2)\n return [\"\"]\n\n /* Take the first two URLs and remove everything after the last slash */\n const [root, next] = [...urls]\n .sort((a, b) => a.length - b.length)\n .map(url => url.replace(/[^/]+$/, \"\"))\n\n /* Compute common prefix */\n let index = 0\n if (root === next)\n index = root.length\n else\n while (root.charCodeAt(index) === next.charCodeAt(index))\n index++\n\n /* Remove common prefix and return in original order */\n return urls.map(url => url.replace(root.slice(0, index), \"\"))\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch the sitemap for the given base URL\n *\n * @param base - Base URL\n *\n * @returns Sitemap observable\n */\nexport function fetchSitemap(base?: URL): Observable {\n const cached = __md_get(\"__sitemap\", sessionStorage, base)\n if (cached) {\n return of(cached)\n } else {\n const config = configuration()\n return requestXML(new URL(\"sitemap.xml\", base || config.base))\n .pipe(\n map(sitemap => preprocess(getElements(\"loc\", sitemap)\n .map(node => node.textContent!)\n )),\n catchError(() => EMPTY), // @todo refactor instant loading\n defaultIfEmpty([]),\n tap(sitemap => __md_set(\"__sitemap\", sitemap, sessionStorage, base))\n )\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n bufferCount,\n catchError,\n concatMap,\n debounceTime,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n fromEvent,\n map,\n merge,\n of,\n sample,\n share,\n skip,\n skipUntil,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"~/_\"\nimport {\n Viewport,\n ViewportOffset,\n getElements,\n getOptionalElement,\n request,\n setLocation,\n setLocationHash\n} from \"~/browser\"\nimport { getComponentElement } from \"~/components\"\nimport { h } from \"~/utilities\"\n\nimport { fetchSitemap } from \"../sitemap\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * History state\n */\nexport interface HistoryState {\n url: URL /* State URL */\n offset?: ViewportOffset /* State viewport offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n document$: Subject /* Document subject */\n location$: Subject /* Location subject */\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up instant loading\n *\n * When fetching, theoretically, we could use `responseType: \"document\"`, but\n * since all MkDocs links are relative, we need to make sure that the current\n * location matches the document we just loaded. Otherwise any relative links\n * in the document could use the old location.\n *\n * This is the reason why we need to synchronize history events and the process\n * of fetching the document for navigation changes (except `popstate` events):\n *\n * 1. Fetch document via `XMLHTTPRequest`\n * 2. Set new location via `history.pushState`\n * 3. Parse and emit fetched document\n *\n * For `popstate` events, we must not use `history.pushState`, or the forward\n * history will be irreversibly overwritten. In case the request fails, the\n * location change is dispatched regularly.\n *\n * @param options - Options\n */\nexport function setupInstantLoading(\n { document$, location$, viewport$ }: SetupOptions\n): void {\n const config = configuration()\n if (location.protocol === \"file:\")\n return\n\n /* Disable automatic scroll restoration */\n if (\"scrollRestoration\" in history) {\n history.scrollRestoration = \"manual\"\n\n /* Hack: ensure that reloads restore viewport offset */\n fromEvent(window, \"beforeunload\")\n .subscribe(() => {\n history.scrollRestoration = \"auto\"\n })\n }\n\n /* Hack: ensure absolute favicon link to omit 404s when switching */\n const favicon = getOptionalElement(\"link[rel=icon]\")\n if (typeof favicon !== \"undefined\")\n favicon.href = favicon.href\n\n /* Intercept internal navigation */\n const push$ = fetchSitemap()\n .pipe(\n map(paths => paths.map(path => `${new URL(path, config.base)}`)),\n switchMap(urls => fromEvent(document.body, \"click\")\n .pipe(\n filter(ev => !ev.metaKey && !ev.ctrlKey),\n switchMap(ev => {\n if (ev.target instanceof Element) {\n const el = ev.target.closest(\"a\")\n if (el && !el.target) {\n const url = new URL(el.href)\n\n /* Canonicalize URL */\n url.search = \"\"\n url.hash = \"\"\n\n /* Check if URL should be intercepted */\n if (\n url.pathname !== location.pathname &&\n urls.includes(url.toString())\n ) {\n ev.preventDefault()\n return of({\n url: new URL(el.href)\n })\n }\n }\n }\n return NEVER\n })\n )\n ),\n share()\n )\n\n /* Intercept history back and forward */\n const pop$ = fromEvent(window, \"popstate\")\n .pipe(\n filter(ev => ev.state !== null),\n map(ev => ({\n url: new URL(location.href),\n offset: ev.state\n })),\n share()\n )\n\n /* Emit location change */\n merge(push$, pop$)\n .pipe(\n distinctUntilChanged((a, b) => a.url.href === b.url.href),\n map(({ url }) => url)\n )\n .subscribe(location$)\n\n /* Fetch document via `XMLHTTPRequest` */\n const response$ = location$\n .pipe(\n distinctUntilKeyChanged(\"pathname\"),\n switchMap(url => request(url.href)\n .pipe(\n catchError(() => {\n setLocation(url)\n return NEVER\n })\n )\n ),\n share()\n )\n\n /* Set new location via `history.pushState` */\n push$\n .pipe(\n sample(response$)\n )\n .subscribe(({ url }) => {\n history.pushState({}, \"\", `${url}`)\n })\n\n /* Parse and emit fetched document */\n const dom = new DOMParser()\n response$\n .pipe(\n switchMap(res => res.text()),\n map(res => dom.parseFromString(res, \"text/html\"))\n )\n .subscribe(document$)\n\n /* Replace meta tags and components */\n document$\n .pipe(\n skip(1)\n )\n .subscribe(replacement => {\n for (const selector of [\n\n /* Meta tags */\n \"title\",\n \"link[rel=canonical]\",\n \"meta[name=author]\",\n \"meta[name=description]\",\n\n /* Components */\n \"[data-md-component=announce]\",\n \"[data-md-component=container]\",\n \"[data-md-component=header-topic]\",\n \"[data-md-component=outdated]\",\n \"[data-md-component=logo]\",\n \"[data-md-component=skip]\",\n ...feature(\"navigation.tabs.sticky\")\n ? [\"[data-md-component=tabs]\"]\n : []\n ]) {\n const source = getOptionalElement(selector)\n const target = getOptionalElement(selector, replacement)\n if (\n typeof source !== \"undefined\" &&\n typeof target !== \"undefined\"\n ) {\n source.replaceWith(target)\n }\n }\n })\n\n /* Re-evaluate scripts */\n document$\n .pipe(\n skip(1),\n map(() => getComponentElement(\"container\")),\n switchMap(el => getElements(\"script\", el)),\n concatMap(el => {\n const script = h(\"script\")\n if (el.src) {\n for (const name of el.getAttributeNames())\n script.setAttribute(name, el.getAttribute(name)!)\n el.replaceWith(script)\n\n /* Complete when script is loaded */\n return new Observable(observer => {\n script.onload = () => observer.complete()\n })\n\n /* Complete immediately */\n } else {\n script.textContent = el.textContent\n el.replaceWith(script)\n return EMPTY\n }\n })\n )\n .subscribe()\n\n /* Emit history state change */\n merge(push$, pop$)\n .pipe(\n sample(document$)\n )\n .subscribe(({ url, offset }) => {\n if (url.hash && !offset) {\n setLocationHash(url.hash)\n } else {\n window.scrollTo(0, offset?.y || 0)\n }\n })\n\n /* Debounce update of viewport offset */\n viewport$\n .pipe(\n skipUntil(push$),\n debounceTime(250),\n distinctUntilKeyChanged(\"offset\")\n )\n .subscribe(({ offset }) => {\n history.replaceState(offset, \"\")\n })\n\n /* Set viewport offset from history */\n merge(push$, pop$)\n .pipe(\n bufferCount(2, 1),\n filter(([a, b]) => a.url.pathname === b.url.pathname),\n map(([, state]) => state)\n )\n .subscribe(({ offset }) => {\n window.scrollTo(0, offset?.y || 0)\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexDocument } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search document\n */\nexport interface SearchDocument extends SearchIndexDocument {\n parent?: SearchIndexDocument /* Parent article */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search document mapping\n */\nexport type SearchDocumentMap = Map\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search document mapping\n *\n * @param docs - Search index documents\n *\n * @returns Search document map\n */\nexport function setupSearchDocumentMap(\n docs: SearchIndexDocument[]\n): SearchDocumentMap {\n const documents = new Map()\n const parents = new Set()\n for (const doc of docs) {\n const [path, hash] = doc.location.split(\"#\")\n\n /* Extract location, title and tags */\n const location = doc.location\n const title = doc.title\n const tags = doc.tags\n\n /* Escape and cleanup text */\n const text = escapeHTML(doc.text)\n .replace(/\\s+(?=[,.:;!?])/g, \"\")\n .replace(/\\s+/g, \" \")\n\n /* Handle section */\n if (hash) {\n const parent = documents.get(path)!\n\n /* Ignore first section, override article */\n if (!parents.has(parent)) {\n parent.title = doc.title\n parent.text = text\n\n /* Remember that we processed the article */\n parents.add(parent)\n\n /* Add subsequent section */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n parent\n })\n }\n\n /* Add article */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n ...tags && { tags }\n })\n }\n }\n return documents\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexConfig } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search highlight function\n *\n * @param value - Value\n *\n * @returns Highlighted value\n */\nexport type SearchHighlightFn = (value: string) => string\n\n/**\n * Search highlight factory function\n *\n * @param query - Query value\n *\n * @returns Search highlight function\n */\nexport type SearchHighlightFactoryFn = (query: string) => SearchHighlightFn\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search highlighter\n *\n * @param config - Search index configuration\n * @param escape - Whether to escape HTML\n *\n * @returns Search highlight factory function\n */\nexport function setupSearchHighlighter(\n config: SearchIndexConfig, escape: boolean\n): SearchHighlightFactoryFn {\n const separator = new RegExp(config.separator, \"img\")\n const highlight = (_: unknown, data: string, term: string) => {\n return `${data}${term}`\n }\n\n /* Return factory function */\n return (query: string) => {\n query = query\n .replace(/[\\s*+\\-:~^]+/g, \" \")\n .trim()\n\n /* Create search term match expression */\n const match = new RegExp(`(^|${config.separator})(${\n query\n .replace(/[|\\\\{}()[\\]^$+*?.-]/g, \"\\\\$&\")\n .replace(separator, \"|\")\n })`, \"img\")\n\n /* Highlight string value */\n return value => (\n escape\n ? escapeHTML(value)\n : value\n )\n .replace(match, highlight)\n .replace(/<\\/mark>(\\s+)]*>/img, \"$1\")\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search transformation function\n *\n * @param value - Query value\n *\n * @returns Transformed query value\n */\nexport type SearchTransformFn = (value: string) => string\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Default transformation function\n *\n * 1. Search for terms in quotation marks and prepend a `+` modifier to denote\n * that the resulting document must contain all terms, converting the query\n * to an `AND` query (as opposed to the default `OR` behavior). While users\n * may expect terms enclosed in quotation marks to map to span queries, i.e.\n * for which order is important, Lunr.js doesn't support them, so the best\n * we can do is to convert the terms to an `AND` query.\n *\n * 2. Replace control characters which are not located at the beginning of the\n * query or preceded by white space, or are not followed by a non-whitespace\n * character or are at the end of the query string. Furthermore, filter\n * unmatched quotation marks.\n *\n * 3. Trim excess whitespace from left and right.\n *\n * @param query - Query value\n *\n * @returns Transformed query value\n */\nexport function defaultTransform(query: string): string {\n return query\n .split(/\"([^\"]+)\"/g) /* => 1 */\n .map((terms, index) => index & 1\n ? terms.replace(/^\\b|^(?![^\\x00-\\x7F]|$)|\\s+/g, \" +\")\n : terms\n )\n .join(\"\")\n .replace(/\"|(?:^|\\s+)[*+\\-:^~]+(?=\\s+|$)/g, \"\") /* => 2 */\n .trim() /* => 3 */\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { SearchIndex, SearchResult } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search message type\n */\nexport const enum SearchMessageType {\n SETUP, /* Search index setup */\n READY, /* Search index ready */\n QUERY, /* Search query */\n RESULT /* Search results */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Message containing the data necessary to setup the search index\n */\nexport interface SearchSetupMessage {\n type: SearchMessageType.SETUP /* Message type */\n data: SearchIndex /* Message data */\n}\n\n/**\n * Message indicating the search index is ready\n */\nexport interface SearchReadyMessage {\n type: SearchMessageType.READY /* Message type */\n}\n\n/**\n * Message containing a search query\n */\nexport interface SearchQueryMessage {\n type: SearchMessageType.QUERY /* Message type */\n data: string /* Message data */\n}\n\n/**\n * Message containing results for a search query\n */\nexport interface SearchResultMessage {\n type: SearchMessageType.RESULT /* Message type */\n data: SearchResult /* Message data */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Message exchanged with the search worker\n */\nexport type SearchMessage =\n | SearchSetupMessage\n | SearchReadyMessage\n | SearchQueryMessage\n | SearchResultMessage\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Type guard for search setup messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchSetupMessage(\n message: SearchMessage\n): message is SearchSetupMessage {\n return message.type === SearchMessageType.SETUP\n}\n\n/**\n * Type guard for search ready messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchReadyMessage(\n message: SearchMessage\n): message is SearchReadyMessage {\n return message.type === SearchMessageType.READY\n}\n\n/**\n * Type guard for search query messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchQueryMessage(\n message: SearchMessage\n): message is SearchQueryMessage {\n return message.type === SearchMessageType.QUERY\n}\n\n/**\n * Type guard for search result messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchResultMessage(\n message: SearchMessage\n): message is SearchResultMessage {\n return message.type === SearchMessageType.RESULT\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n ObservableInput,\n Subject,\n from,\n map,\n share\n} from \"rxjs\"\n\nimport { configuration, feature, translation } from \"~/_\"\nimport { WorkerHandler, watchWorker } from \"~/browser\"\n\nimport { SearchIndex } from \"../../_\"\nimport {\n SearchOptions,\n SearchPipeline\n} from \"../../options\"\nimport {\n SearchMessage,\n SearchMessageType,\n SearchSetupMessage,\n isSearchResultMessage\n} from \"../message\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search worker\n */\nexport type SearchWorker = WorkerHandler\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up search index\n *\n * @param data - Search index\n *\n * @returns Search index\n */\nfunction setupSearchIndex({ config, docs }: SearchIndex): SearchIndex {\n\n /* Override default language with value from translation */\n if (config.lang.length === 1 && config.lang[0] === \"en\")\n config.lang = [\n translation(\"search.config.lang\")\n ]\n\n /* Override default separator with value from translation */\n if (config.separator === \"[\\\\s\\\\-]+\")\n config.separator = translation(\"search.config.separator\")\n\n /* Set pipeline from translation */\n const pipeline = translation(\"search.config.pipeline\")\n .split(/\\s*,\\s*/)\n .filter(Boolean) as SearchPipeline\n\n /* Determine search options */\n const options: SearchOptions = {\n pipeline,\n suggestions: feature(\"search.suggest\")\n }\n\n /* Return search index after defaulting */\n return { config, docs, options }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up search worker\n *\n * This function creates a web worker to set up and query the search index,\n * which is done using Lunr.js. The index must be passed as an observable to\n * enable hacks like _localsearch_ via search index embedding as JSON.\n *\n * @param url - Worker URL\n * @param index - Search index observable input\n *\n * @returns Search worker\n */\nexport function setupSearchWorker(\n url: string, index: ObservableInput\n): SearchWorker {\n const config = configuration()\n const worker = new Worker(url)\n\n /* Create communication channels and resolve relative links */\n const tx$ = new Subject()\n const rx$ = watchWorker(worker, { tx$ })\n .pipe(\n map(message => {\n if (isSearchResultMessage(message)) {\n for (const result of message.data.items)\n for (const document of result)\n document.location = `${new URL(document.location, config.base)}`\n }\n return message\n }),\n share()\n )\n\n /* Set up search index */\n from(index)\n .pipe(\n map(data => ({\n type: SearchMessageType.SETUP,\n data: setupSearchIndex(data)\n } as SearchSetupMessage))\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Return search worker */\n return { tx$, rx$ }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Subject,\n catchError,\n combineLatest,\n filter,\n fromEvent,\n map,\n of,\n switchMap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { configuration } from \"~/_\"\nimport {\n getElement,\n getLocation,\n requestJSON,\n setLocation\n} from \"~/browser\"\nimport { getComponentElements } from \"~/components\"\nimport {\n Version,\n renderVersionSelector\n} from \"~/templates\"\n\nimport { fetchSitemap } from \"../sitemap\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n document$: Subject /* Document subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up version selector\n *\n * @param options - Options\n */\nexport function setupVersionSelector(\n { document$ }: SetupOptions\n): void {\n const config = configuration()\n const versions$ = requestJSON(\n new URL(\"../versions.json\", config.base)\n )\n .pipe(\n catchError(() => EMPTY) // @todo refactor instant loading\n )\n\n /* Determine current version */\n const current$ = versions$\n .pipe(\n map(versions => {\n const [, current] = config.base.match(/([^/]+)\\/?$/)!\n return versions.find(({ version, aliases }) => (\n version === current || aliases.includes(current)\n )) || versions[0]\n })\n )\n\n /* Intercept inter-version navigation */\n versions$\n .pipe(\n map(versions => new Map(versions.map(version => [\n `${new URL(`../${version.version}/`, config.base)}`,\n version\n ]))),\n switchMap(urls => fromEvent(document.body, \"click\")\n .pipe(\n filter(ev => !ev.metaKey && !ev.ctrlKey),\n withLatestFrom(current$),\n switchMap(([ev, current]) => {\n if (ev.target instanceof Element) {\n const el = ev.target.closest(\"a\")\n if (el && !el.target && urls.has(el.href)) {\n const url = el.href\n // This is a temporary hack to detect if a version inside the\n // version selector or on another part of the site was clicked.\n // If we're inside the version selector, we definitely want to\n // find the same page, as we might have different deployments\n // due to aliases. However, if we're outside the version\n // selector, we must abort here, because we might otherwise\n // interfere with instant loading. We need to refactor this\n // at some point together with instant loading.\n //\n // See https://github.com/squidfunk/mkdocs-material/issues/4012\n if (!ev.target.closest(\".md-version\")) {\n const version = urls.get(url)!\n if (version === current)\n return EMPTY\n }\n ev.preventDefault()\n return of(url)\n }\n }\n return EMPTY\n }),\n switchMap(url => {\n const { version } = urls.get(url)!\n return fetchSitemap(new URL(url))\n .pipe(\n map(sitemap => {\n const location = getLocation()\n const path = location.href.replace(config.base, \"\")\n return sitemap.includes(path.split(\"#\")[0])\n ? new URL(`../${version}/${path}`, config.base)\n : new URL(url)\n })\n )\n })\n )\n )\n )\n .subscribe(url => setLocation(url))\n\n /* Render version selector and warning */\n combineLatest([versions$, current$])\n .subscribe(([versions, current]) => {\n const topic = getElement(\".md-header__topic\")\n topic.appendChild(renderVersionSelector(versions, current))\n })\n\n /* Integrate outdated version banner with instant loading */\n document$.pipe(switchMap(() => current$))\n .subscribe(current => {\n\n /* Check if version state was already determined */\n let outdated = __md_get(\"__outdated\", sessionStorage)\n if (outdated === null) {\n const latest = config.version?.default || \"latest\"\n outdated = !current.aliases.includes(latest)\n\n /* Persist version state in session storage */\n __md_set(\"__outdated\", outdated, sessionStorage)\n }\n\n /* Unhide outdated version banner */\n if (outdated)\n for (const warning of getComponentElements(\"outdated\"))\n warning.hidden = false\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n combineLatest,\n delay,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n finalize,\n fromEvent,\n map,\n merge,\n share,\n shareReplay,\n startWith,\n take,\n takeLast,\n takeUntil,\n tap\n} from \"rxjs\"\n\nimport { translation } from \"~/_\"\nimport {\n getLocation,\n setToggle,\n watchElementFocus,\n watchToggle\n} from \"~/browser\"\nimport {\n SearchMessageType,\n SearchQueryMessage,\n SearchWorker,\n defaultTransform,\n isSearchReadyMessage\n} from \"~/integrations\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search query\n */\nexport interface SearchQuery {\n value: string /* Query value */\n focus: boolean /* Query focus */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch search query\n *\n * Note that the focus event which triggers re-reading the current query value\n * is delayed by `1ms` so the input's empty state is allowed to propagate.\n *\n * @param el - Search query element\n * @param worker - Search worker\n *\n * @returns Search query observable\n */\nexport function watchSearchQuery(\n el: HTMLInputElement, { rx$ }: SearchWorker\n): Observable {\n const fn = __search?.transform || defaultTransform\n\n /* Immediately show search dialog */\n const { searchParams } = getLocation()\n if (searchParams.has(\"q\"))\n setToggle(\"search\", true)\n\n /* Intercept query parameter (deep link) */\n const param$ = rx$\n .pipe(\n filter(isSearchReadyMessage),\n take(1),\n map(() => searchParams.get(\"q\") || \"\")\n )\n\n /* Remove query parameter when search is closed */\n watchToggle(\"search\")\n .pipe(\n filter(active => !active),\n take(1)\n )\n .subscribe(() => {\n const url = new URL(location.href)\n url.searchParams.delete(\"q\")\n history.replaceState({}, \"\", `${url}`)\n })\n\n /* Set query from parameter */\n param$.subscribe(value => { // TODO: not ideal - find a better way\n if (value) {\n el.value = value\n el.focus()\n }\n })\n\n /* Intercept focus and input events */\n const focus$ = watchElementFocus(el)\n const value$ = merge(\n fromEvent(el, \"keyup\"),\n fromEvent(el, \"focus\").pipe(delay(1)),\n param$\n )\n .pipe(\n map(() => fn(el.value)),\n startWith(\"\"),\n distinctUntilChanged(),\n )\n\n /* Combine into single observable */\n return combineLatest([value$, focus$])\n .pipe(\n map(([value, focus]) => ({ value, focus })),\n shareReplay(1)\n )\n}\n\n/**\n * Mount search query\n *\n * @param el - Search query element\n * @param worker - Search worker\n *\n * @returns Search query component observable\n */\nexport function mountSearchQuery(\n el: HTMLInputElement, { tx$, rx$ }: SearchWorker\n): Observable> {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n\n /* Handle value changes */\n push$\n .pipe(\n distinctUntilKeyChanged(\"value\"),\n map(({ value }): SearchQueryMessage => ({\n type: SearchMessageType.QUERY,\n data: value\n }))\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Handle focus changes */\n push$\n .pipe(\n distinctUntilKeyChanged(\"focus\")\n )\n .subscribe(({ focus }) => {\n if (focus) {\n setToggle(\"search\", focus)\n el.placeholder = \"\"\n } else {\n el.placeholder = translation(\"search.placeholder\")\n }\n })\n\n /* Handle reset */\n fromEvent(el.form!, \"reset\")\n .pipe(\n takeUntil(done$)\n )\n .subscribe(() => el.focus())\n\n /* Create and return component */\n return watchSearchQuery(el, { tx$, rx$ })\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state })),\n share()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n filter,\n finalize,\n map,\n merge,\n of,\n skipUntil,\n switchMap,\n take,\n tap,\n withLatestFrom,\n zipWith\n} from \"rxjs\"\n\nimport { translation } from \"~/_\"\nimport {\n getElement,\n watchElementBoundary\n} from \"~/browser\"\nimport {\n SearchResult,\n SearchWorker,\n isSearchReadyMessage,\n isSearchResultMessage\n} from \"~/integrations\"\nimport { renderSearchResultItem } from \"~/templates\"\nimport { round } from \"~/utilities\"\n\nimport { Component } from \"../../_\"\nimport { SearchQuery } from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n query$: Observable /* Search query observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search result list\n *\n * This function performs a lazy rendering of the search results, depending on\n * the vertical offset of the search result container.\n *\n * @param el - Search result list element\n * @param worker - Search worker\n * @param options - Options\n *\n * @returns Search result list component observable\n */\nexport function mountSearchResult(\n el: HTMLElement, { rx$ }: SearchWorker, { query$ }: MountOptions\n): Observable> {\n const push$ = new Subject()\n const boundary$ = watchElementBoundary(el.parentElement!)\n .pipe(\n filter(Boolean)\n )\n\n /* Retrieve nested components */\n const meta = getElement(\":scope > :first-child\", el)\n const list = getElement(\":scope > :last-child\", el)\n\n /* Wait until search is ready */\n const ready$ = rx$\n .pipe(\n filter(isSearchReadyMessage),\n take(1)\n )\n\n /* Update search result metadata */\n push$\n .pipe(\n withLatestFrom(query$),\n skipUntil(ready$)\n )\n .subscribe(([{ items }, { value }]) => {\n if (value) {\n switch (items.length) {\n\n /* No results */\n case 0:\n meta.textContent = translation(\"search.result.none\")\n break\n\n /* One result */\n case 1:\n meta.textContent = translation(\"search.result.one\")\n break\n\n /* Multiple result */\n default:\n meta.textContent = translation(\n \"search.result.other\",\n round(items.length)\n )\n }\n } else {\n meta.textContent = translation(\"search.result.placeholder\")\n }\n })\n\n /* Update search result list */\n push$\n .pipe(\n tap(() => list.innerHTML = \"\"),\n switchMap(({ items }) => merge(\n of(...items.slice(0, 10)),\n of(...items.slice(10))\n .pipe(\n bufferCount(4),\n zipWith(boundary$),\n switchMap(([chunk]) => chunk)\n )\n ))\n )\n .subscribe(result => list.appendChild(\n renderSearchResultItem(result)\n ))\n\n /* Filter search result message */\n const result$ = rx$\n .pipe(\n filter(isSearchResultMessage),\n map(({ data }) => data)\n )\n\n /* Create and return component */\n return result$\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n finalize,\n fromEvent,\n map,\n tap\n} from \"rxjs\"\n\nimport { getLocation } from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { SearchQuery } from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search sharing\n */\nexport interface SearchShare {\n url: URL /* Deep link for sharing */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n query$: Observable /* Search query observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n query$: Observable /* Search query observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search sharing\n *\n * @param _el - Search sharing element\n * @param options - Options\n *\n * @returns Search sharing observable\n */\nexport function watchSearchShare(\n _el: HTMLElement, { query$ }: WatchOptions\n): Observable {\n return query$\n .pipe(\n map(({ value }) => {\n const url = getLocation()\n url.hash = \"\"\n url.searchParams.delete(\"h\")\n url.searchParams.set(\"q\", value)\n return { url }\n })\n )\n}\n\n/**\n * Mount search sharing\n *\n * @param el - Search sharing element\n * @param options - Options\n *\n * @returns Search sharing component observable\n */\nexport function mountSearchShare(\n el: HTMLAnchorElement, options: MountOptions\n): Observable> {\n const push$ = new Subject()\n push$.subscribe(({ url }) => {\n el.setAttribute(\"data-clipboard-text\", el.href)\n el.href = `${url}`\n })\n\n /* Prevent following of link */\n fromEvent(el, \"click\")\n .subscribe(ev => ev.preventDefault())\n\n /* Create and return component */\n return watchSearchShare(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n asyncScheduler,\n combineLatestWith,\n distinctUntilChanged,\n filter,\n finalize,\n fromEvent,\n map,\n merge,\n observeOn,\n tap\n} from \"rxjs\"\n\nimport { Keyboard } from \"~/browser\"\nimport {\n SearchResult,\n SearchWorker,\n isSearchResultMessage\n} from \"~/integrations\"\n\nimport { Component, getComponentElement } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search suggestions\n */\nexport interface SearchSuggest {}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n keyboard$: Observable /* Keyboard observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search suggestions\n *\n * This function will perform a lazy rendering of the search results, depending\n * on the vertical offset of the search result container.\n *\n * @param el - Search result list element\n * @param worker - Search worker\n * @param options - Options\n *\n * @returns Search result list component observable\n */\nexport function mountSearchSuggest(\n el: HTMLElement, { rx$ }: SearchWorker, { keyboard$ }: MountOptions\n): Observable> {\n const push$ = new Subject()\n\n /* Retrieve query component and track all changes */\n const query = getComponentElement(\"search-query\")\n const query$ = merge(\n fromEvent(query, \"keydown\"),\n fromEvent(query, \"focus\")\n )\n .pipe(\n observeOn(asyncScheduler),\n map(() => query.value),\n distinctUntilChanged(),\n )\n\n /* Update search suggestions */\n push$\n .pipe(\n combineLatestWith(query$),\n map(([{ suggestions }, value]) => {\n const words = value.split(/([\\s-]+)/)\n if (suggestions?.length && words[words.length - 1]) {\n const last = suggestions[suggestions.length - 1]\n if (last.startsWith(words[words.length - 1]))\n words[words.length - 1] = last\n } else {\n words.length = 0\n }\n return words\n })\n )\n .subscribe(words => el.innerHTML = words\n .join(\"\")\n .replace(/\\s/g, \" \")\n )\n\n /* Set up search keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => mode === \"search\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Right arrow: accept current suggestion */\n case \"ArrowRight\":\n if (\n el.innerText.length &&\n query.selectionStart === query.value.length\n )\n query.value = el.innerText\n break\n }\n })\n\n /* Filter search result message */\n const result$ = rx$\n .pipe(\n filter(isSearchResultMessage),\n map(({ data }) => data)\n )\n\n /* Create and return component */\n return result$\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(() => ({ ref: el }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n NEVER,\n Observable,\n ObservableInput,\n filter,\n merge,\n mergeWith,\n sample,\n take\n} from \"rxjs\"\n\nimport { configuration } from \"~/_\"\nimport {\n Keyboard,\n getActiveElement,\n getElements,\n setToggle\n} from \"~/browser\"\nimport {\n SearchIndex,\n SearchResult,\n isSearchQueryMessage,\n isSearchReadyMessage,\n setupSearchWorker\n} from \"~/integrations\"\n\nimport {\n Component,\n getComponentElement,\n getComponentElements\n} from \"../../_\"\nimport {\n SearchQuery,\n mountSearchQuery\n} from \"../query\"\nimport { mountSearchResult } from \"../result\"\nimport {\n SearchShare,\n mountSearchShare\n} from \"../share\"\nimport {\n SearchSuggest,\n mountSearchSuggest\n} from \"../suggest\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search\n */\nexport type Search =\n | SearchQuery\n | SearchResult\n | SearchShare\n | SearchSuggest\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n index$: ObservableInput /* Search index observable */\n keyboard$: Observable /* Keyboard observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search\n *\n * This function sets up the search functionality, including the underlying\n * web worker and all keyboard bindings.\n *\n * @param el - Search element\n * @param options - Options\n *\n * @returns Search component observable\n */\nexport function mountSearch(\n el: HTMLElement, { index$, keyboard$ }: MountOptions\n): Observable> {\n const config = configuration()\n try {\n const url = __search?.worker || config.search\n const worker = setupSearchWorker(url, index$)\n\n /* Retrieve query and result components */\n const query = getComponentElement(\"search-query\", el)\n const result = getComponentElement(\"search-result\", el)\n\n /* Re-emit query when search is ready */\n const { tx$, rx$ } = worker\n tx$\n .pipe(\n filter(isSearchQueryMessage),\n sample(rx$.pipe(filter(isSearchReadyMessage))),\n take(1)\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Set up search keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => mode === \"search\")\n )\n .subscribe(key => {\n const active = getActiveElement()\n switch (key.type) {\n\n /* Enter: go to first (best) result */\n case \"Enter\":\n if (active === query) {\n const anchors = new Map()\n for (const anchor of getElements(\n \":first-child [href]\", result\n )) {\n const article = anchor.firstElementChild!\n anchors.set(anchor, parseFloat(\n article.getAttribute(\"data-md-score\")!\n ))\n }\n\n /* Go to result with highest score, if any */\n if (anchors.size) {\n const [[best]] = [...anchors].sort(([, a], [, b]) => b - a)\n best.click()\n }\n\n /* Otherwise omit form submission */\n key.claim()\n }\n break\n\n /* Escape or Tab: close search */\n case \"Escape\":\n case \"Tab\":\n setToggle(\"search\", false)\n query.blur()\n break\n\n /* Vertical arrows: select previous or next search result */\n case \"ArrowUp\":\n case \"ArrowDown\":\n if (typeof active === \"undefined\") {\n query.focus()\n } else {\n const els = [query, ...getElements(\n \":not(details) > [href], summary, details[open] [href]\",\n result\n )]\n const i = Math.max(0, (\n Math.max(0, els.indexOf(active)) + els.length + (\n key.type === \"ArrowUp\" ? -1 : +1\n )\n ) % els.length)\n els[i].focus()\n }\n\n /* Prevent scrolling of page */\n key.claim()\n break\n\n /* All other keys: hand to search query */\n default:\n if (query !== getActiveElement())\n query.focus()\n }\n })\n\n /* Set up global keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\"),\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Open search and select query */\n case \"f\":\n case \"s\":\n case \"/\":\n query.focus()\n query.select()\n\n /* Prevent scrolling of page */\n key.claim()\n break\n }\n })\n\n /* Create and return component */\n const query$ = mountSearchQuery(query, worker)\n const result$ = mountSearchResult(result, worker, { query$ })\n return merge(query$, result$)\n .pipe(\n mergeWith(\n\n /* Search sharing */\n ...getComponentElements(\"search-share\", el)\n .map(child => mountSearchShare(child, { query$ })),\n\n /* Search suggestions */\n ...getComponentElements(\"search-suggest\", el)\n .map(child => mountSearchSuggest(child, worker, { keyboard$ }))\n )\n )\n\n /* Gracefully handle broken search */\n } catch (err) {\n el.hidden = true\n return NEVER\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n ObservableInput,\n combineLatest,\n filter,\n map,\n startWith\n} from \"rxjs\"\n\nimport { getLocation } from \"~/browser\"\nimport {\n SearchIndex,\n setupSearchHighlighter\n} from \"~/integrations\"\nimport { h } from \"~/utilities\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search highlighting\n */\nexport interface SearchHighlight {\n nodes: Map /* Map of replacements */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n index$: ObservableInput /* Search index observable */\n location$: Observable /* Location observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search highlighting\n *\n * @param el - Content element\n * @param options - Options\n *\n * @returns Search highlighting component observable\n */\nexport function mountSearchHiglight(\n el: HTMLElement, { index$, location$ }: MountOptions\n): Observable> {\n return combineLatest([\n index$,\n location$\n .pipe(\n startWith(getLocation()),\n filter(url => !!url.searchParams.get(\"h\"))\n )\n ])\n .pipe(\n map(([index, url]) => setupSearchHighlighter(index.config, true)(\n url.searchParams.get(\"h\")!\n )),\n map(fn => {\n const nodes = new Map()\n\n /* Traverse text nodes and collect matches */\n const it = document.createNodeIterator(el, NodeFilter.SHOW_TEXT)\n for (let node = it.nextNode(); node; node = it.nextNode()) {\n if (node.parentElement?.offsetHeight) {\n const original = node.textContent!\n const replaced = fn(original)\n if (replaced.length > original.length)\n nodes.set(node as ChildNode, replaced)\n }\n }\n\n /* Replace original nodes with matches */\n for (const [node, text] of nodes) {\n const { childNodes } = h(\"span\", null, text)\n node.replaceWith(...Array.from(childNodes))\n }\n\n /* Return component */\n return { ref: el, nodes }\n })\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n animationFrameScheduler,\n auditTime,\n combineLatest,\n defer,\n distinctUntilChanged,\n finalize,\n map,\n observeOn,\n take,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport {\n Viewport,\n getElement,\n getElementContainer,\n getElementOffset,\n getElementSize,\n getElements\n} from \"~/browser\"\n\nimport { Component } from \"../_\"\nimport { Header } from \"../header\"\nimport { Main } from \"../main\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Sidebar\n */\nexport interface Sidebar {\n height: number /* Sidebar height */\n locked: boolean /* Sidebar is locked */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n main$: Observable
    /* Main area observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n main$: Observable
    /* Main area observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch sidebar\n *\n * This function returns an observable that computes the visual parameters of\n * the sidebar which depends on the vertical viewport offset, as well as the\n * height of the main area. When the page is scrolled beyond the header, the\n * sidebar is locked and fills the remaining space.\n *\n * @param el - Sidebar element\n * @param options - Options\n *\n * @returns Sidebar observable\n */\nexport function watchSidebar(\n el: HTMLElement, { viewport$, main$ }: WatchOptions\n): Observable {\n const parent = el.parentElement!\n const adjust =\n parent.offsetTop -\n parent.parentElement!.offsetTop\n\n /* Compute the sidebar's available height and if it should be locked */\n return combineLatest([main$, viewport$])\n .pipe(\n map(([{ offset, height }, { offset: { y } }]) => {\n height = height\n + Math.min(adjust, Math.max(0, y - offset))\n - adjust\n return {\n height,\n locked: y >= offset + adjust\n }\n }),\n distinctUntilChanged((a, b) => (\n a.height === b.height &&\n a.locked === b.locked\n ))\n )\n}\n\n/**\n * Mount sidebar\n *\n * This function doesn't set the height of the actual sidebar, but of its first\n * child \u2013 the `.md-sidebar__scrollwrap` element in order to mitigiate jittery\n * sidebars when the footer is scrolled into view. At some point we switched\n * from `absolute` / `fixed` positioning to `sticky` positioning, significantly\n * reducing jitter in some browsers (respectively Firefox and Safari) when\n * scrolling from the top. However, top-aligned sticky positioning means that\n * the sidebar snaps to the bottom when the end of the container is reached.\n * This is what leads to the mentioned jitter, as the sidebar's height may be\n * updated too slowly.\n *\n * This behaviour can be mitigiated by setting the height of the sidebar to `0`\n * while preserving the padding, and the height on its first element.\n *\n * @param el - Sidebar element\n * @param options - Options\n *\n * @returns Sidebar component observable\n */\nexport function mountSidebar(\n el: HTMLElement, { header$, ...options }: MountOptions\n): Observable> {\n const inner = getElement(\".md-sidebar__scrollwrap\", el)\n const { y } = getElementOffset(inner)\n return defer(() => {\n const push$ = new Subject()\n push$\n .pipe(\n auditTime(0, animationFrameScheduler),\n withLatestFrom(header$)\n )\n .subscribe({\n\n /* Handle emission */\n next([{ height }, { height: offset }]) {\n inner.style.height = `${height - 2 * y}px`\n el.style.top = `${offset}px`\n },\n\n /* Handle complete */\n complete() {\n inner.style.height = \"\"\n el.style.top = \"\"\n }\n })\n\n /* Bring active item into view on initial load */\n push$\n .pipe(\n observeOn(animationFrameScheduler),\n take(1)\n )\n .subscribe(() => {\n for (const item of getElements(\".md-nav__link--active[href]\", el)) {\n const container = getElementContainer(item)\n if (typeof container !== \"undefined\") {\n const offset = item.offsetTop - container.offsetTop\n const { height } = getElementSize(container)\n container.scrollTo({\n top: offset - height / 2\n })\n }\n }\n })\n\n /* Create and return component */\n return watchSidebar(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Repo, User } from \"github-types\"\nimport {\n EMPTY,\n Observable,\n catchError,\n defaultIfEmpty,\n map,\n zip\n} from \"rxjs\"\n\nimport { requestJSON } from \"~/browser\"\n\nimport { SourceFacts } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * GitHub release (partial)\n */\ninterface Release {\n tag_name: string /* Tag name */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch GitHub repository facts\n *\n * @param user - GitHub user or organization\n * @param repo - GitHub repository\n *\n * @returns Repository facts observable\n */\nexport function fetchSourceFactsFromGitHub(\n user: string, repo?: string\n): Observable {\n if (typeof repo !== \"undefined\") {\n const url = `https://api.github.com/repos/${user}/${repo}`\n return zip(\n\n /* Fetch version */\n requestJSON(`${url}/releases/latest`)\n .pipe(\n catchError(() => EMPTY), // @todo refactor instant loading\n map(release => ({\n version: release.tag_name\n })),\n defaultIfEmpty({})\n ),\n\n /* Fetch stars and forks */\n requestJSON(url)\n .pipe(\n catchError(() => EMPTY), // @todo refactor instant loading\n map(info => ({\n stars: info.stargazers_count,\n forks: info.forks_count\n })),\n defaultIfEmpty({})\n )\n )\n .pipe(\n map(([release, info]) => ({ ...release, ...info }))\n )\n\n /* User or organization */\n } else {\n const url = `https://api.github.com/users/${user}`\n return requestJSON(url)\n .pipe(\n map(info => ({\n repositories: info.public_repos\n })),\n defaultIfEmpty({})\n )\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ProjectSchema } from \"gitlab\"\nimport {\n EMPTY,\n Observable,\n catchError,\n defaultIfEmpty,\n map\n} from \"rxjs\"\n\nimport { requestJSON } from \"~/browser\"\n\nimport { SourceFacts } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch GitLab repository facts\n *\n * @param base - GitLab base\n * @param project - GitLab project\n *\n * @returns Repository facts observable\n */\nexport function fetchSourceFactsFromGitLab(\n base: string, project: string\n): Observable {\n const url = `https://${base}/api/v4/projects/${encodeURIComponent(project)}`\n return requestJSON(url)\n .pipe(\n catchError(() => EMPTY), // @todo refactor instant loading\n map(({ star_count, forks_count }) => ({\n stars: star_count,\n forks: forks_count\n })),\n defaultIfEmpty({})\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { EMPTY, Observable } from \"rxjs\"\n\nimport { fetchSourceFactsFromGitHub } from \"../github\"\nimport { fetchSourceFactsFromGitLab } from \"../gitlab\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Repository facts for repositories\n */\nexport interface RepositoryFacts {\n stars?: number /* Number of stars */\n forks?: number /* Number of forks */\n version?: string /* Latest version */\n}\n\n/**\n * Repository facts for organizations\n */\nexport interface OrganizationFacts {\n repositories?: number /* Number of repositories */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Repository facts\n */\nexport type SourceFacts =\n | RepositoryFacts\n | OrganizationFacts\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch repository facts\n *\n * @param url - Repository URL\n *\n * @returns Repository facts observable\n */\nexport function fetchSourceFacts(\n url: string\n): Observable {\n\n /* Try to match GitHub repository */\n let match = url.match(/^.+github\\.com\\/([^/]+)\\/?([^/]+)?/i)\n if (match) {\n const [, user, repo] = match\n return fetchSourceFactsFromGitHub(user, repo)\n }\n\n /* Try to match GitLab repository */\n match = url.match(/^.+?([^/]*gitlab[^/]+)\\/(.+?)\\/?$/i)\n if (match) {\n const [, base, slug] = match\n return fetchSourceFactsFromGitLab(base, slug)\n }\n\n /* Fallback */\n return EMPTY\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n catchError,\n defer,\n filter,\n finalize,\n map,\n of,\n shareReplay,\n tap\n} from \"rxjs\"\n\nimport { getElement } from \"~/browser\"\nimport { ConsentDefaults } from \"~/components/consent\"\nimport { renderSourceFacts } from \"~/templates\"\n\nimport {\n Component,\n getComponentElements\n} from \"../../_\"\nimport {\n SourceFacts,\n fetchSourceFacts\n} from \"../facts\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Repository information\n */\nexport interface Source {\n facts: SourceFacts /* Repository facts */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Repository information observable\n */\nlet fetch$: Observable\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch repository information\n *\n * This function tries to read the repository facts from session storage, and\n * if unsuccessful, fetches them from the underlying provider.\n *\n * @param el - Repository information element\n *\n * @returns Repository information observable\n */\nexport function watchSource(\n el: HTMLAnchorElement\n): Observable {\n return fetch$ ||= defer(() => {\n const cached = __md_get(\"__source\", sessionStorage)\n if (cached) {\n return of(cached)\n } else {\n\n /* Check if consent is configured and was given */\n const els = getComponentElements(\"consent\")\n if (els.length) {\n const consent = __md_get(\"__consent\")\n if (!(consent && consent.github))\n return EMPTY\n }\n\n /* Fetch repository facts */\n return fetchSourceFacts(el.href)\n .pipe(\n tap(facts => __md_set(\"__source\", facts, sessionStorage))\n )\n }\n })\n .pipe(\n catchError(() => EMPTY),\n filter(facts => Object.keys(facts).length > 0),\n map(facts => ({ facts })),\n shareReplay(1)\n )\n}\n\n/**\n * Mount repository information\n *\n * @param el - Repository information element\n *\n * @returns Repository information component observable\n */\nexport function mountSource(\n el: HTMLAnchorElement\n): Observable> {\n const inner = getElement(\":scope > :last-child\", el)\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ facts }) => {\n inner.appendChild(renderSourceFacts(facts))\n inner.classList.add(\"md-source__repository--active\")\n })\n\n /* Create and return component */\n return watchSource(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n defer,\n distinctUntilKeyChanged,\n finalize,\n map,\n of,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n watchElementSize,\n watchViewportAt\n} from \"~/browser\"\n\nimport { Component } from \"../_\"\nimport { Header } from \"../header\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Navigation tabs\n */\nexport interface Tabs {\n hidden: boolean /* Navigation tabs are hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch navigation tabs\n *\n * @param el - Navigation tabs element\n * @param options - Options\n *\n * @returns Navigation tabs observable\n */\nexport function watchTabs(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n return watchElementSize(document.body)\n .pipe(\n switchMap(() => watchViewportAt(el, { header$, viewport$ })),\n map(({ offset: { y } }) => {\n return {\n hidden: y >= 10\n }\n }),\n distinctUntilKeyChanged(\"hidden\")\n )\n}\n\n/**\n * Mount navigation tabs\n *\n * This function hides the navigation tabs when scrolling past the threshold\n * and makes them reappear in a nice CSS animation when scrolling back up.\n *\n * @param el - Navigation tabs element\n * @param options - Options\n *\n * @returns Navigation tabs component observable\n */\nexport function mountTabs(\n el: HTMLElement, options: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe({\n\n /* Handle emission */\n next({ hidden }) {\n el.hidden = hidden\n },\n\n /* Handle complete */\n complete() {\n el.hidden = false\n }\n })\n\n /* Create and return component */\n return (\n feature(\"navigation.tabs.sticky\")\n ? of({ hidden: false })\n : watchTabs(el, options)\n )\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n combineLatestWith,\n debounceTime,\n defer,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n finalize,\n map,\n merge,\n of,\n repeat,\n scan,\n share,\n skip,\n startWith,\n switchMap,\n takeLast,\n takeUntil,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n getElement,\n getElementContainer,\n getElementSize,\n getElements,\n getLocation,\n getOptionalElement,\n watchElementSize\n} from \"~/browser\"\n\nimport {\n Component,\n getComponentElement\n} from \"../_\"\nimport { Header } from \"../header\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Table of contents\n */\nexport interface TableOfContents {\n prev: HTMLAnchorElement[][] /* Anchors (previous) */\n next: HTMLAnchorElement[][] /* Anchors (next) */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n target$: Observable /* Location target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch table of contents\n *\n * This is effectively a scroll spy implementation which will account for the\n * fixed header and automatically re-calculate anchor offsets when the viewport\n * is resized. The returned observable will only emit if the table of contents\n * needs to be repainted.\n *\n * This implementation tracks an anchor element's entire path starting from its\n * level up to the top-most anchor element, e.g. `[h3, h2, h1]`. Although the\n * Material theme currently doesn't make use of this information, it enables\n * the styling of the entire hierarchy through customization.\n *\n * Note that the current anchor is the last item of the `prev` anchor list.\n *\n * @param el - Table of contents element\n * @param options - Options\n *\n * @returns Table of contents observable\n */\nexport function watchTableOfContents(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n const table = new Map()\n\n /* Compute anchor-to-target mapping */\n const anchors = getElements(\"[href^=\\\\#]\", el)\n for (const anchor of anchors) {\n const id = decodeURIComponent(anchor.hash.substring(1))\n const target = getOptionalElement(`[id=\"${id}\"]`)\n if (typeof target !== \"undefined\")\n table.set(anchor, target)\n }\n\n /* Compute necessary adjustment for header */\n const adjust$ = header$\n .pipe(\n distinctUntilKeyChanged(\"height\"),\n map(({ height }) => {\n const main = getComponentElement(\"main\")\n const grid = getElement(\":scope > :first-child\", main)\n return height + 0.8 * (\n grid.offsetTop -\n main.offsetTop\n )\n }),\n share()\n )\n\n /* Compute partition of previous and next anchors */\n const partition$ = watchElementSize(document.body)\n .pipe(\n distinctUntilKeyChanged(\"height\"),\n\n /* Build index to map anchor paths to vertical offsets */\n switchMap(body => defer(() => {\n let path: HTMLAnchorElement[] = []\n return of([...table].reduce((index, [anchor, target]) => {\n while (path.length) {\n const last = table.get(path[path.length - 1])!\n if (last.tagName >= target.tagName) {\n path.pop()\n } else {\n break\n }\n }\n\n /* If the current anchor is hidden, continue with its parent */\n let offset = target.offsetTop\n while (!offset && target.parentElement) {\n target = target.parentElement\n offset = target.offsetTop\n }\n\n /* Map reversed anchor path to vertical offset */\n return index.set(\n [...path = [...path, anchor]].reverse(),\n offset\n )\n }, new Map()))\n })\n .pipe(\n\n /* Sort index by vertical offset (see https://bit.ly/30z6QSO) */\n map(index => new Map([...index].sort(([, a], [, b]) => a - b))),\n combineLatestWith(adjust$),\n\n /* Re-compute partition when viewport offset changes */\n switchMap(([index, adjust]) => viewport$\n .pipe(\n scan(([prev, next], { offset: { y }, size }) => {\n const last = y + size.height >= Math.floor(body.height)\n\n /* Look forward */\n while (next.length) {\n const [, offset] = next[0]\n if (offset - adjust < y || last) {\n prev = [...prev, next.shift()!]\n } else {\n break\n }\n }\n\n /* Look backward */\n while (prev.length) {\n const [, offset] = prev[prev.length - 1]\n if (offset - adjust >= y && !last) {\n next = [prev.pop()!, ...next]\n } else {\n break\n }\n }\n\n /* Return partition */\n return [prev, next]\n }, [[], [...index]]),\n distinctUntilChanged((a, b) => (\n a[0] === b[0] &&\n a[1] === b[1]\n ))\n )\n )\n )\n )\n )\n\n /* Compute and return anchor list migrations */\n return partition$\n .pipe(\n map(([prev, next]) => ({\n prev: prev.map(([path]) => path),\n next: next.map(([path]) => path)\n })),\n\n /* Extract anchor list migrations */\n startWith({ prev: [], next: [] }),\n bufferCount(2, 1),\n map(([a, b]) => {\n\n /* Moving down */\n if (a.prev.length < b.prev.length) {\n return {\n prev: b.prev.slice(Math.max(0, a.prev.length - 1), b.prev.length),\n next: []\n }\n\n /* Moving up */\n } else {\n return {\n prev: b.prev.slice(-1),\n next: b.next.slice(0, b.next.length - a.next.length)\n }\n }\n })\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Mount table of contents\n *\n * @param el - Table of contents element\n * @param options - Options\n *\n * @returns Table of contents component observable\n */\nexport function mountTableOfContents(\n el: HTMLElement, { viewport$, header$, target$ }: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n push$.subscribe(({ prev, next }) => {\n\n /* Look forward */\n for (const [anchor] of next) {\n anchor.classList.remove(\"md-nav__link--passed\")\n anchor.classList.remove(\"md-nav__link--active\")\n }\n\n /* Look backward */\n for (const [index, [anchor]] of prev.entries()) {\n anchor.classList.add(\"md-nav__link--passed\")\n anchor.classList.toggle(\n \"md-nav__link--active\",\n index === prev.length - 1\n )\n }\n })\n\n /* Set up following, if enabled */\n if (feature(\"toc.follow\")) {\n\n /* Toggle smooth scrolling only for anchor clicks */\n const smooth$ = merge(\n viewport$.pipe(debounceTime(1), map(() => undefined)),\n viewport$.pipe(debounceTime(250), map(() => \"smooth\" as const))\n )\n\n /* Bring active anchor into view */\n push$\n .pipe(\n filter(({ prev }) => prev.length > 0),\n withLatestFrom(smooth$)\n )\n .subscribe(([{ prev }, behavior]) => {\n const [anchor] = prev[prev.length - 1]\n if (anchor.offsetHeight) {\n\n /* Retrieve overflowing container and scroll */\n const container = getElementContainer(anchor)\n if (typeof container !== \"undefined\") {\n const offset = anchor.offsetTop - container.offsetTop\n const { height } = getElementSize(container)\n container.scrollTo({\n top: offset - height / 2,\n behavior\n })\n }\n }\n })\n }\n\n /* Set up anchor tracking, if enabled */\n if (feature(\"navigation.tracking\"))\n viewport$\n .pipe(\n takeUntil(done$),\n distinctUntilKeyChanged(\"offset\"),\n debounceTime(250),\n skip(1),\n takeUntil(target$.pipe(skip(1))),\n repeat({ delay: 250 }),\n withLatestFrom(push$)\n )\n .subscribe(([, { prev }]) => {\n const url = getLocation()\n\n /* Set hash fragment to active anchor */\n const anchor = prev[prev.length - 1]\n if (anchor && anchor.length) {\n const [active] = anchor\n const { hash } = new URL(active.href)\n if (url.hash !== hash) {\n url.hash = hash\n history.replaceState({}, \"\", `${url}`)\n }\n\n /* Reset anchor when at the top */\n } else {\n url.hash = \"\"\n history.replaceState({}, \"\", `${url}`)\n }\n })\n\n /* Create and return component */\n return watchTableOfContents(el, { viewport$, header$ })\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n combineLatest,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n endWith,\n finalize,\n map,\n repeat,\n skip,\n takeLast,\n takeUntil,\n tap\n} from \"rxjs\"\n\nimport { Viewport } from \"~/browser\"\n\nimport { Component } from \"../_\"\nimport { Header } from \"../header\"\nimport { Main } from \"../main\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Back-to-top button\n */\nexport interface BackToTop {\n hidden: boolean /* Back-to-top button is hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n main$: Observable
    /* Main area observable */\n target$: Observable /* Location target observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n main$: Observable
    /* Main area observable */\n target$: Observable /* Location target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch back-to-top\n *\n * @param _el - Back-to-top element\n * @param options - Options\n *\n * @returns Back-to-top observable\n */\nexport function watchBackToTop(\n _el: HTMLElement, { viewport$, main$, target$ }: WatchOptions\n): Observable {\n\n /* Compute direction */\n const direction$ = viewport$\n .pipe(\n map(({ offset: { y } }) => y),\n bufferCount(2, 1),\n map(([a, b]) => a > b && b > 0),\n distinctUntilChanged()\n )\n\n /* Compute whether main area is active */\n const active$ = main$\n .pipe(\n map(({ active }) => active)\n )\n\n /* Compute threshold for hiding */\n return combineLatest([active$, direction$])\n .pipe(\n map(([active, direction]) => !(active && direction)),\n distinctUntilChanged(),\n takeUntil(target$.pipe(skip(1))),\n endWith(true),\n repeat({ delay: 250 }),\n map(hidden => ({ hidden }))\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Mount back-to-top\n *\n * @param el - Back-to-top element\n * @param options - Options\n *\n * @returns Back-to-top component observable\n */\nexport function mountBackToTop(\n el: HTMLElement, { viewport$, header$, main$, target$ }: MountOptions\n): Observable> {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n push$.subscribe({\n\n /* Handle emission */\n next({ hidden }) {\n el.hidden = hidden\n if (hidden) {\n el.setAttribute(\"tabindex\", \"-1\")\n el.blur()\n } else {\n el.removeAttribute(\"tabindex\")\n }\n },\n\n /* Handle complete */\n complete() {\n el.style.top = \"\"\n el.hidden = true\n el.removeAttribute(\"tabindex\")\n }\n })\n\n /* Watch header height */\n header$\n .pipe(\n takeUntil(done$),\n distinctUntilKeyChanged(\"height\")\n )\n .subscribe(({ height }) => {\n el.style.top = `${height + 16}px`\n })\n\n /* Create and return component */\n return watchBackToTop(el, { viewport$, main$, target$ })\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n mergeMap,\n switchMap,\n takeWhile,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { getElements } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n document$: Observable /* Document observable */\n tablet$: Observable /* Media tablet observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch indeterminate checkboxes\n *\n * This function replaces the indeterminate \"pseudo state\" with the actual\n * indeterminate state, which is used to keep navigation always expanded.\n *\n * @param options - Options\n */\nexport function patchIndeterminate(\n { document$, tablet$ }: PatchOptions\n): void {\n document$\n .pipe(\n switchMap(() => getElements(\n // @todo `data-md-state` is deprecated and removed in v9\n \".md-toggle--indeterminate, [data-md-state=indeterminate]\"\n )),\n tap(el => {\n el.indeterminate = true\n el.checked = false\n }),\n mergeMap(el => fromEvent(el, \"change\")\n .pipe(\n takeWhile(() => el.classList.contains(\"md-toggle--indeterminate\")),\n map(() => el)\n )\n ),\n withLatestFrom(tablet$)\n )\n .subscribe(([el, tablet]) => {\n el.classList.remove(\"md-toggle--indeterminate\")\n if (tablet)\n el.checked = false\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n filter,\n fromEvent,\n map,\n mergeMap,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport { getElements } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n document$: Observable /* Document observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Check whether the given device is an Apple device\n *\n * @returns Test result\n */\nfunction isAppleDevice(): boolean {\n return /(iPad|iPhone|iPod)/.test(navigator.userAgent)\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch all elements with `data-md-scrollfix` attributes\n *\n * This is a year-old patch which ensures that overflow scrolling works at the\n * top and bottom of containers on iOS by ensuring a `1px` scroll offset upon\n * the start of a touch event.\n *\n * @see https://bit.ly/2SCtAOO - Original source\n *\n * @param options - Options\n */\nexport function patchScrollfix(\n { document$ }: PatchOptions\n): void {\n document$\n .pipe(\n switchMap(() => getElements(\"[data-md-scrollfix]\")),\n tap(el => el.removeAttribute(\"data-md-scrollfix\")),\n filter(isAppleDevice),\n mergeMap(el => fromEvent(el, \"touchstart\")\n .pipe(\n map(() => el)\n )\n )\n )\n .subscribe(el => {\n const top = el.scrollTop\n\n /* We're at the top of the container */\n if (top === 0) {\n el.scrollTop = 1\n\n /* We're at the bottom of the container */\n } else if (top + el.offsetHeight === el.scrollHeight) {\n el.scrollTop = top - 1\n }\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n delay,\n map,\n of,\n switchMap,\n withLatestFrom\n} from \"rxjs\"\n\nimport {\n Viewport,\n watchToggle\n} from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n viewport$: Observable /* Viewport observable */\n tablet$: Observable /* Media tablet observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch the document body to lock when search is open\n *\n * For mobile and tablet viewports, the search is rendered full screen, which\n * leads to scroll leaking when at the top or bottom of the search result. This\n * function locks the body when the search is in full screen mode, and restores\n * the scroll position when leaving.\n *\n * @param options - Options\n */\nexport function patchScrolllock(\n { viewport$, tablet$ }: PatchOptions\n): void {\n combineLatest([watchToggle(\"search\"), tablet$])\n .pipe(\n map(([active, tablet]) => active && !tablet),\n switchMap(active => of(active)\n .pipe(\n delay(active ? 400 : 100)\n )\n ),\n withLatestFrom(viewport$)\n )\n .subscribe(([active, { offset: { y }}]) => {\n if (active) {\n document.body.setAttribute(\"data-md-scrolllock\", \"\")\n document.body.style.top = `-${y}px`\n } else {\n const value = -1 * parseInt(document.body.style.top, 10)\n document.body.removeAttribute(\"data-md-scrolllock\")\n document.body.style.top = \"\"\n if (value)\n window.scrollTo(0, value)\n }\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Polyfills\n * ------------------------------------------------------------------------- */\n\n/* Polyfill `Object.entries` */\nif (!Object.entries)\n Object.entries = function (obj: object) {\n const data: [string, string][] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push([key, obj[key]])\n\n /* Return entries */\n return data\n }\n\n/* Polyfill `Object.values` */\nif (!Object.values)\n Object.values = function (obj: object) {\n const data: string[] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push(obj[key])\n\n /* Return values */\n return data\n }\n\n/* ------------------------------------------------------------------------- */\n\n/* Polyfills for `Element` */\nif (typeof Element !== \"undefined\") {\n\n /* Polyfill `Element.scrollTo` */\n if (!Element.prototype.scrollTo)\n Element.prototype.scrollTo = function (\n x?: ScrollToOptions | number, y?: number\n ): void {\n if (typeof x === \"object\") {\n this.scrollLeft = x.left!\n this.scrollTop = x.top!\n } else {\n this.scrollLeft = x!\n this.scrollTop = y!\n }\n }\n\n /* Polyfill `Element.replaceWith` */\n if (!Element.prototype.replaceWith)\n Element.prototype.replaceWith = function (\n ...nodes: Array\n ): void {\n const parent = this.parentNode\n if (parent) {\n if (nodes.length === 0)\n parent.removeChild(this)\n\n /* Replace children and create text nodes */\n for (let i = nodes.length - 1; i >= 0; i--) {\n let node = nodes[i]\n if (typeof node === \"string\")\n node = document.createTextNode(node)\n else if (node.parentNode)\n node.parentNode.removeChild(node)\n\n /* Replace child or insert before previous sibling */\n if (!i)\n parent.replaceChild(node, this)\n else\n parent.insertBefore(this.previousSibling!, node)\n }\n }\n }\n}\n"], + "mappings": "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", + "names": ["require_focus_visible", "__commonJSMin", "exports", "module", "global", "factory", "applyFocusVisiblePolyfill", "scope", "hadKeyboardEvent", "hadFocusVisibleRecently", "hadFocusVisibleRecentlyTimeout", "inputTypesAllowlist", "isValidFocusTarget", "el", "focusTriggersKeyboardModality", "type", "tagName", "addFocusVisibleClass", "removeFocusVisibleClass", "onKeyDown", "e", "onPointerDown", "onFocus", "onBlur", "onVisibilityChange", "addInitialPointerMoveListeners", "onInitialPointerMove", "removeInitialPointerMoveListeners", "event", "error", "require_url_polyfill", "__commonJSMin", "exports", "global", "checkIfIteratorIsSupported", "error", "iteratorSupported", "createIterator", "items", "iterator", "value", "serializeParam", "deserializeParam", "polyfillURLSearchParams", "URLSearchParams", "searchString", "typeofSearchString", "_this", "name", "i", "entry", "key", "proto", "callback", "thisArg", "entries", "searchArray", "checkIfURLSearchParamsSupported", "e", "a", "b", "keys", "attributes", "attribute", "checkIfURLIsSupported", "u", "polyfillURL", "_URL", "URL", "url", "base", "doc", "baseElement", "err", "anchorElement", "inputElement", "searchParams", "enableSearchUpdate", "enableSearchParamsUpdate", "methodName", "method", "search", "linkURLWithAnchorAttribute", "attributeName", "expectedPort", "addPortToOrigin", "blob", "getOrigin", "require_tslib", "__commonJSMin", "exports", "module", "__extends", "__assign", "__rest", "__decorate", "__param", "__metadata", "__awaiter", "__generator", "__exportStar", "__values", "__read", "__spread", "__spreadArrays", "__spreadArray", "__await", "__asyncGenerator", "__asyncDelegator", "__asyncValues", "__makeTemplateObject", "__importStar", "__importDefault", "__classPrivateFieldGet", "__classPrivateFieldSet", "__createBinding", "factory", "root", "createExporter", "previous", "id", "v", "exporter", "extendStatics", "d", "b", "p", "__", "t", "s", "n", "e", "i", "decorators", "target", "key", "desc", "c", "r", "paramIndex", "decorator", "metadataKey", "metadataValue", "thisArg", "_arguments", "P", "generator", "adopt", "value", "resolve", "reject", "fulfilled", "step", "rejected", "result", "body", "_", "f", "y", "g", "verb", "op", "m", "o", "k", "k2", "ar", "error", "il", "a", "j", "jl", "to", "from", "pack", "l", "q", "resume", "settle", "fulfill", "cooked", "raw", "__setModuleDefault", "mod", "receiver", "state", "kind", "require_clipboard", "__commonJSMin", "exports", "module", "root", "factory", "__webpack_modules__", "__unused_webpack_module", "__webpack_exports__", "__webpack_require__", "clipboard", "tiny_emitter", "tiny_emitter_default", "listen", "listen_default", "src_select", "select_default", "command", "type", "err", "ClipboardActionCut", "target", "selectedText", "actions_cut", "createFakeElement", "value", "isRTL", "fakeElement", "yPosition", "fakeCopyAction", "options", "ClipboardActionCopy", "actions_copy", "_typeof", "obj", "ClipboardActionDefault", "_options$action", "action", "container", "text", "actions_default", "clipboard_typeof", "_classCallCheck", "instance", "Constructor", "_defineProperties", "props", "i", "descriptor", "_createClass", "protoProps", "staticProps", "_inherits", "subClass", "superClass", "_setPrototypeOf", "o", "p", "_createSuper", "Derived", "hasNativeReflectConstruct", "_isNativeReflectConstruct", "Super", "_getPrototypeOf", "result", "NewTarget", "_possibleConstructorReturn", "self", "call", "_assertThisInitialized", "e", "getAttributeValue", "suffix", "element", "attribute", "Clipboard", "_Emitter", "_super", "trigger", "_this", "_this2", "selector", "actions", "support", "DOCUMENT_NODE_TYPE", "proto", "closest", "__unused_webpack_exports", "_delegate", "callback", "useCapture", "listenerFn", "listener", "delegate", "elements", "is", "listenNode", "listenNodeList", "listenSelector", "node", "nodeList", "select", "isReadOnly", "selection", "range", "E", "name", "ctx", "data", "evtArr", "len", "evts", "liveEvents", "__webpack_module_cache__", "moduleId", "getter", "definition", "key", "prop", "require_escape_html", "__commonJSMin", "exports", "module", "matchHtmlRegExp", "escapeHtml", "string", "str", "match", "escape", "html", "index", "lastIndex", "r", "a", "e", "import_focus_visible", "n", "t", "s", "r", "o", "u", "i", "a", "e", "c", "import_url_polyfill", "import_tslib", "__extends", "__assign", "__rest", "__decorate", "__param", "__metadata", "__awaiter", "__generator", "__exportStar", "__createBinding", "__values", "__read", "__spread", "__spreadArrays", "__spreadArray", "__await", "__asyncGenerator", "__asyncDelegator", "__asyncValues", "__makeTemplateObject", "__importStar", "__importDefault", "__classPrivateFieldGet", "__classPrivateFieldSet", "tslib", "isFunction", "value", "createErrorClass", "createImpl", "_super", "instance", "ctorFunc", "UnsubscriptionError", "createErrorClass", "_super", "errors", "err", "i", "arrRemove", "arr", "item", "index", "Subscription", "initialTeardown", "errors", "_parentage", "_parentage_1", "__values", "_parentage_1_1", "parent_1", "initialFinalizer", "isFunction", "e", "UnsubscriptionError", "_finalizers", "_finalizers_1", "_finalizers_1_1", "finalizer", "execFinalizer", "err", "__spreadArray", "__read", "teardown", "_a", "parent", "arrRemove", "empty", "EMPTY_SUBSCRIPTION", "Subscription", "isSubscription", "value", "isFunction", "execFinalizer", "finalizer", "config", "timeoutProvider", "handler", "timeout", "args", "_i", "delegate", "__spreadArray", "__read", "handle", "reportUnhandledError", "err", "timeoutProvider", "onUnhandledError", "config", "noop", "COMPLETE_NOTIFICATION", "createNotification", "errorNotification", "error", "nextNotification", "value", "kind", "context", "errorContext", "cb", "config", "isRoot", "_a", "errorThrown", "error", "captureError", "err", "Subscriber", "_super", "__extends", "destination", "_this", "isSubscription", "EMPTY_OBSERVER", "next", "error", "complete", "SafeSubscriber", "value", "handleStoppedNotification", "nextNotification", "err", "errorNotification", "COMPLETE_NOTIFICATION", "Subscription", "_bind", "bind", "fn", "thisArg", "ConsumerObserver", "partialObserver", "value", "error", "handleUnhandledError", "err", "SafeSubscriber", "_super", "__extends", "observerOrNext", "complete", "_this", "isFunction", "context_1", "config", "Subscriber", "handleUnhandledError", "error", "config", "captureError", "reportUnhandledError", "defaultErrorHandler", "err", "handleStoppedNotification", "notification", "subscriber", "onStoppedNotification", "timeoutProvider", "EMPTY_OBSERVER", "noop", "observable", "identity", "x", "pipe", "fns", "_i", "pipeFromArray", "identity", "input", "prev", "fn", "Observable", "subscribe", "operator", "observable", "observerOrNext", "error", "complete", "_this", "subscriber", "isSubscriber", "SafeSubscriber", "errorContext", "_a", "source", "sink", "err", "next", "promiseCtor", "getPromiseCtor", "resolve", "reject", "value", "operations", "_i", "pipeFromArray", "x", "getPromiseCtor", "promiseCtor", "_a", "config", "isObserver", "value", "isFunction", "isSubscriber", "Subscriber", "isSubscription", "hasLift", "source", "isFunction", "operate", "init", "liftedSource", "err", "createOperatorSubscriber", "destination", "onNext", "onComplete", "onError", "onFinalize", "OperatorSubscriber", "_super", "__extends", "shouldUnsubscribe", "_this", "value", "err", "closed_1", "_a", "Subscriber", "animationFrameProvider", "callback", "request", "cancel", "delegate", "handle", "timestamp", "Subscription", "args", "_i", "__spreadArray", "__read", "ObjectUnsubscribedError", "createErrorClass", "_super", "Subject", "_super", "__extends", "_this", "operator", "subject", "AnonymousSubject", "ObjectUnsubscribedError", "value", "errorContext", "_b", "__values", "_c", "observer", "err", "observers", "_a", "subscriber", "hasError", "isStopped", "EMPTY_SUBSCRIPTION", "Subscription", "arrRemove", "thrownError", "observable", "Observable", "destination", "source", "AnonymousSubject", "_super", "__extends", "destination", "source", "_this", "value", "_b", "_a", "err", "subscriber", "EMPTY_SUBSCRIPTION", "Subject", "dateTimestampProvider", "ReplaySubject", "_super", "__extends", "_bufferSize", "_windowTime", "_timestampProvider", "dateTimestampProvider", "_this", "value", "_a", "isStopped", "_buffer", "_infiniteTimeWindow", "subscriber", "subscription", "copy", "i", "adjustedBufferSize", "now", "last", "Subject", "Action", "_super", "__extends", "scheduler", "work", "state", "delay", "Subscription", "intervalProvider", "handler", "timeout", "args", "_i", "delegate", "__spreadArray", "__read", "handle", "AsyncAction", "_super", "__extends", "scheduler", "work", "_this", "state", "delay", "id", "_a", "_id", "intervalProvider", "_scheduler", "error", "_delay", "errored", "errorValue", "e", "actions", "arrRemove", "Action", "Scheduler", "schedulerActionCtor", "now", "work", "delay", "state", "dateTimestampProvider", "AsyncScheduler", "_super", "__extends", "SchedulerAction", "now", "Scheduler", "_this", "action", "actions", "error", "asyncScheduler", "AsyncScheduler", "AsyncAction", "async", "AnimationFrameAction", "_super", "__extends", "scheduler", "work", "_this", "id", "delay", "animationFrameProvider", "actions", "_a", "AsyncAction", "AnimationFrameScheduler", "_super", "__extends", "action", "flushId", "actions", "error", "AsyncScheduler", "animationFrameScheduler", "AnimationFrameScheduler", "AnimationFrameAction", "EMPTY", "Observable", "subscriber", "isScheduler", "value", "isFunction", "last", "arr", "popResultSelector", "args", "isFunction", "popScheduler", "isScheduler", "popNumber", "defaultValue", "isArrayLike", "x", "isPromise", "value", "isFunction", "isInteropObservable", "input", "isFunction", "observable", "isAsyncIterable", "obj", "isFunction", "createInvalidObservableTypeError", "input", "getSymbolIterator", "iterator", "isIterable", "input", "isFunction", "iterator", "readableStreamLikeToAsyncGenerator", "readableStream", "reader", "__await", "_a", "_b", "value", "done", "isReadableStreamLike", "obj", "isFunction", "innerFrom", "input", "Observable", "isInteropObservable", "fromInteropObservable", "isArrayLike", "fromArrayLike", "isPromise", "fromPromise", "isAsyncIterable", "fromAsyncIterable", "isIterable", "fromIterable", "isReadableStreamLike", "fromReadableStreamLike", "createInvalidObservableTypeError", "obj", "subscriber", "obs", "observable", "isFunction", "array", "i", "promise", "value", "err", "reportUnhandledError", "iterable", "iterable_1", "__values", "iterable_1_1", "asyncIterable", "process", "readableStream", "readableStreamLikeToAsyncGenerator", "asyncIterable_1", "__asyncValues", "asyncIterable_1_1", "executeSchedule", "parentSubscription", "scheduler", "work", "delay", "repeat", "scheduleSubscription", "observeOn", "scheduler", "delay", "operate", "source", "subscriber", "createOperatorSubscriber", "value", "executeSchedule", "err", "subscribeOn", "scheduler", "delay", "operate", "source", "subscriber", "scheduleObservable", "input", "scheduler", "innerFrom", "subscribeOn", "observeOn", "schedulePromise", "input", "scheduler", "innerFrom", "subscribeOn", "observeOn", "scheduleArray", "input", "scheduler", "Observable", "subscriber", "i", "scheduleIterable", "input", "scheduler", "Observable", "subscriber", "iterator", "executeSchedule", "value", "done", "_a", "err", "isFunction", "scheduleAsyncIterable", "input", "scheduler", "Observable", "subscriber", "executeSchedule", "iterator", "result", "scheduleReadableStreamLike", "input", "scheduler", "scheduleAsyncIterable", "readableStreamLikeToAsyncGenerator", "scheduled", "input", "scheduler", "isInteropObservable", "scheduleObservable", "isArrayLike", "scheduleArray", "isPromise", "schedulePromise", "isAsyncIterable", "scheduleAsyncIterable", "isIterable", "scheduleIterable", "isReadableStreamLike", "scheduleReadableStreamLike", "createInvalidObservableTypeError", "from", "input", "scheduler", "scheduled", "innerFrom", "of", "args", "_i", "scheduler", "popScheduler", "from", "throwError", "errorOrErrorFactory", "scheduler", "errorFactory", "isFunction", "init", "subscriber", "Observable", "isValidDate", "value", "map", "project", "thisArg", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "isArray", "callOrApply", "fn", "args", "__spreadArray", "__read", "mapOneOrManyArgs", "map", "isArray", "getPrototypeOf", "objectProto", "getKeys", "argsArgArrayOrObject", "args", "first_1", "isPOJO", "keys", "key", "obj", "createObject", "keys", "values", "result", "key", "i", "combineLatest", "args", "_i", "scheduler", "popScheduler", "resultSelector", "popResultSelector", "_a", "argsArgArrayOrObject", "observables", "keys", "from", "result", "Observable", "combineLatestInit", "values", "createObject", "identity", "mapOneOrManyArgs", "valueTransform", "subscriber", "maybeSchedule", "length", "active", "remainingFirstValues", "i", "source", "hasFirstValue", "createOperatorSubscriber", "value", "execute", "subscription", "executeSchedule", "mergeInternals", "source", "subscriber", "project", "concurrent", "onBeforeNext", "expand", "innerSubScheduler", "additionalFinalizer", "buffer", "active", "index", "isComplete", "checkComplete", "outerNext", "value", "doInnerSub", "innerComplete", "innerFrom", "createOperatorSubscriber", "innerValue", "bufferedValue", "executeSchedule", "err", "mergeMap", "project", "resultSelector", "concurrent", "isFunction", "a", "i", "map", "b", "ii", "innerFrom", "operate", "source", "subscriber", "mergeInternals", "mergeAll", "concurrent", "mergeMap", "identity", "concatAll", "mergeAll", "concat", "args", "_i", "concatAll", "from", "popScheduler", "defer", "observableFactory", "Observable", "subscriber", "innerFrom", "nodeEventEmitterMethods", "eventTargetMethods", "jqueryMethods", "fromEvent", "target", "eventName", "options", "resultSelector", "isFunction", "mapOneOrManyArgs", "_a", "__read", "isEventTarget", "methodName", "handler", "isNodeStyleEventEmitter", "toCommonHandlerRegistry", "isJQueryStyleEventEmitter", "add", "remove", "isArrayLike", "mergeMap", "subTarget", "innerFrom", "Observable", "subscriber", "args", "_i", "fromEventPattern", "addHandler", "removeHandler", "resultSelector", "mapOneOrManyArgs", "Observable", "subscriber", "handler", "e", "_i", "retValue", "isFunction", "timer", "dueTime", "intervalOrScheduler", "scheduler", "async", "intervalDuration", "isScheduler", "Observable", "subscriber", "due", "isValidDate", "n", "merge", "args", "_i", "scheduler", "popScheduler", "concurrent", "popNumber", "sources", "innerFrom", "mergeAll", "from", "EMPTY", "NEVER", "Observable", "noop", "isArray", "argsOrArgArray", "args", "filter", "predicate", "thisArg", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "zip", "args", "_i", "resultSelector", "popResultSelector", "sources", "argsOrArgArray", "Observable", "subscriber", "buffers", "completed", "sourceIndex", "innerFrom", "createOperatorSubscriber", "value", "buffer", "result", "__spreadArray", "__read", "i", "EMPTY", "audit", "durationSelector", "operate", "source", "subscriber", "hasValue", "lastValue", "durationSubscriber", "isComplete", "endDuration", "value", "cleanupDuration", "createOperatorSubscriber", "innerFrom", "auditTime", "duration", "scheduler", "asyncScheduler", "audit", "timer", "bufferCount", "bufferSize", "startBufferEvery", "operate", "source", "subscriber", "buffers", "count", "createOperatorSubscriber", "value", "toEmit", "buffers_1", "__values", "buffers_1_1", "buffer", "toEmit_1", "toEmit_1_1", "arrRemove", "buffers_2", "buffers_2_1", "catchError", "selector", "operate", "source", "subscriber", "innerSub", "syncUnsub", "handledResult", "createOperatorSubscriber", "err", "innerFrom", "scanInternals", "accumulator", "seed", "hasSeed", "emitOnNext", "emitBeforeComplete", "source", "subscriber", "hasState", "state", "index", "createOperatorSubscriber", "value", "i", "combineLatest", "args", "_i", "resultSelector", "popResultSelector", "pipe", "__spreadArray", "__read", "mapOneOrManyArgs", "operate", "source", "subscriber", "combineLatestInit", "argsOrArgArray", "combineLatestWith", "otherSources", "_i", "combineLatest", "__spreadArray", "__read", "concatMap", "project", "resultSelector", "isFunction", "mergeMap", "debounceTime", "dueTime", "scheduler", "asyncScheduler", "operate", "source", "subscriber", "activeTask", "lastValue", "lastTime", "emit", "value", "emitWhenIdle", "targetTime", "now", "createOperatorSubscriber", "defaultIfEmpty", "defaultValue", "operate", "source", "subscriber", "hasValue", "createOperatorSubscriber", "value", "take", "count", "EMPTY", "operate", "source", "subscriber", "seen", "createOperatorSubscriber", "value", "ignoreElements", "operate", "source", "subscriber", "createOperatorSubscriber", "noop", "mapTo", "value", "map", "delayWhen", "delayDurationSelector", "subscriptionDelay", "source", "concat", "take", "ignoreElements", "mergeMap", "value", "index", "mapTo", "delay", "due", "scheduler", "asyncScheduler", "duration", "timer", "delayWhen", "distinctUntilChanged", "comparator", "keySelector", "identity", "defaultCompare", "operate", "source", "subscriber", "previousKey", "first", "createOperatorSubscriber", "value", "currentKey", "a", "b", "distinctUntilKeyChanged", "key", "compare", "distinctUntilChanged", "x", "y", "endWith", "values", "_i", "source", "concat", "of", "__spreadArray", "__read", "finalize", "callback", "operate", "source", "subscriber", "takeLast", "count", "EMPTY", "operate", "source", "subscriber", "buffer", "createOperatorSubscriber", "value", "buffer_1", "__values", "buffer_1_1", "merge", "args", "_i", "scheduler", "popScheduler", "concurrent", "popNumber", "argsOrArgArray", "operate", "source", "subscriber", "mergeAll", "from", "__spreadArray", "__read", "mergeWith", "otherSources", "_i", "merge", "__spreadArray", "__read", "repeat", "countOrConfig", "count", "delay", "_a", "EMPTY", "operate", "source", "subscriber", "soFar", "sourceSub", "resubscribe", "notifier", "timer", "innerFrom", "notifierSubscriber_1", "createOperatorSubscriber", "subscribeToSource", "syncUnsub", "sample", "notifier", "operate", "source", "subscriber", "hasValue", "lastValue", "createOperatorSubscriber", "value", "noop", "scan", "accumulator", "seed", "operate", "scanInternals", "share", "options", "_a", "connector", "Subject", "_b", "resetOnError", "_c", "resetOnComplete", "_d", "resetOnRefCountZero", "wrapperSource", "connection", "resetConnection", "subject", "refCount", "hasCompleted", "hasErrored", "cancelReset", "reset", "resetAndUnsubscribe", "conn", "operate", "source", "subscriber", "dest", "handleReset", "SafeSubscriber", "value", "err", "innerFrom", "on", "args", "_i", "onSubscriber", "__spreadArray", "__read", "shareReplay", "configOrBufferSize", "windowTime", "scheduler", "bufferSize", "refCount", "_a", "_b", "_c", "share", "ReplaySubject", "skip", "count", "filter", "_", "index", "skipUntil", "notifier", "operate", "source", "subscriber", "taking", "skipSubscriber", "createOperatorSubscriber", "noop", "innerFrom", "value", "startWith", "values", "_i", "scheduler", "popScheduler", "operate", "source", "subscriber", "concat", "switchMap", "project", "resultSelector", "operate", "source", "subscriber", "innerSubscriber", "index", "isComplete", "checkComplete", "createOperatorSubscriber", "value", "innerIndex", "outerIndex", "innerFrom", "innerValue", "takeUntil", "notifier", "operate", "source", "subscriber", "innerFrom", "createOperatorSubscriber", "noop", "takeWhile", "predicate", "inclusive", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "result", "tap", "observerOrNext", "error", "complete", "tapObserver", "isFunction", "operate", "source", "subscriber", "_a", "isUnsub", "createOperatorSubscriber", "value", "err", "_b", "identity", "defaultThrottleConfig", "throttle", "durationSelector", "config", "operate", "source", "subscriber", "leading", "trailing", "hasValue", "sendValue", "throttled", "isComplete", "endThrottling", "send", "cleanupThrottling", "startThrottle", "value", "innerFrom", "createOperatorSubscriber", "throttleTime", "duration", "scheduler", "config", "asyncScheduler", "defaultThrottleConfig", "duration$", "timer", "throttle", "withLatestFrom", "inputs", "_i", "project", "popResultSelector", "operate", "source", "subscriber", "len", "otherValues", "hasValue", "ready", "i", "innerFrom", "createOperatorSubscriber", "value", "identity", "noop", "values", "__spreadArray", "__read", "zip", "sources", "_i", "operate", "source", "subscriber", "__spreadArray", "__read", "zipWith", "otherInputs", "_i", "zip", "__spreadArray", "__read", "watchDocument", "document$", "ReplaySubject", "fromEvent", "getElements", "selector", "node", "getElement", "el", "getOptionalElement", "getActiveElement", "watchElementFocus", "el", "merge", "fromEvent", "debounceTime", "map", "active", "getActiveElement", "startWith", "distinctUntilChanged", "getElementOffset", "el", "watchElementOffset", "merge", "fromEvent", "auditTime", "animationFrameScheduler", "map", "startWith", "getElementContentOffset", "el", "watchElementContentOffset", "merge", "fromEvent", "auditTime", "animationFrameScheduler", "map", "startWith", "MapShim", "getIndex", "arr", "key", "result", "entry", "index", "class_1", "value", "entries", "callback", "ctx", "_i", "_a", "isBrowser", "global$1", "requestAnimationFrame$1", "trailingTimeout", "throttle", "delay", "leadingCall", "trailingCall", "lastCallTime", "resolvePending", "proxy", "timeoutCallback", "timeStamp", "REFRESH_DELAY", "transitionKeys", "mutationObserverSupported", "ResizeObserverController", "observer", "observers", "changesDetected", "activeObservers", "_b", "propertyName", "isReflowProperty", "defineConfigurable", "target", "props", "getWindowOf", "ownerGlobal", "emptyRect", "createRectInit", "toFloat", "getBordersSize", "styles", "positions", "size", "position", "getPaddings", "paddings", "positions_1", "getSVGContentRect", "bbox", "getHTMLElementContentRect", "clientWidth", "clientHeight", "horizPad", "vertPad", "width", "height", "isDocumentElement", "vertScrollbar", "horizScrollbar", "isSVGGraphicsElement", "getContentRect", "createReadOnlyRect", "x", "y", "Constr", "rect", "ResizeObservation", "ResizeObserverEntry", "rectInit", "contentRect", "ResizeObserverSPI", "controller", "callbackCtx", "observations", "_this", "observation", "ResizeObserver", "method", "ResizeObserver_es_default", "entry$", "Subject", "observer$", "defer", "of", "ResizeObserver_es_default", "entries", "entry", "switchMap", "observer", "merge", "NEVER", "finalize", "shareReplay", "getElementSize", "el", "watchElementSize", "tap", "filter", "target", "map", "startWith", "getElementContentSize", "el", "getElementContainer", "parent", "entry$", "Subject", "observer$", "defer", "of", "entries", "entry", "switchMap", "observer", "merge", "NEVER", "finalize", "shareReplay", "watchElementVisibility", "el", "tap", "filter", "target", "map", "isIntersecting", "watchElementBoundary", "threshold", "watchElementContentOffset", "y", "visible", "getElementSize", "content", "getElementContentSize", "distinctUntilChanged", "toggles", "getElement", "getToggle", "name", "setToggle", "value", "watchToggle", "el", "fromEvent", "map", "startWith", "isSusceptibleToKeyboard", "el", "type", "watchKeyboard", "fromEvent", "filter", "ev", "map", "getToggle", "mode", "active", "getActiveElement", "share", "getLocation", "setLocation", "url", "watchLocation", "Subject", "appendChild", "el", "child", "node", "h", "tag", "attributes", "children", "attr", "truncate", "value", "n", "i", "round", "digits", "getLocationHash", "setLocationHash", "hash", "el", "h", "ev", "watchLocationHash", "fromEvent", "map", "startWith", "filter", "shareReplay", "watchLocationTarget", "id", "getOptionalElement", "watchMedia", "query", "media", "fromEventPattern", "next", "startWith", "watchPrint", "merge", "fromEvent", "map", "at", "query$", "factory", "switchMap", "active", "EMPTY", "request", "url", "options", "from", "catchError", "EMPTY", "switchMap", "res", "throwError", "of", "requestJSON", "shareReplay", "requestXML", "dom", "map", "watchScript", "src", "script", "h", "defer", "merge", "fromEvent", "switchMap", "throwError", "map", "finalize", "take", "getViewportOffset", "watchViewportOffset", "merge", "fromEvent", "map", "startWith", "getViewportSize", "watchViewportSize", "fromEvent", "map", "startWith", "watchViewport", "combineLatest", "watchViewportOffset", "watchViewportSize", "map", "offset", "size", "shareReplay", "watchViewportAt", "el", "viewport$", "header$", "size$", "distinctUntilKeyChanged", "offset$", "combineLatest", "map", "getElementOffset", "height", "offset", "size", "x", "y", "watchWorker", "worker", "tx$", "rx$", "fromEvent", "map", "data", "throttle", "tap", "message", "switchMap", "share", "script", "getElement", "config", "getLocation", "configuration", "feature", "flag", "translation", "key", "value", "getComponentElement", "type", "node", "getElement", "getComponentElements", "getElements", "watchAnnounce", "el", "button", "getElement", "fromEvent", "map", "content", "mountAnnounce", "feature", "EMPTY", "defer", "push$", "Subject", "startWith", "hash", "_a", "tap", "state", "finalize", "__spreadValues", "watchConsent", "el", "target$", "map", "target", "mountConsent", "options", "internal$", "Subject", "hidden", "tap", "state", "finalize", "__spreadValues", "import_clipboard", "renderTooltip", "id", "h", "renderAnnotation", "id", "prefix", "anchor", "h", "renderTooltip", "renderClipboardButton", "id", "h", "translation", "renderSearchDocument", "document", "flag", "parent", "teaser", "missing", "key", "list", "h", "url", "feature", "match", "highlight", "value", "tags", "configuration", "truncate", "tag", "id", "type", "translation", "renderSearchResultItem", "result", "threshold", "docs", "doc", "article", "index", "best", "more", "children", "section", "renderSourceFacts", "facts", "h", "key", "value", "round", "renderTabbedControl", "type", "classes", "h", "renderTable", "table", "h", "renderVersion", "version", "config", "configuration", "url", "h", "renderVersionSelector", "versions", "active", "translation", "watchAnnotation", "el", "container", "offset$", "defer", "combineLatest", "watchElementOffset", "watchElementContentOffset", "map", "x", "y", "scroll", "width", "height", "getElementSize", "watchElementFocus", "switchMap", "active", "offset", "take", "mountAnnotation", "target$", "tooltip", "index", "push$", "Subject", "done$", "takeLast", "watchElementVisibility", "takeUntil", "visible", "merge", "filter", "debounceTime", "auditTime", "animationFrameScheduler", "throttleTime", "origin", "fromEvent", "ev", "withLatestFrom", "_a", "parent", "getActiveElement", "target", "delay", "tap", "state", "finalize", "__spreadValues", "findAnnotationMarkers", "container", "markers", "el", "getElements", "nodes", "it", "node", "text", "match", "id", "force", "marker", "swap", "source", "target", "mountAnnotationList", "target$", "print$", "parent", "prefix", "annotations", "getOptionalElement", "renderAnnotation", "EMPTY", "defer", "done$", "Subject", "pairs", "annotation", "getElement", "takeUntil", "takeLast", "active", "inner", "child", "merge", "mountAnnotation", "finalize", "share", "sequence", "findCandidateList", "el", "sibling", "watchCodeBlock", "watchElementSize", "map", "width", "getElementContentSize", "distinctUntilKeyChanged", "mountCodeBlock", "options", "hover", "factory$", "defer", "push$", "Subject", "scrollable", "ClipboardJS", "parent", "renderClipboardButton", "container", "list", "feature", "annotations$", "mountAnnotationList", "tap", "state", "finalize", "__spreadValues", "mergeWith", "height", "distinctUntilChanged", "switchMap", "active", "EMPTY", "watchElementVisibility", "filter", "visible", "take", "mermaid$", "sequence", "fetchScripts", "watchScript", "of", "mountMermaid", "el", "tap", "mermaid_default", "map", "shareReplay", "id", "host", "h", "svg", "shadow", "watchDetails", "el", "target$", "print$", "open", "merge", "map", "target", "filter", "details", "active", "tap", "mountDetails", "options", "defer", "push$", "Subject", "action", "reveal", "state", "finalize", "__spreadValues", "sentinel", "h", "mountDataTable", "el", "renderTable", "of", "watchContentTabs", "el", "inputs", "getElements", "initial", "input", "merge", "fromEvent", "map", "getElement", "startWith", "active", "mountContentTabs", "viewport$", "prev", "renderTabbedControl", "next", "container", "defer", "push$", "Subject", "done$", "takeLast", "combineLatest", "watchElementSize", "auditTime", "animationFrameScheduler", "takeUntil", "size", "offset", "getElementOffset", "width", "getElementSize", "content", "getElementContentOffset", "watchElementContentOffset", "getElementContentSize", "direction", "feature", "skip", "withLatestFrom", "tab", "y", "set", "label", "tabs", "tap", "state", "finalize", "__spreadValues", "subscribeOn", "asyncScheduler", "mountContent", "el", "viewport$", "target$", "print$", "merge", "getElements", "child", "mountCodeBlock", "mountMermaid", "mountDataTable", "mountDetails", "mountContentTabs", "watchDialog", "_el", "alert$", "switchMap", "message", "merge", "of", "delay", "map", "active", "mountDialog", "el", "options", "inner", "getElement", "defer", "push$", "Subject", "tap", "state", "finalize", "__spreadValues", "isHidden", "viewport$", "feature", "of", "direction$", "map", "y", "bufferCount", "a", "b", "distinctUntilKeyChanged", "hidden$", "combineLatest", "filter", "offset", "direction", "distinctUntilChanged", "search$", "watchToggle", "search", "switchMap", "active", "startWith", "watchHeader", "el", "options", "defer", "watchElementSize", "height", "hidden", "shareReplay", "mountHeader", "header$", "main$", "push$", "Subject", "done$", "takeLast", "combineLatestWith", "takeUntil", "state", "__spreadValues", "watchHeaderTitle", "el", "viewport$", "header$", "watchViewportAt", "map", "y", "height", "getElementSize", "distinctUntilKeyChanged", "mountHeaderTitle", "options", "defer", "push$", "Subject", "active", "heading", "getOptionalElement", "EMPTY", "tap", "state", "finalize", "__spreadValues", "watchMain", "el", "viewport$", "header$", "adjust$", "map", "height", "distinctUntilChanged", "border$", "switchMap", "watchElementSize", "distinctUntilKeyChanged", "combineLatest", "header", "top", "bottom", "y", "a", "b", "watchPalette", "inputs", "current", "input", "of", "mergeMap", "fromEvent", "map", "startWith", "shareReplay", "mountPalette", "el", "defer", "push$", "Subject", "palette", "key", "value", "index", "label", "observeOn", "asyncScheduler", "getElements", "tap", "state", "finalize", "__spreadValues", "import_clipboard", "extract", "el", "text", "setupClipboardJS", "alert$", "ClipboardJS", "Observable", "subscriber", "getElement", "ev", "tap", "map", "translation", "preprocess", "urls", "root", "next", "a", "b", "url", "index", "fetchSitemap", "base", "cached", "of", "config", "configuration", "requestXML", "map", "sitemap", "getElements", "node", "catchError", "EMPTY", "defaultIfEmpty", "tap", "setupInstantLoading", "document$", "location$", "viewport$", "config", "configuration", "fromEvent", "favicon", "getOptionalElement", "push$", "fetchSitemap", "map", "paths", "path", "switchMap", "urls", "filter", "ev", "el", "url", "of", "NEVER", "share", "pop$", "merge", "distinctUntilChanged", "a", "b", "response$", "distinctUntilKeyChanged", "request", "catchError", "setLocation", "sample", "dom", "res", "skip", "replacement", "selector", "feature", "source", "target", "getComponentElement", "getElements", "concatMap", "script", "h", "name", "Observable", "observer", "EMPTY", "offset", "setLocationHash", "skipUntil", "debounceTime", "bufferCount", "state", "import_escape_html", "import_escape_html", "setupSearchHighlighter", "config", "escape", "separator", "highlight", "_", "data", "term", "query", "match", "value", "escapeHTML", "defaultTransform", "query", "terms", "index", "isSearchReadyMessage", "message", "isSearchQueryMessage", "isSearchResultMessage", "setupSearchIndex", "config", "docs", "translation", "options", "feature", "setupSearchWorker", "url", "index", "configuration", "worker", "tx$", "Subject", "rx$", "watchWorker", "map", "message", "isSearchResultMessage", "result", "document", "share", "from", "data", "setupVersionSelector", "document$", "config", "configuration", "versions$", "requestJSON", "catchError", "EMPTY", "current$", "map", "versions", "current", "version", "aliases", "switchMap", "urls", "fromEvent", "filter", "ev", "withLatestFrom", "el", "url", "of", "fetchSitemap", "sitemap", "path", "getLocation", "setLocation", "combineLatest", "getElement", "renderVersionSelector", "_a", "outdated", "latest", "warning", "getComponentElements", "watchSearchQuery", "el", "rx$", "fn", "defaultTransform", "searchParams", "getLocation", "setToggle", "param$", "filter", "isSearchReadyMessage", "take", "map", "watchToggle", "active", "url", "value", "focus$", "watchElementFocus", "value$", "merge", "fromEvent", "delay", "startWith", "distinctUntilChanged", "combineLatest", "focus", "shareReplay", "mountSearchQuery", "tx$", "push$", "Subject", "done$", "takeLast", "distinctUntilKeyChanged", "translation", "takeUntil", "tap", "state", "finalize", "__spreadValues", "share", "mountSearchResult", "el", "rx$", "query$", "push$", "Subject", "boundary$", "watchElementBoundary", "filter", "meta", "getElement", "list", "ready$", "isSearchReadyMessage", "take", "withLatestFrom", "skipUntil", "items", "value", "translation", "round", "tap", "switchMap", "merge", "of", "bufferCount", "zipWith", "chunk", "result", "renderSearchResultItem", "isSearchResultMessage", "map", "data", "state", "finalize", "__spreadValues", "watchSearchShare", "_el", "query$", "map", "value", "url", "getLocation", "mountSearchShare", "el", "options", "push$", "Subject", "fromEvent", "ev", "tap", "state", "finalize", "__spreadValues", "mountSearchSuggest", "el", "rx$", "keyboard$", "push$", "Subject", "query", "getComponentElement", "query$", "merge", "fromEvent", "observeOn", "asyncScheduler", "map", "distinctUntilChanged", "combineLatestWith", "suggestions", "value", "words", "last", "filter", "mode", "key", "isSearchResultMessage", "data", "tap", "state", "finalize", "mountSearch", "el", "index$", "keyboard$", "config", "configuration", "url", "worker", "setupSearchWorker", "query", "getComponentElement", "result", "tx$", "rx$", "filter", "isSearchQueryMessage", "sample", "isSearchReadyMessage", "take", "mode", "key", "active", "getActiveElement", "anchors", "anchor", "getElements", "article", "best", "a", "b", "setToggle", "els", "i", "query$", "mountSearchQuery", "result$", "mountSearchResult", "merge", "mergeWith", "getComponentElements", "child", "mountSearchShare", "mountSearchSuggest", "err", "NEVER", "mountSearchHiglight", "el", "index$", "location$", "combineLatest", "startWith", "getLocation", "filter", "url", "map", "index", "setupSearchHighlighter", "fn", "_a", "nodes", "it", "node", "original", "replaced", "text", "childNodes", "h", "watchSidebar", "el", "viewport$", "main$", "parent", "adjust", "combineLatest", "map", "offset", "height", "y", "distinctUntilChanged", "a", "b", "mountSidebar", "_a", "_b", "header$", "options", "__objRest", "inner", "getElement", "getElementOffset", "defer", "push$", "Subject", "auditTime", "animationFrameScheduler", "withLatestFrom", "observeOn", "take", "item", "getElements", "container", "getElementContainer", "getElementSize", "tap", "state", "finalize", "__spreadValues", "fetchSourceFactsFromGitHub", "user", "repo", "url", "zip", "requestJSON", "catchError", "EMPTY", "map", "release", "defaultIfEmpty", "info", "__spreadValues", "fetchSourceFactsFromGitLab", "base", "project", "url", "requestJSON", "catchError", "EMPTY", "map", "star_count", "forks_count", "defaultIfEmpty", "fetchSourceFacts", "url", "match", "user", "repo", "fetchSourceFactsFromGitHub", "base", "slug", "fetchSourceFactsFromGitLab", "EMPTY", "fetch$", "watchSource", "el", "defer", "cached", "of", "getComponentElements", "consent", "EMPTY", "fetchSourceFacts", "tap", "facts", "catchError", "filter", "map", "shareReplay", "mountSource", "inner", "getElement", "push$", "Subject", "renderSourceFacts", "state", "finalize", "__spreadValues", "watchTabs", "el", "viewport$", "header$", "watchElementSize", "switchMap", "watchViewportAt", "map", "y", "distinctUntilKeyChanged", "mountTabs", "options", "defer", "push$", "Subject", "hidden", "feature", "of", "tap", "state", "finalize", "__spreadValues", "watchTableOfContents", "el", "viewport$", "header$", "table", "anchors", "getElements", "anchor", "id", "target", "getOptionalElement", "adjust$", "distinctUntilKeyChanged", "map", "height", "main", "getComponentElement", "grid", "getElement", "share", "watchElementSize", "switchMap", "body", "defer", "path", "of", "index", "offset", "a", "b", "combineLatestWith", "adjust", "scan", "prev", "next", "y", "size", "last", "distinctUntilChanged", "startWith", "bufferCount", "mountTableOfContents", "target$", "push$", "Subject", "done$", "takeLast", "feature", "smooth$", "merge", "debounceTime", "filter", "withLatestFrom", "behavior", "container", "getElementContainer", "getElementSize", "takeUntil", "skip", "repeat", "url", "getLocation", "active", "hash", "tap", "state", "finalize", "__spreadValues", "watchBackToTop", "_el", "viewport$", "main$", "target$", "direction$", "map", "y", "bufferCount", "a", "b", "distinctUntilChanged", "active$", "active", "combineLatest", "direction", "takeUntil", "skip", "endWith", "repeat", "hidden", "mountBackToTop", "el", "header$", "push$", "Subject", "done$", "takeLast", "distinctUntilKeyChanged", "height", "tap", "state", "finalize", "__spreadValues", "patchIndeterminate", "document$", "tablet$", "switchMap", "getElements", "tap", "el", "mergeMap", "fromEvent", "takeWhile", "map", "withLatestFrom", "tablet", "isAppleDevice", "patchScrollfix", "document$", "switchMap", "getElements", "tap", "el", "filter", "mergeMap", "fromEvent", "map", "top", "patchScrolllock", "viewport$", "tablet$", "combineLatest", "watchToggle", "map", "active", "tablet", "switchMap", "of", "delay", "withLatestFrom", "y", "value", "obj", "data", "key", "x", "y", "nodes", "parent", "i", "node", "document$", "watchDocument", "location$", "watchLocation", "target$", "watchLocationTarget", "keyboard$", "watchKeyboard", "viewport$", "watchViewport", "tablet$", "watchMedia", "screen$", "print$", "watchPrint", "config", "configuration", "index$", "requestJSON", "NEVER", "alert$", "Subject", "setupClipboardJS", "feature", "setupInstantLoading", "_a", "setupVersionSelector", "merge", "delay", "setToggle", "filter", "mode", "key", "prev", "getOptionalElement", "next", "patchIndeterminate", "patchScrollfix", "patchScrolllock", "header$", "watchHeader", "getComponentElement", "main$", "map", "switchMap", "el", "watchMain", "shareReplay", "control$", "getComponentElements", "mountConsent", "mountDialog", "mountHeader", "mountPalette", "mountSearch", "mountSource", "content$", "defer", "mountAnnounce", "mountContent", "mountSearchHiglight", "EMPTY", "mountHeaderTitle", "at", "mountSidebar", "mountTabs", "mountTableOfContents", "mountBackToTop", "component$", "mergeWith"] +} diff --git a/assets/javascripts/lunr/min/lunr.ar.min.js b/assets/javascripts/lunr/min/lunr.ar.min.js new file mode 100644 index 00000000000..9b06c26c1fc --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ar.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ar=function(){this.pipeline.reset(),this.pipeline.add(e.ar.trimmer,e.ar.stopWordFilter,e.ar.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ar.stemmer))},e.ar.wordCharacters="ء-ٛٱـ",e.ar.trimmer=e.trimmerSupport.generateTrimmer(e.ar.wordCharacters),e.Pipeline.registerFunction(e.ar.trimmer,"trimmer-ar"),e.ar.stemmer=function(){var e=this;return e.result=!1,e.preRemoved=!1,e.sufRemoved=!1,e.pre={pre1:"ف ك ب و س ل ن ا ي ت",pre2:"ال لل",pre3:"بال وال فال تال كال ولل",pre4:"فبال كبال وبال وكال"},e.suf={suf1:"ه ك ت ن ا ي",suf2:"نك نه ها وك يا اه ون ين تن تم نا وا ان كم كن ني نن ما هم هن تك ته ات يه",suf3:"تين كهم نيه نهم ونه وها يهم ونا ونك وني وهم تكم تنا تها تني تهم كما كها ناه نكم هنا تان يها",suf4:"كموه ناها ونني ونهم تكما تموه تكاه كماه ناكم ناهم نيها وننا"},e.patterns=JSON.parse('{"pt43":[{"pt":[{"c":"ا","l":1}]},{"pt":[{"c":"ا,ت,ن,ي","l":0}],"mPt":[{"c":"ف","l":0,"m":1},{"c":"ع","l":1,"m":2},{"c":"ل","l":2,"m":3}]},{"pt":[{"c":"و","l":2}],"mPt":[{"c":"ف","l":0,"m":0},{"c":"ع","l":1,"m":1},{"c":"ل","l":2,"m":3}]},{"pt":[{"c":"ا","l":2}]},{"pt":[{"c":"ي","l":2}],"mPt":[{"c":"ف","l":0,"m":0},{"c":"ع","l":1,"m":1},{"c":"ا","l":2},{"c":"ل","l":3,"m":3}]},{"pt":[{"c":"م","l":0}]}],"pt53":[{"pt":[{"c":"ت","l":0},{"c":"ا","l":2}]},{"pt":[{"c":"ا,ن,ت,ي","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":0},{"c":"ا","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":3},{"c":"ل","l":3,"m":4},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":0},{"c":"ا","l":3}],"mPt":[{"c":"ف","l":0,"m":1},{"c":"ع","l":1,"m":2},{"c":"ل","l":2,"m":4}]},{"pt":[{"c":"ا","l":3},{"c":"ن","l":4}]},{"pt":[{"c":"ت","l":0},{"c":"ي","l":3}]},{"pt":[{"c":"م","l":0},{"c":"و","l":3}]},{"pt":[{"c":"ا","l":1},{"c":"و","l":3}]},{"pt":[{"c":"و","l":1},{"c":"ا","l":2}]},{"pt":[{"c":"م","l":0},{"c":"ا","l":3}]},{"pt":[{"c":"م","l":0},{"c":"ي","l":3}]},{"pt":[{"c":"ا","l":2},{"c":"ن","l":3}]},{"pt":[{"c":"م","l":0},{"c":"ن","l":1}],"mPt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ف","l":2,"m":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"م","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"م","l":0},{"c":"ا","l":2}]},{"pt":[{"c":"م","l":1},{"c":"ا","l":3}]},{"pt":[{"c":"ي,ت,ا,ن","l":0},{"c":"ت","l":1}],"mPt":[{"c":"ف","l":0,"m":2},{"c":"ع","l":1,"m":3},{"c":"ا","l":2},{"c":"ل","l":3,"m":4}]},{"pt":[{"c":"ت,ي,ا,ن","l":0},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ت","l":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":2},{"c":"ي","l":3}]},{"pt":[{"c":"ا,ي,ت,ن","l":0},{"c":"ن","l":1}],"mPt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ف","l":2,"m":2},{"c":"ع","l":3,"m":3},{"c":"ا","l":4},{"c":"ل","l":5,"m":4}]},{"pt":[{"c":"ا","l":3},{"c":"ء","l":4}]}],"pt63":[{"pt":[{"c":"ا","l":0},{"c":"ت","l":2},{"c":"ا","l":4}]},{"pt":[{"c":"ا,ت,ن,ي","l":0},{"c":"س","l":1},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ف","l":3,"m":3},{"c":"ع","l":4,"m":4},{"c":"ا","l":5},{"c":"ل","l":6,"m":5}]},{"pt":[{"c":"ا,ن,ت,ي","l":0},{"c":"و","l":3}]},{"pt":[{"c":"م","l":0},{"c":"س","l":1},{"c":"ت","l":2}],"mPt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ف","l":3,"m":3},{"c":"ع","l":4,"m":4},{"c":"ا","l":5},{"c":"ل","l":6,"m":5}]},{"pt":[{"c":"ي","l":1},{"c":"ي","l":3},{"c":"ا","l":4},{"c":"ء","l":5}]},{"pt":[{"c":"ا","l":0},{"c":"ن","l":1},{"c":"ا","l":4}]}],"pt54":[{"pt":[{"c":"ت","l":0}]},{"pt":[{"c":"ا,ي,ت,ن","l":0}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":2},{"c":"ل","l":3,"m":3},{"c":"ر","l":4,"m":4},{"c":"ا","l":5},{"c":"ر","l":6,"m":4}]},{"pt":[{"c":"م","l":0}],"mPt":[{"c":"ا","l":0},{"c":"ف","l":1,"m":1},{"c":"ع","l":2,"m":2},{"c":"ل","l":3,"m":3},{"c":"ر","l":4,"m":4},{"c":"ا","l":5},{"c":"ر","l":6,"m":4}]},{"pt":[{"c":"ا","l":2}]},{"pt":[{"c":"ا","l":0},{"c":"ن","l":2}]}],"pt64":[{"pt":[{"c":"ا","l":0},{"c":"ا","l":4}]},{"pt":[{"c":"م","l":0},{"c":"ت","l":1}]}],"pt73":[{"pt":[{"c":"ا","l":0},{"c":"س","l":1},{"c":"ت","l":2},{"c":"ا","l":5}]}],"pt75":[{"pt":[{"c":"ا","l":0},{"c":"ا","l":5}]}]}'),e.execArray=["cleanWord","removeDiacritics","cleanAlef","removeStopWords","normalizeHamzaAndAlef","removeStartWaw","removePre432","removeEndTaa","wordCheck"],e.stem=function(){var r=0;for(e.result=!1,e.preRemoved=!1,e.sufRemoved=!1;r=0)return!0},e.normalizeHamzaAndAlef=function(){return e.word=e.word.replace("ؤ","ء"),e.word=e.word.replace("ئ","ء"),e.word=e.word.replace(/([\u0627])\1+/gi,"ا"),!1},e.removeEndTaa=function(){return!(e.word.length>2)||(e.word=e.word.replace(/[\u0627]$/,""),e.word=e.word.replace("ة",""),!1)},e.removeStartWaw=function(){return e.word.length>3&&"و"==e.word[0]&&"و"==e.word[1]&&(e.word=e.word.slice(1)),!1},e.removePre432=function(){var r=e.word;if(e.word.length>=7){var t=new RegExp("^("+e.pre.pre4.split(" ").join("|")+")");e.word=e.word.replace(t,"")}if(e.word==r&&e.word.length>=6){var c=new RegExp("^("+e.pre.pre3.split(" ").join("|")+")");e.word=e.word.replace(c,"")}if(e.word==r&&e.word.length>=5){var l=new RegExp("^("+e.pre.pre2.split(" ").join("|")+")");e.word=e.word.replace(l,"")}return r!=e.word&&(e.preRemoved=!0),!1},e.patternCheck=function(r){for(var t=0;t3){var t=new RegExp("^("+e.pre.pre1.split(" ").join("|")+")");e.word=e.word.replace(t,"")}return r!=e.word&&(e.preRemoved=!0),!1},e.removeSuf1=function(){var r=e.word;if(0==e.sufRemoved&&e.word.length>3){var t=new RegExp("("+e.suf.suf1.split(" ").join("|")+")$");e.word=e.word.replace(t,"")}return r!=e.word&&(e.sufRemoved=!0),!1},e.removeSuf432=function(){var r=e.word;if(e.word.length>=6){var t=new RegExp("("+e.suf.suf4.split(" ").join("|")+")$");e.word=e.word.replace(t,"")}if(e.word==r&&e.word.length>=5){var c=new RegExp("("+e.suf.suf3.split(" ").join("|")+")$");e.word=e.word.replace(c,"")}if(e.word==r&&e.word.length>=4){var l=new RegExp("("+e.suf.suf2.split(" ").join("|")+")$");e.word=e.word.replace(l,"")}return r!=e.word&&(e.sufRemoved=!0),!1},e.wordCheck=function(){for(var r=(e.word,[e.removeSuf432,e.removeSuf1,e.removePre1]),t=0,c=!1;e.word.length>=7&&!e.result&&t=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.de.min.js b/assets/javascripts/lunr/min/lunr.de.min.js new file mode 100644 index 00000000000..f3b5c108c9e --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.de.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `German` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!v.eq_s(1,e)||(v.ket=v.cursor,!v.in_grouping(p,97,252)))&&(v.slice_from(r),v.cursor=n,!0)}function i(){for(var r,n,i,s,t=v.cursor;;)if(r=v.cursor,v.bra=r,v.eq_s(1,"ß"))v.ket=v.cursor,v.slice_from("ss");else{if(r>=v.limit)break;v.cursor=r+1}for(v.cursor=t;;)for(n=v.cursor;;){if(i=v.cursor,v.in_grouping(p,97,252)){if(s=v.cursor,v.bra=s,e("u","U",i))break;if(v.cursor=s,e("y","Y",i))break}if(i>=v.limit)return void(v.cursor=n);v.cursor=i+1}}function s(){for(;!v.in_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}for(;!v.out_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}return!1}function t(){m=v.limit,l=m;var e=v.cursor+3;0<=e&&e<=v.limit&&(d=e,s()||(m=v.cursor,m=v.limit)return;v.cursor++}}}function c(){return m<=v.cursor}function u(){return l<=v.cursor}function a(){var e,r,n,i,s=v.limit-v.cursor;if(v.ket=v.cursor,(e=v.find_among_b(w,7))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:v.slice_del(),v.ket=v.cursor,v.eq_s_b(1,"s")&&(v.bra=v.cursor,v.eq_s_b(3,"nis")&&v.slice_del());break;case 3:v.in_grouping_b(g,98,116)&&v.slice_del()}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(f,4))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:if(v.in_grouping_b(k,98,116)){var t=v.cursor-3;v.limit_backward<=t&&t<=v.limit&&(v.cursor=t,v.slice_del())}}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(_,8))&&(v.bra=v.cursor,u()))switch(e){case 1:v.slice_del(),v.ket=v.cursor,v.eq_s_b(2,"ig")&&(v.bra=v.cursor,r=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-r,u()&&v.slice_del()));break;case 2:n=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-n,v.slice_del());break;case 3:if(v.slice_del(),v.ket=v.cursor,i=v.limit-v.cursor,!v.eq_s_b(2,"er")&&(v.cursor=v.limit-i,!v.eq_s_b(2,"en")))break;v.bra=v.cursor,c()&&v.slice_del();break;case 4:v.slice_del(),v.ket=v.cursor,e=v.find_among_b(b,2),e&&(v.bra=v.cursor,u()&&1==e&&v.slice_del())}}var d,l,m,h=[new r("",-1,6),new r("U",0,2),new r("Y",0,1),new r("ä",0,3),new r("ö",0,4),new r("ü",0,5)],w=[new r("e",-1,2),new r("em",-1,1),new r("en",-1,2),new r("ern",-1,1),new r("er",-1,1),new r("s",-1,3),new r("es",5,2)],f=[new r("en",-1,1),new r("er",-1,1),new r("st",-1,2),new r("est",2,1)],b=[new r("ig",-1,1),new r("lich",-1,1)],_=[new r("end",-1,1),new r("ig",-1,2),new r("ung",-1,1),new r("lich",-1,3),new r("isch",-1,2),new r("ik",-1,2),new r("heit",-1,3),new r("keit",-1,4)],p=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],g=[117,30,5],k=[117,30,4],v=new n;this.setCurrent=function(e){v.setCurrent(e)},this.getCurrent=function(){return v.getCurrent()},this.stem=function(){var e=v.cursor;return i(),v.cursor=e,t(),v.limit_backward=e,v.cursor=v.limit,a(),v.cursor=v.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.du.min.js b/assets/javascripts/lunr/min/lunr.du.min.js new file mode 100644 index 00000000000..49a0f3f0ac1 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.du.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Dutch` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e,r,i,o=C.cursor;;){if(C.bra=C.cursor,e=C.find_among(b,11))switch(C.ket=C.cursor,e){case 1:C.slice_from("a");continue;case 2:C.slice_from("e");continue;case 3:C.slice_from("i");continue;case 4:C.slice_from("o");continue;case 5:C.slice_from("u");continue;case 6:if(C.cursor>=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(r=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=r);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=r;else if(n(r))break}else if(n(r))break}function n(e){return C.cursor=e,e>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,f=_,t()||(_=C.cursor,_<3&&(_=3),t()||(f=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var e;;)if(C.bra=C.cursor,e=C.find_among(p,3))switch(C.ket=C.cursor,e){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return f<=C.cursor}function a(){var e=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-e,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var e;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.slice_del(),w=!0,a())))}function m(){var e;u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.eq_s_b(3,"gem")||(C.cursor=C.limit-e,C.slice_del(),a())))}function d(){var e,r,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,e=C.find_among_b(h,5))switch(C.bra=C.cursor,e){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(z,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(r=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-r,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,e=C.find_among_b(k,6))switch(C.bra=C.cursor,e){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(j,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var f,_,w,b=[new r("",-1,6),new r("á",0,1),new r("ä",0,1),new r("é",0,2),new r("ë",0,2),new r("í",0,3),new r("ï",0,3),new r("ó",0,4),new r("ö",0,4),new r("ú",0,5),new r("ü",0,5)],p=[new r("",-1,3),new r("I",0,2),new r("Y",0,1)],g=[new r("dd",-1,-1),new r("kk",-1,-1),new r("tt",-1,-1)],h=[new r("ene",-1,2),new r("se",-1,3),new r("en",-1,2),new r("heden",2,1),new r("s",-1,3)],k=[new r("end",-1,1),new r("ig",-1,2),new r("ing",-1,1),new r("lijk",-1,3),new r("baar",-1,4),new r("bar",-1,5)],v=[new r("aa",-1,-1),new r("ee",-1,-1),new r("oo",-1,-1),new r("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(e){C.setCurrent(e)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var r=C.cursor;return e(),C.cursor=r,o(),C.limit_backward=r,C.cursor=C.limit,d(),C.cursor=C.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.es.min.js b/assets/javascripts/lunr/min/lunr.es.min.js new file mode 100644 index 00000000000..2989d34265c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.es.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Spanish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=function(){var s=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(){if(A.out_grouping(x,97,252)){for(;!A.in_grouping(x,97,252);){if(A.cursor>=A.limit)return!0;A.cursor++}return!1}return!0}function n(){if(A.in_grouping(x,97,252)){var s=A.cursor;if(e()){if(A.cursor=s,!A.in_grouping(x,97,252))return!0;for(;!A.out_grouping(x,97,252);){if(A.cursor>=A.limit)return!0;A.cursor++}}return!1}return!0}function i(){var s,r=A.cursor;if(n()){if(A.cursor=r,!A.out_grouping(x,97,252))return;if(s=A.cursor,e()){if(A.cursor=s,!A.in_grouping(x,97,252)||A.cursor>=A.limit)return;A.cursor++}}g=A.cursor}function a(){for(;!A.in_grouping(x,97,252);){if(A.cursor>=A.limit)return!1;A.cursor++}for(;!A.out_grouping(x,97,252);){if(A.cursor>=A.limit)return!1;A.cursor++}return!0}function t(){var e=A.cursor;g=A.limit,p=g,v=g,i(),A.cursor=e,a()&&(p=A.cursor,a()&&(v=A.cursor))}function o(){for(var e;;){if(A.bra=A.cursor,e=A.find_among(k,6))switch(A.ket=A.cursor,e){case 1:A.slice_from("a");continue;case 2:A.slice_from("e");continue;case 3:A.slice_from("i");continue;case 4:A.slice_from("o");continue;case 5:A.slice_from("u");continue;case 6:if(A.cursor>=A.limit)break;A.cursor++;continue}break}}function u(){return g<=A.cursor}function w(){return p<=A.cursor}function c(){return v<=A.cursor}function m(){var e;if(A.ket=A.cursor,A.find_among_b(y,13)&&(A.bra=A.cursor,(e=A.find_among_b(q,11))&&u()))switch(e){case 1:A.bra=A.cursor,A.slice_from("iendo");break;case 2:A.bra=A.cursor,A.slice_from("ando");break;case 3:A.bra=A.cursor,A.slice_from("ar");break;case 4:A.bra=A.cursor,A.slice_from("er");break;case 5:A.bra=A.cursor,A.slice_from("ir");break;case 6:A.slice_del();break;case 7:A.eq_s_b(1,"u")&&A.slice_del()}}function l(e,s){if(!c())return!0;A.slice_del(),A.ket=A.cursor;var r=A.find_among_b(e,s);return r&&(A.bra=A.cursor,1==r&&c()&&A.slice_del()),!1}function d(e){return!c()||(A.slice_del(),A.ket=A.cursor,A.eq_s_b(2,e)&&(A.bra=A.cursor,c()&&A.slice_del()),!1)}function b(){var e;if(A.ket=A.cursor,e=A.find_among_b(S,46)){switch(A.bra=A.cursor,e){case 1:if(!c())return!1;A.slice_del();break;case 2:if(d("ic"))return!1;break;case 3:if(!c())return!1;A.slice_from("log");break;case 4:if(!c())return!1;A.slice_from("u");break;case 5:if(!c())return!1;A.slice_from("ente");break;case 6:if(!w())return!1;A.slice_del(),A.ket=A.cursor,e=A.find_among_b(C,4),e&&(A.bra=A.cursor,c()&&(A.slice_del(),1==e&&(A.ket=A.cursor,A.eq_s_b(2,"at")&&(A.bra=A.cursor,c()&&A.slice_del()))));break;case 7:if(l(P,3))return!1;break;case 8:if(l(F,3))return!1;break;case 9:if(d("at"))return!1}return!0}return!1}function f(){var e,s;if(A.cursor>=g&&(s=A.limit_backward,A.limit_backward=g,A.ket=A.cursor,e=A.find_among_b(W,12),A.limit_backward=s,e)){if(A.bra=A.cursor,1==e){if(!A.eq_s_b(1,"u"))return!1;A.slice_del()}return!0}return!1}function _(){var e,s,r,n;if(A.cursor>=g&&(s=A.limit_backward,A.limit_backward=g,A.ket=A.cursor,e=A.find_among_b(L,96),A.limit_backward=s,e))switch(A.bra=A.cursor,e){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"u")?(n=A.limit-A.cursor,A.eq_s_b(1,"g")?A.cursor=A.limit-n:A.cursor=A.limit-r):A.cursor=A.limit-r,A.bra=A.cursor;case 2:A.slice_del()}}function h(){var e,s;if(A.ket=A.cursor,e=A.find_among_b(z,8))switch(A.bra=A.cursor,e){case 1:u()&&A.slice_del();break;case 2:u()&&(A.slice_del(),A.ket=A.cursor,A.eq_s_b(1,"u")&&(A.bra=A.cursor,s=A.limit-A.cursor,A.eq_s_b(1,"g")&&(A.cursor=A.limit-s,u()&&A.slice_del())))}}var v,p,g,k=[new s("",-1,6),new s("á",0,1),new s("é",0,2),new s("í",0,3),new s("ó",0,4),new s("ú",0,5)],y=[new s("la",-1,-1),new s("sela",0,-1),new s("le",-1,-1),new s("me",-1,-1),new s("se",-1,-1),new s("lo",-1,-1),new s("selo",5,-1),new s("las",-1,-1),new s("selas",7,-1),new s("les",-1,-1),new s("los",-1,-1),new s("selos",10,-1),new s("nos",-1,-1)],q=[new s("ando",-1,6),new s("iendo",-1,6),new s("yendo",-1,7),new s("ándo",-1,2),new s("iéndo",-1,1),new s("ar",-1,6),new s("er",-1,6),new s("ir",-1,6),new s("ár",-1,3),new s("ér",-1,4),new s("ír",-1,5)],C=[new s("ic",-1,-1),new s("ad",-1,-1),new s("os",-1,-1),new s("iv",-1,1)],P=[new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,1)],F=[new s("ic",-1,1),new s("abil",-1,1),new s("iv",-1,1)],S=[new s("ica",-1,1),new s("ancia",-1,2),new s("encia",-1,5),new s("adora",-1,2),new s("osa",-1,1),new s("ista",-1,1),new s("iva",-1,9),new s("anza",-1,1),new s("logía",-1,3),new s("idad",-1,8),new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,2),new s("mente",-1,7),new s("amente",13,6),new s("ación",-1,2),new s("ución",-1,4),new s("ico",-1,1),new s("ismo",-1,1),new s("oso",-1,1),new s("amiento",-1,1),new s("imiento",-1,1),new s("ivo",-1,9),new s("ador",-1,2),new s("icas",-1,1),new s("ancias",-1,2),new s("encias",-1,5),new s("adoras",-1,2),new s("osas",-1,1),new s("istas",-1,1),new s("ivas",-1,9),new s("anzas",-1,1),new s("logías",-1,3),new s("idades",-1,8),new s("ables",-1,1),new s("ibles",-1,1),new s("aciones",-1,2),new s("uciones",-1,4),new s("adores",-1,2),new s("antes",-1,2),new s("icos",-1,1),new s("ismos",-1,1),new s("osos",-1,1),new s("amientos",-1,1),new s("imientos",-1,1),new s("ivos",-1,9)],W=[new s("ya",-1,1),new s("ye",-1,1),new s("yan",-1,1),new s("yen",-1,1),new s("yeron",-1,1),new s("yendo",-1,1),new s("yo",-1,1),new s("yas",-1,1),new s("yes",-1,1),new s("yais",-1,1),new s("yamos",-1,1),new s("yó",-1,1)],L=[new s("aba",-1,2),new s("ada",-1,2),new s("ida",-1,2),new s("ara",-1,2),new s("iera",-1,2),new s("ía",-1,2),new s("aría",5,2),new s("ería",5,2),new s("iría",5,2),new s("ad",-1,2),new s("ed",-1,2),new s("id",-1,2),new s("ase",-1,2),new s("iese",-1,2),new s("aste",-1,2),new s("iste",-1,2),new s("an",-1,2),new s("aban",16,2),new s("aran",16,2),new s("ieran",16,2),new s("ían",16,2),new s("arían",20,2),new s("erían",20,2),new s("irían",20,2),new s("en",-1,1),new s("asen",24,2),new s("iesen",24,2),new s("aron",-1,2),new s("ieron",-1,2),new s("arán",-1,2),new s("erán",-1,2),new s("irán",-1,2),new s("ado",-1,2),new s("ido",-1,2),new s("ando",-1,2),new s("iendo",-1,2),new s("ar",-1,2),new s("er",-1,2),new s("ir",-1,2),new s("as",-1,2),new s("abas",39,2),new s("adas",39,2),new s("idas",39,2),new s("aras",39,2),new s("ieras",39,2),new s("ías",39,2),new s("arías",45,2),new s("erías",45,2),new s("irías",45,2),new s("es",-1,1),new s("ases",49,2),new s("ieses",49,2),new s("abais",-1,2),new s("arais",-1,2),new s("ierais",-1,2),new s("íais",-1,2),new s("aríais",55,2),new s("eríais",55,2),new s("iríais",55,2),new s("aseis",-1,2),new s("ieseis",-1,2),new s("asteis",-1,2),new s("isteis",-1,2),new s("áis",-1,2),new s("éis",-1,1),new s("aréis",64,2),new s("eréis",64,2),new s("iréis",64,2),new s("ados",-1,2),new s("idos",-1,2),new s("amos",-1,2),new s("ábamos",70,2),new s("áramos",70,2),new s("iéramos",70,2),new s("íamos",70,2),new s("aríamos",74,2),new s("eríamos",74,2),new s("iríamos",74,2),new s("emos",-1,1),new s("aremos",78,2),new s("eremos",78,2),new s("iremos",78,2),new s("ásemos",78,2),new s("iésemos",78,2),new s("imos",-1,2),new s("arás",-1,2),new s("erás",-1,2),new s("irás",-1,2),new s("ís",-1,2),new s("ará",-1,2),new s("erá",-1,2),new s("irá",-1,2),new s("aré",-1,2),new s("eré",-1,2),new s("iré",-1,2),new s("ió",-1,2)],z=[new s("a",-1,1),new s("e",-1,2),new s("o",-1,1),new s("os",-1,1),new s("á",-1,1),new s("é",-1,2),new s("í",-1,1),new s("ó",-1,1)],x=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],A=new r;this.setCurrent=function(e){A.setCurrent(e)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return t(),A.limit_backward=e,A.cursor=A.limit,m(),A.cursor=A.limit,b()||(A.cursor=A.limit,f()||(A.cursor=A.limit,_())),A.cursor=A.limit,h(),A.cursor=A.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estará estarán estarás estaré estaréis estaría estaríais estaríamos estarían estarías estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviéramos estuviésemos estuvo está estábamos estáis están estás esté estéis estén estés fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuéramos fuésemos ha habida habidas habido habidos habiendo habremos habrá habrán habrás habré habréis habría habríais habríamos habrían habrías habéis había habíais habíamos habían habías han has hasta hay haya hayamos hayan hayas hayáis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiéramos hubiésemos hubo la las le les lo los me mi mis mucho muchos muy más mí mía mías mío míos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes qué se sea seamos sean seas seremos será serán serás seré seréis sería seríais seríamos serían serías seáis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sí también tanto te tendremos tendrá tendrán tendrás tendré tendréis tendría tendríais tendríamos tendrían tendrías tened tenemos tenga tengamos tengan tengas tengo tengáis tenida tenidas tenido tenidos teniendo tenéis tenía teníais teníamos tenían tenías ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviéramos tuviésemos tuvo tuya tuyas tuyo tuyos tú un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo él éramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.fi.min.js b/assets/javascripts/lunr/min/lunr.fi.min.js new file mode 100644 index 00000000000..29f5dfcea8f --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.fi.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Finnish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=function(){var e=i.stemmerSupport.Among,r=i.stemmerSupport.SnowballProgram,n=new function(){function i(){f=A.limit,d=f,n()||(f=A.cursor,n()||(d=A.cursor))}function n(){for(var i;;){if(i=A.cursor,A.in_grouping(W,97,246))break;if(A.cursor=i,i>=A.limit)return!0;A.cursor++}for(A.cursor=i;!A.out_grouping(W,97,246);){if(A.cursor>=A.limit)return!0;A.cursor++}return!1}function t(){return d<=A.cursor}function s(){var i,e;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(h,10)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.in_grouping_b(x,97,246))return;break;case 2:if(!t())return}A.slice_del()}else A.limit_backward=e}function o(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(v,9))switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"k")||(A.cursor=A.limit-r,A.slice_del());break;case 2:A.slice_del(),A.ket=A.cursor,A.eq_s_b(3,"kse")&&(A.bra=A.cursor,A.slice_from("ksi"));break;case 3:A.slice_del();break;case 4:A.find_among_b(p,6)&&A.slice_del();break;case 5:A.find_among_b(g,6)&&A.slice_del();break;case 6:A.find_among_b(j,2)&&A.slice_del()}else A.limit_backward=e}function l(){return A.find_among_b(q,7)}function a(){return A.eq_s_b(1,"i")&&A.in_grouping_b(L,97,246)}function u(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(C,30)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.eq_s_b(1,"a"))return;break;case 2:case 9:if(!A.eq_s_b(1,"e"))return;break;case 3:if(!A.eq_s_b(1,"i"))return;break;case 4:if(!A.eq_s_b(1,"o"))return;break;case 5:if(!A.eq_s_b(1,"ä"))return;break;case 6:if(!A.eq_s_b(1,"ö"))return;break;case 7:if(r=A.limit-A.cursor,!l()&&(A.cursor=A.limit-r,!A.eq_s_b(2,"ie"))){A.cursor=A.limit-r;break}if(A.cursor=A.limit-r,A.cursor<=A.limit_backward){A.cursor=A.limit-r;break}A.cursor--,A.bra=A.cursor;break;case 8:if(!A.in_grouping_b(W,97,246)||!A.out_grouping_b(W,97,246))return}A.slice_del(),k=!0}else A.limit_backward=e}function c(){var i,e,r;if(A.cursor>=d)if(e=A.limit_backward,A.limit_backward=d,A.ket=A.cursor,i=A.find_among_b(P,14)){if(A.bra=A.cursor,A.limit_backward=e,1==i){if(r=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-r}A.slice_del()}else A.limit_backward=e}function m(){var i;A.cursor>=f&&(i=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.find_among_b(F,2)?(A.bra=A.cursor,A.limit_backward=i,A.slice_del()):A.limit_backward=i)}function w(){var i,e,r,n,t,s;if(A.cursor>=f){if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.eq_s_b(1,"t")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.in_grouping_b(W,97,246)&&(A.cursor=A.limit-r,A.slice_del(),A.limit_backward=e,n=A.limit-A.cursor,A.cursor>=d&&(A.cursor=d,t=A.limit_backward,A.limit_backward=A.cursor,A.cursor=A.limit-n,A.ket=A.cursor,i=A.find_among_b(S,2))))){if(A.bra=A.cursor,A.limit_backward=t,1==i){if(s=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-s}return void A.slice_del()}A.limit_backward=e}}function _(){var i,e,r,n;if(A.cursor>=f){for(i=A.limit_backward,A.limit_backward=f,e=A.limit-A.cursor,l()&&(A.cursor=A.limit-e,A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.in_grouping_b(y,97,228)&&(A.bra=A.cursor,A.out_grouping_b(W,97,246)&&A.slice_del()),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"j")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.eq_s_b(1,"o")?A.slice_del():(A.cursor=A.limit-r,A.eq_s_b(1,"u")&&A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"o")&&(A.bra=A.cursor,A.eq_s_b(1,"j")&&A.slice_del()),A.cursor=A.limit-e,A.limit_backward=i;;){if(n=A.limit-A.cursor,A.out_grouping_b(W,97,246)){A.cursor=A.limit-n;break}if(A.cursor=A.limit-n,A.cursor<=A.limit_backward)return;A.cursor--}A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,b=A.slice_to(),A.eq_v_b(b)&&A.slice_del())}}var k,b,d,f,h=[new e("pa",-1,1),new e("sti",-1,2),new e("kaan",-1,1),new e("han",-1,1),new e("kin",-1,1),new e("hän",-1,1),new e("kään",-1,1),new e("ko",-1,1),new e("pä",-1,1),new e("kö",-1,1)],p=[new e("lla",-1,-1),new e("na",-1,-1),new e("ssa",-1,-1),new e("ta",-1,-1),new e("lta",3,-1),new e("sta",3,-1)],g=[new e("llä",-1,-1),new e("nä",-1,-1),new e("ssä",-1,-1),new e("tä",-1,-1),new e("ltä",3,-1),new e("stä",3,-1)],j=[new e("lle",-1,-1),new e("ine",-1,-1)],v=[new e("nsa",-1,3),new e("mme",-1,3),new e("nne",-1,3),new e("ni",-1,2),new e("si",-1,1),new e("an",-1,4),new e("en",-1,6),new e("än",-1,5),new e("nsä",-1,3)],q=[new e("aa",-1,-1),new e("ee",-1,-1),new e("ii",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1),new e("ää",-1,-1),new e("öö",-1,-1)],C=[new e("a",-1,8),new e("lla",0,-1),new e("na",0,-1),new e("ssa",0,-1),new e("ta",0,-1),new e("lta",4,-1),new e("sta",4,-1),new e("tta",4,9),new e("lle",-1,-1),new e("ine",-1,-1),new e("ksi",-1,-1),new e("n",-1,7),new e("han",11,1),new e("den",11,-1,a),new e("seen",11,-1,l),new e("hen",11,2),new e("tten",11,-1,a),new e("hin",11,3),new e("siin",11,-1,a),new e("hon",11,4),new e("hän",11,5),new e("hön",11,6),new e("ä",-1,8),new e("llä",22,-1),new e("nä",22,-1),new e("ssä",22,-1),new e("tä",22,-1),new e("ltä",26,-1),new e("stä",26,-1),new e("ttä",26,9)],P=[new e("eja",-1,-1),new e("mma",-1,1),new e("imma",1,-1),new e("mpa",-1,1),new e("impa",3,-1),new e("mmi",-1,1),new e("immi",5,-1),new e("mpi",-1,1),new e("impi",7,-1),new e("ejä",-1,-1),new e("mmä",-1,1),new e("immä",10,-1),new e("mpä",-1,1),new e("impä",12,-1)],F=[new e("i",-1,-1),new e("j",-1,-1)],S=[new e("mma",-1,1),new e("imma",0,-1)],y=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],W=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],x=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],A=new r;this.setCurrent=function(i){A.setCurrent(i)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return i(),k=!1,A.limit_backward=e,A.cursor=A.limit,s(),A.cursor=A.limit,o(),A.cursor=A.limit,u(),A.cursor=A.limit,c(),A.cursor=A.limit,k?(m(),A.cursor=A.limit):(A.cursor=A.limit,w(),A.cursor=A.limit),_(),!0}};return function(i){return"function"==typeof i.update?i.update(function(i){return n.setCurrent(i),n.stem(),n.getCurrent()}):(n.setCurrent(i),n.stem(),n.getCurrent())}}(),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.fr.min.js b/assets/javascripts/lunr/min/lunr.fr.min.js new file mode 100644 index 00000000000..68cd0094ae0 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.fr.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `French` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,s){return!(!W.eq_s(1,e)||(W.ket=W.cursor,!W.in_grouping(F,97,251)))&&(W.slice_from(r),W.cursor=s,!0)}function i(e,r,s){return!!W.eq_s(1,e)&&(W.ket=W.cursor,W.slice_from(r),W.cursor=s,!0)}function n(){for(var r,s;;){if(r=W.cursor,W.in_grouping(F,97,251)){if(W.bra=W.cursor,s=W.cursor,e("u","U",r))continue;if(W.cursor=s,e("i","I",r))continue;if(W.cursor=s,i("y","Y",r))continue}if(W.cursor=r,W.bra=r,!e("y","Y",r)){if(W.cursor=r,W.eq_s(1,"q")&&(W.bra=W.cursor,i("u","U",r)))continue;if(W.cursor=r,r>=W.limit)return;W.cursor++}}}function t(){for(;!W.in_grouping(F,97,251);){if(W.cursor>=W.limit)return!0;W.cursor++}for(;!W.out_grouping(F,97,251);){if(W.cursor>=W.limit)return!0;W.cursor++}return!1}function u(){var e=W.cursor;if(q=W.limit,g=q,p=q,W.in_grouping(F,97,251)&&W.in_grouping(F,97,251)&&W.cursor=W.limit){W.cursor=q;break}W.cursor++}while(!W.in_grouping(F,97,251))}q=W.cursor,W.cursor=e,t()||(g=W.cursor,t()||(p=W.cursor))}function o(){for(var e,r;;){if(r=W.cursor,W.bra=r,!(e=W.find_among(h,4)))break;switch(W.ket=W.cursor,e){case 1:W.slice_from("i");break;case 2:W.slice_from("u");break;case 3:W.slice_from("y");break;case 4:if(W.cursor>=W.limit)return;W.cursor++}}}function c(){return q<=W.cursor}function a(){return g<=W.cursor}function l(){return p<=W.cursor}function w(){var e,r;if(W.ket=W.cursor,e=W.find_among_b(C,43)){switch(W.bra=W.cursor,e){case 1:if(!l())return!1;W.slice_del();break;case 2:if(!l())return!1;W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"ic")&&(W.bra=W.cursor,l()?W.slice_del():W.slice_from("iqU"));break;case 3:if(!l())return!1;W.slice_from("log");break;case 4:if(!l())return!1;W.slice_from("u");break;case 5:if(!l())return!1;W.slice_from("ent");break;case 6:if(!c())return!1;if(W.slice_del(),W.ket=W.cursor,e=W.find_among_b(z,6))switch(W.bra=W.cursor,e){case 1:l()&&(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"at")&&(W.bra=W.cursor,l()&&W.slice_del()));break;case 2:l()?W.slice_del():a()&&W.slice_from("eux");break;case 3:l()&&W.slice_del();break;case 4:c()&&W.slice_from("i")}break;case 7:if(!l())return!1;if(W.slice_del(),W.ket=W.cursor,e=W.find_among_b(y,3))switch(W.bra=W.cursor,e){case 1:l()?W.slice_del():W.slice_from("abl");break;case 2:l()?W.slice_del():W.slice_from("iqU");break;case 3:l()&&W.slice_del()}break;case 8:if(!l())return!1;if(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"at")&&(W.bra=W.cursor,l()&&(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"ic")))){W.bra=W.cursor,l()?W.slice_del():W.slice_from("iqU");break}break;case 9:W.slice_from("eau");break;case 10:if(!a())return!1;W.slice_from("al");break;case 11:if(l())W.slice_del();else{if(!a())return!1;W.slice_from("eux")}break;case 12:if(!a()||!W.out_grouping_b(F,97,251))return!1;W.slice_del();break;case 13:return c()&&W.slice_from("ant"),!1;case 14:return c()&&W.slice_from("ent"),!1;case 15:return r=W.limit-W.cursor,W.in_grouping_b(F,97,251)&&c()&&(W.cursor=W.limit-r,W.slice_del()),!1}return!0}return!1}function f(){var e,r;if(W.cursor=q){if(s=W.limit_backward,W.limit_backward=q,W.ket=W.cursor,e=W.find_among_b(P,7))switch(W.bra=W.cursor,e){case 1:if(l()){if(i=W.limit-W.cursor,!W.eq_s_b(1,"s")&&(W.cursor=W.limit-i,!W.eq_s_b(1,"t")))break;W.slice_del()}break;case 2:W.slice_from("i");break;case 3:W.slice_del();break;case 4:W.eq_s_b(2,"gu")&&W.slice_del()}W.limit_backward=s}}function b(){var e=W.limit-W.cursor;W.find_among_b(U,5)&&(W.cursor=W.limit-e,W.ket=W.cursor,W.cursor>W.limit_backward&&(W.cursor--,W.bra=W.cursor,W.slice_del()))}function d(){for(var e,r=1;W.out_grouping_b(F,97,251);)r--;if(r<=0){if(W.ket=W.cursor,e=W.limit-W.cursor,!W.eq_s_b(1,"é")&&(W.cursor=W.limit-e,!W.eq_s_b(1,"è")))return;W.bra=W.cursor,W.slice_from("e")}}function k(){if(!w()&&(W.cursor=W.limit,!f()&&(W.cursor=W.limit,!m())))return W.cursor=W.limit,void _();W.cursor=W.limit,W.ket=W.cursor,W.eq_s_b(1,"Y")?(W.bra=W.cursor,W.slice_from("i")):(W.cursor=W.limit,W.eq_s_b(1,"ç")&&(W.bra=W.cursor,W.slice_from("c")))}var p,g,q,v=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],h=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],z=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],y=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],C=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],x=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],I=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],P=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],U=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],F=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],S=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],W=new s;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){var e=W.cursor;return n(),W.cursor=e,u(),W.limit_backward=e,W.cursor=W.limit,k(),W.cursor=W.limit,b(),W.cursor=W.limit,d(),W.cursor=W.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.hi.min.js b/assets/javascripts/lunr/min/lunr.hi.min.js new file mode 100644 index 00000000000..7dbc41402cf --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.hi.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Za-zA-Z0-90-9",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.hu.min.js b/assets/javascripts/lunr/min/lunr.hu.min.js new file mode 100644 index 00000000000..ed9d909f734 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.hu.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Hungarian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,n=L.cursor;if(d=L.limit,L.in_grouping(W,97,252))for(;;){if(e=L.cursor,L.out_grouping(W,97,252))return L.cursor=e,L.find_among(g,8)||(L.cursor=e,e=L.limit)return void(d=e);L.cursor++}if(L.cursor=n,L.out_grouping(W,97,252)){for(;!L.in_grouping(W,97,252);){if(L.cursor>=L.limit)return;L.cursor++}d=L.cursor}}function i(){return d<=L.cursor}function a(){var e;if(L.ket=L.cursor,(e=L.find_among_b(h,2))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("a");break;case 2:L.slice_from("e")}}function t(){var e=L.limit-L.cursor;return!!L.find_among_b(p,23)&&(L.cursor=L.limit-e,!0)}function s(){if(L.cursor>L.limit_backward){L.cursor--,L.ket=L.cursor;var e=L.cursor-1;L.limit_backward<=e&&e<=L.limit&&(L.cursor=e,L.bra=e,L.slice_del())}}function c(){var e;if(L.ket=L.cursor,(e=L.find_among_b(_,2))&&(L.bra=L.cursor,i())){if((1==e||2==e)&&!t())return;L.slice_del(),s()}}function o(){L.ket=L.cursor,L.find_among_b(v,44)&&(L.bra=L.cursor,i()&&(L.slice_del(),a()))}function w(){var e;if(L.ket=L.cursor,(e=L.find_among_b(z,3))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("e");break;case 2:case 3:L.slice_from("a")}}function l(){var e;if(L.ket=L.cursor,(e=L.find_among_b(y,6))&&(L.bra=L.cursor,i()))switch(e){case 1:case 2:L.slice_del();break;case 3:L.slice_from("a");break;case 4:L.slice_from("e")}}function u(){var e;if(L.ket=L.cursor,(e=L.find_among_b(j,2))&&(L.bra=L.cursor,i())){if((1==e||2==e)&&!t())return;L.slice_del(),s()}}function m(){var e;if(L.ket=L.cursor,(e=L.find_among_b(C,7))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("a");break;case 2:L.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:L.slice_del()}}function k(){var e;if(L.ket=L.cursor,(e=L.find_among_b(P,12))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 7:case 9:L.slice_del();break;case 2:case 5:case 8:L.slice_from("e");break;case 3:case 6:L.slice_from("a")}}function f(){var e;if(L.ket=L.cursor,(e=L.find_among_b(F,31))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:L.slice_del();break;case 2:case 5:case 10:case 14:case 19:L.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:L.slice_from("e")}}function b(){var e;if(L.ket=L.cursor,(e=L.find_among_b(S,42))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:L.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:L.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:L.slice_from("e")}}var d,g=[new n("cs",-1,-1),new n("dzs",-1,-1),new n("gy",-1,-1),new n("ly",-1,-1),new n("ny",-1,-1),new n("sz",-1,-1),new n("ty",-1,-1),new n("zs",-1,-1)],h=[new n("á",-1,1),new n("é",-1,2)],p=[new n("bb",-1,-1),new n("cc",-1,-1),new n("dd",-1,-1),new n("ff",-1,-1),new n("gg",-1,-1),new n("jj",-1,-1),new n("kk",-1,-1),new n("ll",-1,-1),new n("mm",-1,-1),new n("nn",-1,-1),new n("pp",-1,-1),new n("rr",-1,-1),new n("ccs",-1,-1),new n("ss",-1,-1),new n("zzs",-1,-1),new n("tt",-1,-1),new n("vv",-1,-1),new n("ggy",-1,-1),new n("lly",-1,-1),new n("nny",-1,-1),new n("tty",-1,-1),new n("ssz",-1,-1),new n("zz",-1,-1)],_=[new n("al",-1,1),new n("el",-1,2)],v=[new n("ba",-1,-1),new n("ra",-1,-1),new n("be",-1,-1),new n("re",-1,-1),new n("ig",-1,-1),new n("nak",-1,-1),new n("nek",-1,-1),new n("val",-1,-1),new n("vel",-1,-1),new n("ul",-1,-1),new n("nál",-1,-1),new n("nél",-1,-1),new n("ból",-1,-1),new n("ról",-1,-1),new n("tól",-1,-1),new n("bõl",-1,-1),new n("rõl",-1,-1),new n("tõl",-1,-1),new n("ül",-1,-1),new n("n",-1,-1),new n("an",19,-1),new n("ban",20,-1),new n("en",19,-1),new n("ben",22,-1),new n("képpen",22,-1),new n("on",19,-1),new n("ön",19,-1),new n("képp",-1,-1),new n("kor",-1,-1),new n("t",-1,-1),new n("at",29,-1),new n("et",29,-1),new n("ként",29,-1),new n("anként",32,-1),new n("enként",32,-1),new n("onként",32,-1),new n("ot",29,-1),new n("ért",29,-1),new n("öt",29,-1),new n("hez",-1,-1),new n("hoz",-1,-1),new n("höz",-1,-1),new n("vá",-1,-1),new n("vé",-1,-1)],z=[new n("án",-1,2),new n("én",-1,1),new n("ánként",-1,3)],y=[new n("stul",-1,2),new n("astul",0,1),new n("ástul",0,3),new n("stül",-1,2),new n("estül",3,1),new n("éstül",3,4)],j=[new n("á",-1,1),new n("é",-1,2)],C=[new n("k",-1,7),new n("ak",0,4),new n("ek",0,6),new n("ok",0,5),new n("ák",0,1),new n("ék",0,2),new n("ök",0,3)],P=[new n("éi",-1,7),new n("áéi",0,6),new n("ééi",0,5),new n("é",-1,9),new n("ké",3,4),new n("aké",4,1),new n("eké",4,1),new n("oké",4,1),new n("áké",4,3),new n("éké",4,2),new n("öké",4,1),new n("éé",3,8)],F=[new n("a",-1,18),new n("ja",0,17),new n("d",-1,16),new n("ad",2,13),new n("ed",2,13),new n("od",2,13),new n("ád",2,14),new n("éd",2,15),new n("öd",2,13),new n("e",-1,18),new n("je",9,17),new n("nk",-1,4),new n("unk",11,1),new n("ánk",11,2),new n("énk",11,3),new n("ünk",11,1),new n("uk",-1,8),new n("juk",16,7),new n("ájuk",17,5),new n("ük",-1,8),new n("jük",19,7),new n("éjük",20,6),new n("m",-1,12),new n("am",22,9),new n("em",22,9),new n("om",22,9),new n("ám",22,10),new n("ém",22,11),new n("o",-1,18),new n("á",-1,19),new n("é",-1,20)],S=[new n("id",-1,10),new n("aid",0,9),new n("jaid",1,6),new n("eid",0,9),new n("jeid",3,6),new n("áid",0,7),new n("éid",0,8),new n("i",-1,15),new n("ai",7,14),new n("jai",8,11),new n("ei",7,14),new n("jei",10,11),new n("ái",7,12),new n("éi",7,13),new n("itek",-1,24),new n("eitek",14,21),new n("jeitek",15,20),new n("éitek",14,23),new n("ik",-1,29),new n("aik",18,26),new n("jaik",19,25),new n("eik",18,26),new n("jeik",21,25),new n("áik",18,27),new n("éik",18,28),new n("ink",-1,20),new n("aink",25,17),new n("jaink",26,16),new n("eink",25,17),new n("jeink",28,16),new n("áink",25,18),new n("éink",25,19),new n("aitok",-1,21),new n("jaitok",32,20),new n("áitok",-1,22),new n("im",-1,5),new n("aim",35,4),new n("jaim",36,1),new n("eim",35,4),new n("jeim",38,1),new n("áim",35,2),new n("éim",35,3)],W=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],L=new r;this.setCurrent=function(e){L.setCurrent(e)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){var n=L.cursor;return e(),L.limit_backward=n,L.cursor=L.limit,c(),L.cursor=L.limit,o(),L.cursor=L.limit,w(),L.cursor=L.limit,l(),L.cursor=L.limit,u(),L.cursor=L.limit,k(),L.cursor=L.limit,f(),L.cursor=L.limit,b(),L.cursor=L.limit,m(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.it.min.js b/assets/javascripts/lunr/min/lunr.it.min.js new file mode 100644 index 00000000000..344b6a3c0cf --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.it.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Italian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!x.eq_s(1,e)||(x.ket=x.cursor,!x.in_grouping(L,97,249)))&&(x.slice_from(r),x.cursor=n,!0)}function i(){for(var r,n,i,o,t=x.cursor;;){if(x.bra=x.cursor,r=x.find_among(h,7))switch(x.ket=x.cursor,r){case 1:x.slice_from("à");continue;case 2:x.slice_from("è");continue;case 3:x.slice_from("ì");continue;case 4:x.slice_from("ò");continue;case 5:x.slice_from("ù");continue;case 6:x.slice_from("qU");continue;case 7:if(x.cursor>=x.limit)break;x.cursor++;continue}break}for(x.cursor=t;;)for(n=x.cursor;;){if(i=x.cursor,x.in_grouping(L,97,249)){if(x.bra=x.cursor,o=x.cursor,e("u","U",i))break;if(x.cursor=o,e("i","I",i))break}if(x.cursor=i,x.cursor>=x.limit)return void(x.cursor=n);x.cursor++}}function o(e){if(x.cursor=e,!x.in_grouping(L,97,249))return!1;for(;!x.out_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}return!0}function t(){if(x.in_grouping(L,97,249)){var e=x.cursor;if(x.out_grouping(L,97,249)){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return o(e);x.cursor++}return!0}return o(e)}return!1}function s(){var e,r=x.cursor;if(!t()){if(x.cursor=r,!x.out_grouping(L,97,249))return;if(e=x.cursor,x.out_grouping(L,97,249)){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return x.cursor=e,void(x.in_grouping(L,97,249)&&x.cursor=x.limit)return;x.cursor++}k=x.cursor}function a(){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}for(;!x.out_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}return!0}function u(){var e=x.cursor;k=x.limit,p=k,g=k,s(),x.cursor=e,a()&&(p=x.cursor,a()&&(g=x.cursor))}function c(){for(var e;;){if(x.bra=x.cursor,!(e=x.find_among(q,3)))break;switch(x.ket=x.cursor,e){case 1:x.slice_from("i");break;case 2:x.slice_from("u");break;case 3:if(x.cursor>=x.limit)return;x.cursor++}}}function w(){return k<=x.cursor}function l(){return p<=x.cursor}function m(){return g<=x.cursor}function f(){var e;if(x.ket=x.cursor,x.find_among_b(C,37)&&(x.bra=x.cursor,(e=x.find_among_b(z,5))&&w()))switch(e){case 1:x.slice_del();break;case 2:x.slice_from("e")}}function v(){var e;if(x.ket=x.cursor,!(e=x.find_among_b(S,51)))return!1;switch(x.bra=x.cursor,e){case 1:if(!m())return!1;x.slice_del();break;case 2:if(!m())return!1;x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"ic")&&(x.bra=x.cursor,m()&&x.slice_del());break;case 3:if(!m())return!1;x.slice_from("log");break;case 4:if(!m())return!1;x.slice_from("u");break;case 5:if(!m())return!1;x.slice_from("ente");break;case 6:if(!w())return!1;x.slice_del();break;case 7:if(!l())return!1;x.slice_del(),x.ket=x.cursor,e=x.find_among_b(P,4),e&&(x.bra=x.cursor,m()&&(x.slice_del(),1==e&&(x.ket=x.cursor,x.eq_s_b(2,"at")&&(x.bra=x.cursor,m()&&x.slice_del()))));break;case 8:if(!m())return!1;x.slice_del(),x.ket=x.cursor,e=x.find_among_b(F,3),e&&(x.bra=x.cursor,1==e&&m()&&x.slice_del());break;case 9:if(!m())return!1;x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"at")&&(x.bra=x.cursor,m()&&(x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"ic")&&(x.bra=x.cursor,m()&&x.slice_del())))}return!0}function b(){var e,r;x.cursor>=k&&(r=x.limit_backward,x.limit_backward=k,x.ket=x.cursor,e=x.find_among_b(W,87),e&&(x.bra=x.cursor,1==e&&x.slice_del()),x.limit_backward=r)}function d(){var e=x.limit-x.cursor;if(x.ket=x.cursor,x.in_grouping_b(y,97,242)&&(x.bra=x.cursor,w()&&(x.slice_del(),x.ket=x.cursor,x.eq_s_b(1,"i")&&(x.bra=x.cursor,w()))))return void x.slice_del();x.cursor=x.limit-e}function _(){d(),x.ket=x.cursor,x.eq_s_b(1,"h")&&(x.bra=x.cursor,x.in_grouping_b(U,99,103)&&w()&&x.slice_del())}var g,p,k,h=[new r("",-1,7),new r("qu",0,6),new r("á",0,1),new r("é",0,2),new r("í",0,3),new r("ó",0,4),new r("ú",0,5)],q=[new r("",-1,3),new r("I",0,1),new r("U",0,2)],C=[new r("la",-1,-1),new r("cela",0,-1),new r("gliela",0,-1),new r("mela",0,-1),new r("tela",0,-1),new r("vela",0,-1),new r("le",-1,-1),new r("cele",6,-1),new r("gliele",6,-1),new r("mele",6,-1),new r("tele",6,-1),new r("vele",6,-1),new r("ne",-1,-1),new r("cene",12,-1),new r("gliene",12,-1),new r("mene",12,-1),new r("sene",12,-1),new r("tene",12,-1),new r("vene",12,-1),new r("ci",-1,-1),new r("li",-1,-1),new r("celi",20,-1),new r("glieli",20,-1),new r("meli",20,-1),new r("teli",20,-1),new r("veli",20,-1),new r("gli",20,-1),new r("mi",-1,-1),new r("si",-1,-1),new r("ti",-1,-1),new r("vi",-1,-1),new r("lo",-1,-1),new r("celo",31,-1),new r("glielo",31,-1),new r("melo",31,-1),new r("telo",31,-1),new r("velo",31,-1)],z=[new r("ando",-1,1),new r("endo",-1,1),new r("ar",-1,2),new r("er",-1,2),new r("ir",-1,2)],P=[new r("ic",-1,-1),new r("abil",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],F=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],S=[new r("ica",-1,1),new r("logia",-1,3),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,9),new r("anza",-1,1),new r("enza",-1,5),new r("ice",-1,1),new r("atrice",7,1),new r("iche",-1,1),new r("logie",-1,3),new r("abile",-1,1),new r("ibile",-1,1),new r("usione",-1,4),new r("azione",-1,2),new r("uzione",-1,4),new r("atore",-1,2),new r("ose",-1,1),new r("ante",-1,1),new r("mente",-1,1),new r("amente",19,7),new r("iste",-1,1),new r("ive",-1,9),new r("anze",-1,1),new r("enze",-1,5),new r("ici",-1,1),new r("atrici",25,1),new r("ichi",-1,1),new r("abili",-1,1),new r("ibili",-1,1),new r("ismi",-1,1),new r("usioni",-1,4),new r("azioni",-1,2),new r("uzioni",-1,4),new r("atori",-1,2),new r("osi",-1,1),new r("anti",-1,1),new r("amenti",-1,6),new r("imenti",-1,6),new r("isti",-1,1),new r("ivi",-1,9),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,6),new r("imento",-1,6),new r("ivo",-1,9),new r("ità",-1,8),new r("istà",-1,1),new r("istè",-1,1),new r("istì",-1,1)],W=[new r("isca",-1,1),new r("enda",-1,1),new r("ata",-1,1),new r("ita",-1,1),new r("uta",-1,1),new r("ava",-1,1),new r("eva",-1,1),new r("iva",-1,1),new r("erebbe",-1,1),new r("irebbe",-1,1),new r("isce",-1,1),new r("ende",-1,1),new r("are",-1,1),new r("ere",-1,1),new r("ire",-1,1),new r("asse",-1,1),new r("ate",-1,1),new r("avate",16,1),new r("evate",16,1),new r("ivate",16,1),new r("ete",-1,1),new r("erete",20,1),new r("irete",20,1),new r("ite",-1,1),new r("ereste",-1,1),new r("ireste",-1,1),new r("ute",-1,1),new r("erai",-1,1),new r("irai",-1,1),new r("isci",-1,1),new r("endi",-1,1),new r("erei",-1,1),new r("irei",-1,1),new r("assi",-1,1),new r("ati",-1,1),new r("iti",-1,1),new r("eresti",-1,1),new r("iresti",-1,1),new r("uti",-1,1),new r("avi",-1,1),new r("evi",-1,1),new r("ivi",-1,1),new r("isco",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("Yamo",-1,1),new r("iamo",-1,1),new r("avamo",-1,1),new r("evamo",-1,1),new r("ivamo",-1,1),new r("eremo",-1,1),new r("iremo",-1,1),new r("assimo",-1,1),new r("ammo",-1,1),new r("emmo",-1,1),new r("eremmo",54,1),new r("iremmo",54,1),new r("immo",-1,1),new r("ano",-1,1),new r("iscano",58,1),new r("avano",58,1),new r("evano",58,1),new r("ivano",58,1),new r("eranno",-1,1),new r("iranno",-1,1),new r("ono",-1,1),new r("iscono",65,1),new r("arono",65,1),new r("erono",65,1),new r("irono",65,1),new r("erebbero",-1,1),new r("irebbero",-1,1),new r("assero",-1,1),new r("essero",-1,1),new r("issero",-1,1),new r("ato",-1,1),new r("ito",-1,1),new r("uto",-1,1),new r("avo",-1,1),new r("evo",-1,1),new r("ivo",-1,1),new r("ar",-1,1),new r("ir",-1,1),new r("erà",-1,1),new r("irà",-1,1),new r("erò",-1,1),new r("irò",-1,1)],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],y=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],U=[17],x=new n;this.setCurrent=function(e){x.setCurrent(e)},this.getCurrent=function(){return x.getCurrent()},this.stem=function(){var e=x.cursor;return i(),x.cursor=e,u(),x.limit_backward=e,x.cursor=x.limit,f(),x.cursor=x.limit,v()||(x.cursor=x.limit,b()),x.cursor=x.limit,_(),x.cursor=x.limit_backward,c(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrà avrò avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farà farò fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perché più quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarà sarò se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starà starò stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro è".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ja.min.js b/assets/javascripts/lunr/min/lunr.ja.min.js new file mode 100644 index 00000000000..5f254ebe91f --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ja.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(e=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=e);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=e;else if(n(e))break}else if(n(e))break}function n(r){return C.cursor=r,r>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,d=_,t()||(_=C.cursor,_<3&&(_=3),t()||(d=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var r;;)if(C.bra=C.cursor,r=C.find_among(p,3))switch(C.ket=C.cursor,r){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return d<=C.cursor}function a(){var r=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-r,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var r;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.slice_del(),w=!0,a())))}function m(){var r;u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.eq_s_b(3,"gem")||(C.cursor=C.limit-r,C.slice_del(),a())))}function f(){var r,e,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,r=C.find_among_b(h,5))switch(C.bra=C.cursor,r){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(j,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(e=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-e,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,r=C.find_among_b(k,6))switch(C.bra=C.cursor,r){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(z,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var d,_,w,b=[new e("",-1,6),new e("á",0,1),new e("ä",0,1),new e("é",0,2),new e("ë",0,2),new e("í",0,3),new e("ï",0,3),new e("ó",0,4),new e("ö",0,4),new e("ú",0,5),new e("ü",0,5)],p=[new e("",-1,3),new e("I",0,2),new e("Y",0,1)],g=[new e("dd",-1,-1),new e("kk",-1,-1),new e("tt",-1,-1)],h=[new e("ene",-1,2),new e("se",-1,3),new e("en",-1,2),new e("heden",2,1),new e("s",-1,3)],k=[new e("end",-1,1),new e("ig",-1,2),new e("ing",-1,1),new e("lijk",-1,3),new e("baar",-1,4),new e("bar",-1,5)],v=[new e("aa",-1,-1),new e("ee",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(r){C.setCurrent(r)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var e=C.cursor;return r(),C.cursor=e,o(),C.limit_backward=e,C.cursor=C.limit,f(),C.cursor=C.limit_backward,s(),!0}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.no.min.js b/assets/javascripts/lunr/min/lunr.no.min.js new file mode 100644 index 00000000000..92bc7e4e894 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.no.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Norwegian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.pt.min.js b/assets/javascripts/lunr/min/lunr.pt.min.js new file mode 100644 index 00000000000..6c16996d650 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.pt.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Portuguese` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e;;){if(z.bra=z.cursor,e=z.find_among(k,3))switch(z.ket=z.cursor,e){case 1:z.slice_from("a~");continue;case 2:z.slice_from("o~");continue;case 3:if(z.cursor>=z.limit)break;z.cursor++;continue}break}}function n(){if(z.out_grouping(y,97,250)){for(;!z.in_grouping(y,97,250);){if(z.cursor>=z.limit)return!0;z.cursor++}return!1}return!0}function i(){if(z.in_grouping(y,97,250))for(;!z.out_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}return g=z.cursor,!0}function o(){var e,r,s=z.cursor;if(z.in_grouping(y,97,250))if(e=z.cursor,n()){if(z.cursor=e,i())return}else g=z.cursor;if(z.cursor=s,z.out_grouping(y,97,250)){if(r=z.cursor,n()){if(z.cursor=r,!z.in_grouping(y,97,250)||z.cursor>=z.limit)return;z.cursor++}g=z.cursor}}function t(){for(;!z.in_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}for(;!z.out_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}return!0}function a(){var e=z.cursor;g=z.limit,b=g,h=g,o(),z.cursor=e,t()&&(b=z.cursor,t()&&(h=z.cursor))}function u(){for(var e;;){if(z.bra=z.cursor,e=z.find_among(q,3))switch(z.ket=z.cursor,e){case 1:z.slice_from("ã");continue;case 2:z.slice_from("õ");continue;case 3:if(z.cursor>=z.limit)break;z.cursor++;continue}break}}function w(){return g<=z.cursor}function m(){return b<=z.cursor}function c(){return h<=z.cursor}function l(){var e;if(z.ket=z.cursor,!(e=z.find_among_b(F,45)))return!1;switch(z.bra=z.cursor,e){case 1:if(!c())return!1;z.slice_del();break;case 2:if(!c())return!1;z.slice_from("log");break;case 3:if(!c())return!1;z.slice_from("u");break;case 4:if(!c())return!1;z.slice_from("ente");break;case 5:if(!m())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(j,4),e&&(z.bra=z.cursor,c()&&(z.slice_del(),1==e&&(z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,c()&&z.slice_del()))));break;case 6:if(!c())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(C,3),e&&(z.bra=z.cursor,1==e&&c()&&z.slice_del());break;case 7:if(!c())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(P,3),e&&(z.bra=z.cursor,1==e&&c()&&z.slice_del());break;case 8:if(!c())return!1;z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,c()&&z.slice_del());break;case 9:if(!w()||!z.eq_s_b(1,"e"))return!1;z.slice_from("ir")}return!0}function f(){var e,r;if(z.cursor>=g){if(r=z.limit_backward,z.limit_backward=g,z.ket=z.cursor,e=z.find_among_b(S,120))return z.bra=z.cursor,1==e&&z.slice_del(),z.limit_backward=r,!0;z.limit_backward=r}return!1}function d(){var e;z.ket=z.cursor,(e=z.find_among_b(W,7))&&(z.bra=z.cursor,1==e&&w()&&z.slice_del())}function v(e,r){if(z.eq_s_b(1,e)){z.bra=z.cursor;var s=z.limit-z.cursor;if(z.eq_s_b(1,r))return z.cursor=z.limit-s,w()&&z.slice_del(),!1}return!0}function p(){var e;if(z.ket=z.cursor,e=z.find_among_b(L,4))switch(z.bra=z.cursor,e){case 1:w()&&(z.slice_del(),z.ket=z.cursor,z.limit-z.cursor,v("u","g")&&v("i","c"));break;case 2:z.slice_from("c")}}function _(){if(!l()&&(z.cursor=z.limit,!f()))return z.cursor=z.limit,void d();z.cursor=z.limit,z.ket=z.cursor,z.eq_s_b(1,"i")&&(z.bra=z.cursor,z.eq_s_b(1,"c")&&(z.cursor=z.limit,w()&&z.slice_del()))}var h,b,g,k=[new r("",-1,3),new r("ã",0,1),new r("õ",0,2)],q=[new r("",-1,3),new r("a~",0,1),new r("o~",0,2)],j=[new r("ic",-1,-1),new r("ad",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],C=[new r("ante",-1,1),new r("avel",-1,1),new r("ível",-1,1)],P=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],F=[new r("ica",-1,1),new r("ância",-1,1),new r("ência",-1,4),new r("ira",-1,9),new r("adora",-1,1),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,8),new r("eza",-1,1),new r("logía",-1,2),new r("idade",-1,7),new r("ante",-1,1),new r("mente",-1,6),new r("amente",12,5),new r("ável",-1,1),new r("ível",-1,1),new r("ución",-1,3),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,1),new r("imento",-1,1),new r("ivo",-1,8),new r("aça~o",-1,1),new r("ador",-1,1),new r("icas",-1,1),new r("ências",-1,4),new r("iras",-1,9),new r("adoras",-1,1),new r("osas",-1,1),new r("istas",-1,1),new r("ivas",-1,8),new r("ezas",-1,1),new r("logías",-1,2),new r("idades",-1,7),new r("uciones",-1,3),new r("adores",-1,1),new r("antes",-1,1),new r("aço~es",-1,1),new r("icos",-1,1),new r("ismos",-1,1),new r("osos",-1,1),new r("amentos",-1,1),new r("imentos",-1,1),new r("ivos",-1,8)],S=[new r("ada",-1,1),new r("ida",-1,1),new r("ia",-1,1),new r("aria",2,1),new r("eria",2,1),new r("iria",2,1),new r("ara",-1,1),new r("era",-1,1),new r("ira",-1,1),new r("ava",-1,1),new r("asse",-1,1),new r("esse",-1,1),new r("isse",-1,1),new r("aste",-1,1),new r("este",-1,1),new r("iste",-1,1),new r("ei",-1,1),new r("arei",16,1),new r("erei",16,1),new r("irei",16,1),new r("am",-1,1),new r("iam",20,1),new r("ariam",21,1),new r("eriam",21,1),new r("iriam",21,1),new r("aram",20,1),new r("eram",20,1),new r("iram",20,1),new r("avam",20,1),new r("em",-1,1),new r("arem",29,1),new r("erem",29,1),new r("irem",29,1),new r("assem",29,1),new r("essem",29,1),new r("issem",29,1),new r("ado",-1,1),new r("ido",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("indo",-1,1),new r("ara~o",-1,1),new r("era~o",-1,1),new r("ira~o",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("ir",-1,1),new r("as",-1,1),new r("adas",47,1),new r("idas",47,1),new r("ias",47,1),new r("arias",50,1),new r("erias",50,1),new r("irias",50,1),new r("aras",47,1),new r("eras",47,1),new r("iras",47,1),new r("avas",47,1),new r("es",-1,1),new r("ardes",58,1),new r("erdes",58,1),new r("irdes",58,1),new r("ares",58,1),new r("eres",58,1),new r("ires",58,1),new r("asses",58,1),new r("esses",58,1),new r("isses",58,1),new r("astes",58,1),new r("estes",58,1),new r("istes",58,1),new r("is",-1,1),new r("ais",71,1),new r("eis",71,1),new r("areis",73,1),new r("ereis",73,1),new r("ireis",73,1),new r("áreis",73,1),new r("éreis",73,1),new r("íreis",73,1),new r("ásseis",73,1),new r("ésseis",73,1),new r("ísseis",73,1),new r("áveis",73,1),new r("íeis",73,1),new r("aríeis",84,1),new r("eríeis",84,1),new r("iríeis",84,1),new r("ados",-1,1),new r("idos",-1,1),new r("amos",-1,1),new r("áramos",90,1),new r("éramos",90,1),new r("íramos",90,1),new r("ávamos",90,1),new r("íamos",90,1),new r("aríamos",95,1),new r("eríamos",95,1),new r("iríamos",95,1),new r("emos",-1,1),new r("aremos",99,1),new r("eremos",99,1),new r("iremos",99,1),new r("ássemos",99,1),new r("êssemos",99,1),new r("íssemos",99,1),new r("imos",-1,1),new r("armos",-1,1),new r("ermos",-1,1),new r("irmos",-1,1),new r("ámos",-1,1),new r("arás",-1,1),new r("erás",-1,1),new r("irás",-1,1),new r("eu",-1,1),new r("iu",-1,1),new r("ou",-1,1),new r("ará",-1,1),new r("erá",-1,1),new r("irá",-1,1)],W=[new r("a",-1,1),new r("i",-1,1),new r("o",-1,1),new r("os",-1,1),new r("á",-1,1),new r("í",-1,1),new r("ó",-1,1)],L=[new r("e",-1,1),new r("ç",-1,2),new r("é",-1,1),new r("ê",-1,1)],y=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],z=new s;this.setCurrent=function(e){z.setCurrent(e)},this.getCurrent=function(){return z.getCurrent()},this.stem=function(){var r=z.cursor;return e(),z.cursor=r,a(),z.limit_backward=r,z.cursor=z.limit,_(),z.cursor=z.limit,p(),z.cursor=z.limit_backward,u(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ro.min.js b/assets/javascripts/lunr/min/lunr.ro.min.js new file mode 100644 index 00000000000..72771401818 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ro.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Romanian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=function(){var i=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(e,i){L.eq_s(1,e)&&(L.ket=L.cursor,L.in_grouping(W,97,259)&&L.slice_from(i))}function n(){for(var i,r;;){if(i=L.cursor,L.in_grouping(W,97,259)&&(r=L.cursor,L.bra=r,e("u","U"),L.cursor=r,e("i","I")),L.cursor=i,L.cursor>=L.limit)break;L.cursor++}}function t(){if(L.out_grouping(W,97,259)){for(;!L.in_grouping(W,97,259);){if(L.cursor>=L.limit)return!0;L.cursor++}return!1}return!0}function a(){if(L.in_grouping(W,97,259))for(;!L.out_grouping(W,97,259);){if(L.cursor>=L.limit)return!0;L.cursor++}return!1}function o(){var e,i,r=L.cursor;if(L.in_grouping(W,97,259)){if(e=L.cursor,!t())return void(h=L.cursor);if(L.cursor=e,!a())return void(h=L.cursor)}L.cursor=r,L.out_grouping(W,97,259)&&(i=L.cursor,t()&&(L.cursor=i,L.in_grouping(W,97,259)&&L.cursor=L.limit)return!1;L.cursor++}for(;!L.out_grouping(W,97,259);){if(L.cursor>=L.limit)return!1;L.cursor++}return!0}function c(){var e=L.cursor;h=L.limit,k=h,g=h,o(),L.cursor=e,u()&&(k=L.cursor,u()&&(g=L.cursor))}function s(){for(var e;;){if(L.bra=L.cursor,e=L.find_among(z,3))switch(L.ket=L.cursor,e){case 1:L.slice_from("i");continue;case 2:L.slice_from("u");continue;case 3:if(L.cursor>=L.limit)break;L.cursor++;continue}break}}function w(){return h<=L.cursor}function m(){return k<=L.cursor}function l(){return g<=L.cursor}function f(){var e,i;if(L.ket=L.cursor,(e=L.find_among_b(C,16))&&(L.bra=L.cursor,m()))switch(e){case 1:L.slice_del();break;case 2:L.slice_from("a");break;case 3:L.slice_from("e");break;case 4:L.slice_from("i");break;case 5:i=L.limit-L.cursor,L.eq_s_b(2,"ab")||(L.cursor=L.limit-i,L.slice_from("i"));break;case 6:L.slice_from("at");break;case 7:L.slice_from("aţi")}}function p(){var e,i=L.limit-L.cursor;if(L.ket=L.cursor,(e=L.find_among_b(P,46))&&(L.bra=L.cursor,m())){switch(e){case 1:L.slice_from("abil");break;case 2:L.slice_from("ibil");break;case 3:L.slice_from("iv");break;case 4:L.slice_from("ic");break;case 5:L.slice_from("at");break;case 6:L.slice_from("it")}return _=!0,L.cursor=L.limit-i,!0}return!1}function d(){var e,i;for(_=!1;;)if(i=L.limit-L.cursor,!p()){L.cursor=L.limit-i;break}if(L.ket=L.cursor,(e=L.find_among_b(F,62))&&(L.bra=L.cursor,l())){switch(e){case 1:L.slice_del();break;case 2:L.eq_s_b(1,"ţ")&&(L.bra=L.cursor,L.slice_from("t"));break;case 3:L.slice_from("ist")}_=!0}}function b(){var e,i,r;if(L.cursor>=h){if(i=L.limit_backward,L.limit_backward=h,L.ket=L.cursor,e=L.find_among_b(q,94))switch(L.bra=L.cursor,e){case 1:if(r=L.limit-L.cursor,!L.out_grouping_b(W,97,259)&&(L.cursor=L.limit-r,!L.eq_s_b(1,"u")))break;case 2:L.slice_del()}L.limit_backward=i}}function v(){var e;L.ket=L.cursor,(e=L.find_among_b(S,5))&&(L.bra=L.cursor,w()&&1==e&&L.slice_del())}var _,g,k,h,z=[new i("",-1,3),new i("I",0,1),new i("U",0,2)],C=[new i("ea",-1,3),new i("aţia",-1,7),new i("aua",-1,2),new i("iua",-1,4),new i("aţie",-1,7),new i("ele",-1,3),new i("ile",-1,5),new i("iile",6,4),new i("iei",-1,4),new i("atei",-1,6),new i("ii",-1,4),new i("ului",-1,1),new i("ul",-1,1),new i("elor",-1,3),new i("ilor",-1,4),new i("iilor",14,4)],P=[new i("icala",-1,4),new i("iciva",-1,4),new i("ativa",-1,5),new i("itiva",-1,6),new i("icale",-1,4),new i("aţiune",-1,5),new i("iţiune",-1,6),new i("atoare",-1,5),new i("itoare",-1,6),new i("ătoare",-1,5),new i("icitate",-1,4),new i("abilitate",-1,1),new i("ibilitate",-1,2),new i("ivitate",-1,3),new i("icive",-1,4),new i("ative",-1,5),new i("itive",-1,6),new i("icali",-1,4),new i("atori",-1,5),new i("icatori",18,4),new i("itori",-1,6),new i("ători",-1,5),new i("icitati",-1,4),new i("abilitati",-1,1),new i("ivitati",-1,3),new i("icivi",-1,4),new i("ativi",-1,5),new i("itivi",-1,6),new i("icităi",-1,4),new i("abilităi",-1,1),new i("ivităi",-1,3),new i("icităţi",-1,4),new i("abilităţi",-1,1),new i("ivităţi",-1,3),new i("ical",-1,4),new i("ator",-1,5),new i("icator",35,4),new i("itor",-1,6),new i("ător",-1,5),new i("iciv",-1,4),new i("ativ",-1,5),new i("itiv",-1,6),new i("icală",-1,4),new i("icivă",-1,4),new i("ativă",-1,5),new i("itivă",-1,6)],F=[new i("ica",-1,1),new i("abila",-1,1),new i("ibila",-1,1),new i("oasa",-1,1),new i("ata",-1,1),new i("ita",-1,1),new i("anta",-1,1),new i("ista",-1,3),new i("uta",-1,1),new i("iva",-1,1),new i("ic",-1,1),new i("ice",-1,1),new i("abile",-1,1),new i("ibile",-1,1),new i("isme",-1,3),new i("iune",-1,2),new i("oase",-1,1),new i("ate",-1,1),new i("itate",17,1),new i("ite",-1,1),new i("ante",-1,1),new i("iste",-1,3),new i("ute",-1,1),new i("ive",-1,1),new i("ici",-1,1),new i("abili",-1,1),new i("ibili",-1,1),new i("iuni",-1,2),new i("atori",-1,1),new i("osi",-1,1),new i("ati",-1,1),new i("itati",30,1),new i("iti",-1,1),new i("anti",-1,1),new i("isti",-1,3),new i("uti",-1,1),new i("işti",-1,3),new i("ivi",-1,1),new i("ităi",-1,1),new i("oşi",-1,1),new i("ităţi",-1,1),new i("abil",-1,1),new i("ibil",-1,1),new i("ism",-1,3),new i("ator",-1,1),new i("os",-1,1),new i("at",-1,1),new i("it",-1,1),new i("ant",-1,1),new i("ist",-1,3),new i("ut",-1,1),new i("iv",-1,1),new i("ică",-1,1),new i("abilă",-1,1),new i("ibilă",-1,1),new i("oasă",-1,1),new i("ată",-1,1),new i("ită",-1,1),new i("antă",-1,1),new i("istă",-1,3),new i("ută",-1,1),new i("ivă",-1,1)],q=[new i("ea",-1,1),new i("ia",-1,1),new i("esc",-1,1),new i("ăsc",-1,1),new i("ind",-1,1),new i("ând",-1,1),new i("are",-1,1),new i("ere",-1,1),new i("ire",-1,1),new i("âre",-1,1),new i("se",-1,2),new i("ase",10,1),new i("sese",10,2),new i("ise",10,1),new i("use",10,1),new i("âse",10,1),new i("eşte",-1,1),new i("ăşte",-1,1),new i("eze",-1,1),new i("ai",-1,1),new i("eai",19,1),new i("iai",19,1),new i("sei",-1,2),new i("eşti",-1,1),new i("ăşti",-1,1),new i("ui",-1,1),new i("ezi",-1,1),new i("âi",-1,1),new i("aşi",-1,1),new i("seşi",-1,2),new i("aseşi",29,1),new i("seseşi",29,2),new i("iseşi",29,1),new i("useşi",29,1),new i("âseşi",29,1),new i("işi",-1,1),new i("uşi",-1,1),new i("âşi",-1,1),new i("aţi",-1,2),new i("eaţi",38,1),new i("iaţi",38,1),new i("eţi",-1,2),new i("iţi",-1,2),new i("âţi",-1,2),new i("arăţi",-1,1),new i("serăţi",-1,2),new i("aserăţi",45,1),new i("seserăţi",45,2),new i("iserăţi",45,1),new i("userăţi",45,1),new i("âserăţi",45,1),new i("irăţi",-1,1),new i("urăţi",-1,1),new i("ârăţi",-1,1),new i("am",-1,1),new i("eam",54,1),new i("iam",54,1),new i("em",-1,2),new i("asem",57,1),new i("sesem",57,2),new i("isem",57,1),new i("usem",57,1),new i("âsem",57,1),new i("im",-1,2),new i("âm",-1,2),new i("ăm",-1,2),new i("arăm",65,1),new i("serăm",65,2),new i("aserăm",67,1),new i("seserăm",67,2),new i("iserăm",67,1),new i("userăm",67,1),new i("âserăm",67,1),new i("irăm",65,1),new i("urăm",65,1),new i("ârăm",65,1),new i("au",-1,1),new i("eau",76,1),new i("iau",76,1),new i("indu",-1,1),new i("ându",-1,1),new i("ez",-1,1),new i("ească",-1,1),new i("ară",-1,1),new i("seră",-1,2),new i("aseră",84,1),new i("seseră",84,2),new i("iseră",84,1),new i("useră",84,1),new i("âseră",84,1),new i("iră",-1,1),new i("ură",-1,1),new i("âră",-1,1),new i("ează",-1,1)],S=[new i("a",-1,1),new i("e",-1,1),new i("ie",1,1),new i("i",-1,1),new i("ă",-1,1)],W=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],L=new r;this.setCurrent=function(e){L.setCurrent(e)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){var e=L.cursor;return n(),L.cursor=e,c(),L.limit_backward=e,L.cursor=L.limit,f(),L.cursor=L.limit,d(),L.cursor=L.limit,_||(L.cursor=L.limit,b(),L.cursor=L.limit),v(),L.cursor=L.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta această aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceşti aceştia acolo acord acum ai aia aibă aici al ale alea altceva altcineva am ar are asemenea asta astea astăzi asupra au avea avem aveţi azi aş aşadar aţi bine bucur bună ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curând curînd când cât câte câtva câţi cînd cît cîte cîtva cîţi că căci cărei căror cărui către da dacă dar datorită dată dau de deci deja deoarece departe deşi din dinaintea dintr- dintre doi doilea două drept după dă ea ei el ele eram este eu eşti face fata fi fie fiecare fii fim fiu fiţi frumos fără graţie halbă iar ieri la le li lor lui lângă lîngă mai mea mei mele mereu meu mi mie mine mult multă mulţi mulţumesc mâine mîine mă ne nevoie nici nicăieri nimeni nimeri nimic nişte noastre noastră noi noroc nostru nouă noştri nu opt ori oricare orice oricine oricum oricând oricât oricînd oricît oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puţin puţina puţină până pînă rog sa sale sau se spate spre sub sunt suntem sunteţi sută sînt sîntem sînteţi să săi său ta tale te timp tine toate toată tot totuşi toţi trei treia treilea tu tăi tău un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastră voi vostru vouă voştri vreme vreo vreun vă zece zero zi zice îi îl îmi împotriva în înainte înaintea încotro încât încît între întrucât întrucît îţi ăla ălea ăsta ăstea ăştia şapte şase şi ştiu ţi ţie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ru.min.js b/assets/javascripts/lunr/min/lunr.ru.min.js new file mode 100644 index 00000000000..186cc485c23 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ru.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Russian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,t=new function(){function e(){for(;!W.in_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function t(){for(;!W.out_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function w(){b=W.limit,_=b,e()&&(b=W.cursor,t()&&e()&&t()&&(_=W.cursor))}function i(){return _<=W.cursor}function u(e,n){var r,t;if(W.ket=W.cursor,r=W.find_among_b(e,n)){switch(W.bra=W.cursor,r){case 1:if(t=W.limit-W.cursor,!W.eq_s_b(1,"а")&&(W.cursor=W.limit-t,!W.eq_s_b(1,"я")))return!1;case 2:W.slice_del()}return!0}return!1}function o(){return u(h,9)}function s(e,n){var r;return W.ket=W.cursor,!!(r=W.find_among_b(e,n))&&(W.bra=W.cursor,1==r&&W.slice_del(),!0)}function c(){return s(g,26)}function m(){return!!c()&&(u(C,8),!0)}function f(){return s(k,2)}function l(){return u(P,46)}function a(){s(v,36)}function p(){var e;W.ket=W.cursor,(e=W.find_among_b(F,2))&&(W.bra=W.cursor,i()&&1==e&&W.slice_del())}function d(){var e;if(W.ket=W.cursor,e=W.find_among_b(q,4))switch(W.bra=W.cursor,e){case 1:if(W.slice_del(),W.ket=W.cursor,!W.eq_s_b(1,"н"))break;W.bra=W.cursor;case 2:if(!W.eq_s_b(1,"н"))break;case 3:W.slice_del()}}var _,b,h=[new n("в",-1,1),new n("ив",0,2),new n("ыв",0,2),new n("вши",-1,1),new n("ивши",3,2),new n("ывши",3,2),new n("вшись",-1,1),new n("ившись",6,2),new n("ывшись",6,2)],g=[new n("ее",-1,1),new n("ие",-1,1),new n("ое",-1,1),new n("ые",-1,1),new n("ими",-1,1),new n("ыми",-1,1),new n("ей",-1,1),new n("ий",-1,1),new n("ой",-1,1),new n("ый",-1,1),new n("ем",-1,1),new n("им",-1,1),new n("ом",-1,1),new n("ым",-1,1),new n("его",-1,1),new n("ого",-1,1),new n("ему",-1,1),new n("ому",-1,1),new n("их",-1,1),new n("ых",-1,1),new n("ею",-1,1),new n("ою",-1,1),new n("ую",-1,1),new n("юю",-1,1),new n("ая",-1,1),new n("яя",-1,1)],C=[new n("ем",-1,1),new n("нн",-1,1),new n("вш",-1,1),new n("ивш",2,2),new n("ывш",2,2),new n("щ",-1,1),new n("ющ",5,1),new n("ующ",6,2)],k=[new n("сь",-1,1),new n("ся",-1,1)],P=[new n("ла",-1,1),new n("ила",0,2),new n("ыла",0,2),new n("на",-1,1),new n("ена",3,2),new n("ете",-1,1),new n("ите",-1,2),new n("йте",-1,1),new n("ейте",7,2),new n("уйте",7,2),new n("ли",-1,1),new n("или",10,2),new n("ыли",10,2),new n("й",-1,1),new n("ей",13,2),new n("уй",13,2),new n("л",-1,1),new n("ил",16,2),new n("ыл",16,2),new n("ем",-1,1),new n("им",-1,2),new n("ым",-1,2),new n("н",-1,1),new n("ен",22,2),new n("ло",-1,1),new n("ило",24,2),new n("ыло",24,2),new n("но",-1,1),new n("ено",27,2),new n("нно",27,1),new n("ет",-1,1),new n("ует",30,2),new n("ит",-1,2),new n("ыт",-1,2),new n("ют",-1,1),new n("уют",34,2),new n("ят",-1,2),new n("ны",-1,1),new n("ены",37,2),new n("ть",-1,1),new n("ить",39,2),new n("ыть",39,2),new n("ешь",-1,1),new n("ишь",-1,2),new n("ю",-1,2),new n("ую",44,2)],v=[new n("а",-1,1),new n("ев",-1,1),new n("ов",-1,1),new n("е",-1,1),new n("ие",3,1),new n("ье",3,1),new n("и",-1,1),new n("еи",6,1),new n("ии",6,1),new n("ами",6,1),new n("ями",6,1),new n("иями",10,1),new n("й",-1,1),new n("ей",12,1),new n("ией",13,1),new n("ий",12,1),new n("ой",12,1),new n("ам",-1,1),new n("ем",-1,1),new n("ием",18,1),new n("ом",-1,1),new n("ям",-1,1),new n("иям",21,1),new n("о",-1,1),new n("у",-1,1),new n("ах",-1,1),new n("ях",-1,1),new n("иях",26,1),new n("ы",-1,1),new n("ь",-1,1),new n("ю",-1,1),new n("ию",30,1),new n("ью",30,1),new n("я",-1,1),new n("ия",33,1),new n("ья",33,1)],F=[new n("ост",-1,1),new n("ость",-1,1)],q=[new n("ейше",-1,1),new n("н",-1,2),new n("ейш",-1,1),new n("ь",-1,3)],S=[33,65,8,232],W=new r;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){return w(),W.cursor=W.limit,!(W.cursor=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursors||e>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor>1),f=0,l=o0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.sv.min.js b/assets/javascripts/lunr/min/lunr.sv.min.js new file mode 100644 index 00000000000..3e5eb640002 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.sv.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Swedish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ta.min.js b/assets/javascripts/lunr/min/lunr.ta.min.js new file mode 100644 index 00000000000..a644bed2280 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ta.min.js @@ -0,0 +1 @@ +!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="஀-உஊ-ஏஐ-ஙச-ட஠-னப-யர-ஹ஺-ிீ-௉ொ-௏ௐ-௙௚-௟௠-௩௪-௯௰-௹௺-௿a-zA-Za-zA-Z0-90-9",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("அங்கு அங்கே அது அதை அந்த அவர் அவர்கள் அவள் அவன் அவை ஆக ஆகவே ஆகையால் ஆதலால் ஆதலினால் ஆனாலும் ஆனால் இங்கு இங்கே இது இதை இந்த இப்படி இவர் இவர்கள் இவள் இவன் இவை இவ்வளவு உனக்கு உனது உன் உன்னால் எங்கு எங்கே எது எதை எந்த எப்படி எவர் எவர்கள் எவள் எவன் எவை எவ்வளவு எனக்கு எனது எனவே என் என்ன என்னால் ஏது ஏன் தனது தன்னால் தானே தான் நாங்கள் நாம் நான் நீ நீங்கள்".split(" ")),e.ta.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.ta.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.th.min.js b/assets/javascripts/lunr/min/lunr.th.min.js new file mode 100644 index 00000000000..dee3aac6e5c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.th.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[฀-๿]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.tr.min.js b/assets/javascripts/lunr/min/lunr.tr.min.js new file mode 100644 index 00000000000..563f6ec1f52 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.tr.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Turkish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=function(){var i=r.stemmerSupport.Among,e=r.stemmerSupport.SnowballProgram,n=new function(){function r(r,i,e){for(;;){var n=Dr.limit-Dr.cursor;if(Dr.in_grouping_b(r,i,e)){Dr.cursor=Dr.limit-n;break}if(Dr.cursor=Dr.limit-n,Dr.cursor<=Dr.limit_backward)return!1;Dr.cursor--}return!0}function n(){var i,e;i=Dr.limit-Dr.cursor,r(Wr,97,305);for(var n=0;nDr.limit_backward&&(Dr.cursor--,e=Dr.limit-Dr.cursor,i()))?(Dr.cursor=Dr.limit-e,!0):(Dr.cursor=Dr.limit-n,r()?(Dr.cursor=Dr.limit-n,!1):(Dr.cursor=Dr.limit-n,!(Dr.cursor<=Dr.limit_backward)&&(Dr.cursor--,!!i()&&(Dr.cursor=Dr.limit-n,!0))))}function u(r){return t(r,function(){return Dr.in_grouping_b(Wr,97,305)})}function o(){return u(function(){return Dr.eq_s_b(1,"n")})}function s(){return u(function(){return Dr.eq_s_b(1,"s")})}function c(){return u(function(){return Dr.eq_s_b(1,"y")})}function l(){return t(function(){return Dr.in_grouping_b(Lr,105,305)},function(){return Dr.out_grouping_b(Wr,97,305)})}function a(){return Dr.find_among_b(ur,10)&&l()}function m(){return n()&&Dr.in_grouping_b(Lr,105,305)&&s()}function d(){return Dr.find_among_b(or,2)}function f(){return n()&&Dr.in_grouping_b(Lr,105,305)&&c()}function b(){return n()&&Dr.find_among_b(sr,4)}function w(){return n()&&Dr.find_among_b(cr,4)&&o()}function _(){return n()&&Dr.find_among_b(lr,2)&&c()}function k(){return n()&&Dr.find_among_b(ar,2)}function p(){return n()&&Dr.find_among_b(mr,4)}function g(){return n()&&Dr.find_among_b(dr,2)}function y(){return n()&&Dr.find_among_b(fr,4)}function z(){return n()&&Dr.find_among_b(br,2)}function v(){return n()&&Dr.find_among_b(wr,2)&&c()}function h(){return Dr.eq_s_b(2,"ki")}function q(){return n()&&Dr.find_among_b(_r,2)&&o()}function C(){return n()&&Dr.find_among_b(kr,4)&&c()}function P(){return n()&&Dr.find_among_b(pr,4)}function F(){return n()&&Dr.find_among_b(gr,4)&&c()}function S(){return Dr.find_among_b(yr,4)}function W(){return n()&&Dr.find_among_b(zr,2)}function L(){return n()&&Dr.find_among_b(vr,4)}function x(){return n()&&Dr.find_among_b(hr,8)}function A(){return Dr.find_among_b(qr,2)}function E(){return n()&&Dr.find_among_b(Cr,32)&&c()}function j(){return Dr.find_among_b(Pr,8)&&c()}function T(){return n()&&Dr.find_among_b(Fr,4)&&c()}function Z(){return Dr.eq_s_b(3,"ken")&&c()}function B(){var r=Dr.limit-Dr.cursor;return!(T()||(Dr.cursor=Dr.limit-r,E()||(Dr.cursor=Dr.limit-r,j()||(Dr.cursor=Dr.limit-r,Z()))))}function D(){if(A()){var r=Dr.limit-Dr.cursor;if(S()||(Dr.cursor=Dr.limit-r,W()||(Dr.cursor=Dr.limit-r,C()||(Dr.cursor=Dr.limit-r,P()||(Dr.cursor=Dr.limit-r,F()||(Dr.cursor=Dr.limit-r))))),T())return!1}return!0}function G(){if(W()){Dr.bra=Dr.cursor,Dr.slice_del();var r=Dr.limit-Dr.cursor;return Dr.ket=Dr.cursor,x()||(Dr.cursor=Dr.limit-r,E()||(Dr.cursor=Dr.limit-r,j()||(Dr.cursor=Dr.limit-r,T()||(Dr.cursor=Dr.limit-r)))),nr=!1,!1}return!0}function H(){if(!L())return!0;var r=Dr.limit-Dr.cursor;return!E()&&(Dr.cursor=Dr.limit-r,!j())}function I(){var r,i=Dr.limit-Dr.cursor;return!(S()||(Dr.cursor=Dr.limit-i,F()||(Dr.cursor=Dr.limit-i,P()||(Dr.cursor=Dr.limit-i,C()))))||(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,T()||(Dr.cursor=Dr.limit-r),!1)}function J(){var r,i=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,nr=!0,B()&&(Dr.cursor=Dr.limit-i,D()&&(Dr.cursor=Dr.limit-i,G()&&(Dr.cursor=Dr.limit-i,H()&&(Dr.cursor=Dr.limit-i,I()))))){if(Dr.cursor=Dr.limit-i,!x())return;Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,r=Dr.limit-Dr.cursor,S()||(Dr.cursor=Dr.limit-r,W()||(Dr.cursor=Dr.limit-r,C()||(Dr.cursor=Dr.limit-r,P()||(Dr.cursor=Dr.limit-r,F()||(Dr.cursor=Dr.limit-r))))),T()||(Dr.cursor=Dr.limit-r)}Dr.bra=Dr.cursor,Dr.slice_del()}function K(){var r,i,e,n;if(Dr.ket=Dr.cursor,h()){if(r=Dr.limit-Dr.cursor,p())return Dr.bra=Dr.cursor,Dr.slice_del(),i=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,W()?(Dr.bra=Dr.cursor,Dr.slice_del(),K()):(Dr.cursor=Dr.limit-i,a()&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()))),!0;if(Dr.cursor=Dr.limit-r,w()){if(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,e=Dr.limit-Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else{if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,!a()&&(Dr.cursor=Dr.limit-e,!m()&&(Dr.cursor=Dr.limit-e,!K())))return!0;Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())}return!0}if(Dr.cursor=Dr.limit-r,g()){if(n=Dr.limit-Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else if(Dr.cursor=Dr.limit-n,m())Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K());else if(Dr.cursor=Dr.limit-n,!K())return!1;return!0}}return!1}function M(r){if(Dr.ket=Dr.cursor,!g()&&(Dr.cursor=Dr.limit-r,!k()))return!1;var i=Dr.limit-Dr.cursor;if(d())Dr.bra=Dr.cursor,Dr.slice_del();else if(Dr.cursor=Dr.limit-i,m())Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K());else if(Dr.cursor=Dr.limit-i,!K())return!1;return!0}function N(r){if(Dr.ket=Dr.cursor,!z()&&(Dr.cursor=Dr.limit-r,!b()))return!1;var i=Dr.limit-Dr.cursor;return!(!m()&&(Dr.cursor=Dr.limit-i,!d()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()),!0)}function O(){var r,i=Dr.limit-Dr.cursor;return Dr.ket=Dr.cursor,!(!w()&&(Dr.cursor=Dr.limit-i,!v()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,!(!W()||(Dr.bra=Dr.cursor,Dr.slice_del(),!K()))||(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!(a()||(Dr.cursor=Dr.limit-r,m()||(Dr.cursor=Dr.limit-r,K())))||(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()),!0)))}function Q(){var r,i,e=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,!p()&&(Dr.cursor=Dr.limit-e,!f()&&(Dr.cursor=Dr.limit-e,!_())))return!1;if(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,r=Dr.limit-Dr.cursor,a())Dr.bra=Dr.cursor,Dr.slice_del(),i=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,W()||(Dr.cursor=Dr.limit-i);else if(Dr.cursor=Dr.limit-r,!W())return!0;return Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,K(),!0}function R(){var r,i,e=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,W())return Dr.bra=Dr.cursor,Dr.slice_del(),void K();if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,q())if(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else{if(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!a()&&(Dr.cursor=Dr.limit-r,!m())){if(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!W())return;if(Dr.bra=Dr.cursor,Dr.slice_del(),!K())return}Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())}else if(Dr.cursor=Dr.limit-e,!M(e)&&(Dr.cursor=Dr.limit-e,!N(e))){if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,y())return Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,i=Dr.limit-Dr.cursor,void(a()?(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())):(Dr.cursor=Dr.limit-i,W()?(Dr.bra=Dr.cursor,Dr.slice_del(),K()):(Dr.cursor=Dr.limit-i,K())));if(Dr.cursor=Dr.limit-e,!O()){if(Dr.cursor=Dr.limit-e,d())return Dr.bra=Dr.cursor,void Dr.slice_del();Dr.cursor=Dr.limit-e,K()||(Dr.cursor=Dr.limit-e,Q()||(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,(a()||(Dr.cursor=Dr.limit-e,m()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()))))}}}function U(){var r;if(Dr.ket=Dr.cursor,r=Dr.find_among_b(Sr,4))switch(Dr.bra=Dr.cursor,r){case 1:Dr.slice_from("p");break;case 2:Dr.slice_from("ç");break;case 3:Dr.slice_from("t");break;case 4:Dr.slice_from("k")}}function V(){for(;;){var r=Dr.limit-Dr.cursor;if(Dr.in_grouping_b(Wr,97,305)){Dr.cursor=Dr.limit-r;break}if(Dr.cursor=Dr.limit-r,Dr.cursor<=Dr.limit_backward)return!1;Dr.cursor--}return!0}function X(r,i,e){if(Dr.cursor=Dr.limit-r,V()){var n=Dr.limit-Dr.cursor;if(!Dr.eq_s_b(1,i)&&(Dr.cursor=Dr.limit-n,!Dr.eq_s_b(1,e)))return!0;Dr.cursor=Dr.limit-r;var t=Dr.cursor;return Dr.insert(Dr.cursor,Dr.cursor,e),Dr.cursor=t,!1}return!0}function Y(){var r=Dr.limit-Dr.cursor;(Dr.eq_s_b(1,"d")||(Dr.cursor=Dr.limit-r,Dr.eq_s_b(1,"g")))&&X(r,"a","ı")&&X(r,"e","i")&&X(r,"o","u")&&X(r,"ö","ü")}function $(){for(var r,i=Dr.cursor,e=2;;){for(r=Dr.cursor;!Dr.in_grouping(Wr,97,305);){if(Dr.cursor>=Dr.limit)return Dr.cursor=r,!(e>0)&&(Dr.cursor=i,!0);Dr.cursor++}e--}}function rr(r,i,e){for(;!Dr.eq_s(i,e);){if(Dr.cursor>=Dr.limit)return!0;Dr.cursor++}return(tr=i)!=Dr.limit||(Dr.cursor=r,!1)}function ir(){var r=Dr.cursor;return!rr(r,2,"ad")||(Dr.cursor=r,!rr(r,5,"soyad"))}function er(){var r=Dr.cursor;return!ir()&&(Dr.limit_backward=r,Dr.cursor=Dr.limit,Y(),Dr.cursor=Dr.limit,U(),!0)}var nr,tr,ur=[new i("m",-1,-1),new i("n",-1,-1),new i("miz",-1,-1),new i("niz",-1,-1),new i("muz",-1,-1),new i("nuz",-1,-1),new i("müz",-1,-1),new i("nüz",-1,-1),new i("mız",-1,-1),new i("nız",-1,-1)],or=[new i("leri",-1,-1),new i("ları",-1,-1)],sr=[new i("ni",-1,-1),new i("nu",-1,-1),new i("nü",-1,-1),new i("nı",-1,-1)],cr=[new i("in",-1,-1),new i("un",-1,-1),new i("ün",-1,-1),new i("ın",-1,-1)],lr=[new i("a",-1,-1),new i("e",-1,-1)],ar=[new i("na",-1,-1),new i("ne",-1,-1)],mr=[new i("da",-1,-1),new i("ta",-1,-1),new i("de",-1,-1),new i("te",-1,-1)],dr=[new i("nda",-1,-1),new i("nde",-1,-1)],fr=[new i("dan",-1,-1),new i("tan",-1,-1),new i("den",-1,-1),new i("ten",-1,-1)],br=[new i("ndan",-1,-1),new i("nden",-1,-1)],wr=[new i("la",-1,-1),new i("le",-1,-1)],_r=[new i("ca",-1,-1),new i("ce",-1,-1)],kr=[new i("im",-1,-1),new i("um",-1,-1),new i("üm",-1,-1),new i("ım",-1,-1)],pr=[new i("sin",-1,-1),new i("sun",-1,-1),new i("sün",-1,-1),new i("sın",-1,-1)],gr=[new i("iz",-1,-1),new i("uz",-1,-1),new i("üz",-1,-1),new i("ız",-1,-1)],yr=[new i("siniz",-1,-1),new i("sunuz",-1,-1),new i("sünüz",-1,-1),new i("sınız",-1,-1)],zr=[new i("lar",-1,-1),new i("ler",-1,-1)],vr=[new i("niz",-1,-1),new i("nuz",-1,-1),new i("nüz",-1,-1),new i("nız",-1,-1)],hr=[new i("dir",-1,-1),new i("tir",-1,-1),new i("dur",-1,-1),new i("tur",-1,-1),new i("dür",-1,-1),new i("tür",-1,-1),new i("dır",-1,-1),new i("tır",-1,-1)],qr=[new i("casına",-1,-1),new i("cesine",-1,-1)],Cr=[new i("di",-1,-1),new i("ti",-1,-1),new i("dik",-1,-1),new i("tik",-1,-1),new i("duk",-1,-1),new i("tuk",-1,-1),new i("dük",-1,-1),new i("tük",-1,-1),new i("dık",-1,-1),new i("tık",-1,-1),new i("dim",-1,-1),new i("tim",-1,-1),new i("dum",-1,-1),new i("tum",-1,-1),new i("düm",-1,-1),new i("tüm",-1,-1),new i("dım",-1,-1),new i("tım",-1,-1),new i("din",-1,-1),new i("tin",-1,-1),new i("dun",-1,-1),new i("tun",-1,-1),new i("dün",-1,-1),new i("tün",-1,-1),new i("dın",-1,-1),new i("tın",-1,-1),new i("du",-1,-1),new i("tu",-1,-1),new i("dü",-1,-1),new i("tü",-1,-1),new i("dı",-1,-1),new i("tı",-1,-1)],Pr=[new i("sa",-1,-1),new i("se",-1,-1),new i("sak",-1,-1),new i("sek",-1,-1),new i("sam",-1,-1),new i("sem",-1,-1),new i("san",-1,-1),new i("sen",-1,-1)],Fr=[new i("miş",-1,-1),new i("muş",-1,-1),new i("müş",-1,-1),new i("mış",-1,-1)],Sr=[new i("b",-1,1),new i("c",-1,2),new i("d",-1,3),new i("ğ",-1,4)],Wr=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],Lr=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],xr=[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],Ar=[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],Er=[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],jr=[17],Tr=[65],Zr=[65],Br=[["a",xr,97,305],["e",Ar,101,252],["ı",Er,97,305],["i",jr,101,105],["o",Tr,111,117],["ö",Zr,246,252],["u",Tr,111,117]],Dr=new e;this.setCurrent=function(r){Dr.setCurrent(r)},this.getCurrent=function(){return Dr.getCurrent()},this.stem=function(){return!!($()&&(Dr.limit_backward=Dr.cursor,Dr.cursor=Dr.limit,J(),Dr.cursor=Dr.limit,nr&&(R(),Dr.cursor=Dr.limit_backward,er())))}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.tr.stemmer,"stemmer-tr"),r.tr.stopWordFilter=r.generateStopWordFilter("acaba altmış altı ama ancak arada aslında ayrıca bana bazı belki ben benden beni benim beri beş bile bin bir biri birkaç birkez birçok birşey birşeyi biz bizden bize bizi bizim bu buna bunda bundan bunlar bunları bunların bunu bunun burada böyle böylece da daha dahi de defa değil diye diğer doksan dokuz dolayı dolayısıyla dört edecek eden ederek edilecek ediliyor edilmesi ediyor elli en etmesi etti ettiği ettiğini eğer gibi göre halen hangi hatta hem henüz hep hepsi her herhangi herkesin hiç hiçbir iki ile ilgili ise itibaren itibariyle için işte kadar karşın katrilyon kendi kendilerine kendini kendisi kendisine kendisini kez ki kim kimden kime kimi kimse kırk milyar milyon mu mü mı nasıl ne neden nedenle nerde nerede nereye niye niçin o olan olarak oldu olduklarını olduğu olduğunu olmadı olmadığı olmak olması olmayan olmaz olsa olsun olup olur olursa oluyor on ona ondan onlar onlardan onları onların onu onun otuz oysa pek rağmen sadece sanki sekiz seksen sen senden seni senin siz sizden sizi sizin tarafından trilyon tüm var vardı ve veya ya yani yapacak yapmak yaptı yaptıkları yaptığı yaptığını yapılan yapılması yapıyor yedi yerine yetmiş yine yirmi yoksa yüz zaten çok çünkü öyle üzere üç şey şeyden şeyi şeyler şu şuna şunda şundan şunları şunu şöyle".split(" ")),r.Pipeline.registerFunction(r.tr.stopWordFilter,"stopWordFilter-tr")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.vi.min.js b/assets/javascripts/lunr/min/lunr.vi.min.js new file mode 100644 index 00000000000..22aed28c49b --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.vi.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.zh.min.js b/assets/javascripts/lunr/min/lunr.zh.min.js new file mode 100644 index 00000000000..9838ef96daf --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.zh.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 以 于 上 他 而 后 之 来 及 了 因 下 可 到 由 这 与 也 此 但 并 个 其 已 无 小 我 们 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 从 到 得 打 凡 儿 尔 该 各 给 跟 和 何 还 即 几 既 看 据 距 靠 啦 了 另 么 每 们 嘛 拿 哪 那 您 凭 且 却 让 仍 啥 如 若 使 谁 虽 随 同 所 她 哇 嗡 往 哪 些 向 沿 哟 用 于 咱 则 怎 曾 至 致 着 诸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/tinyseg.js b/assets/javascripts/lunr/tinyseg.js new file mode 100644 index 00000000000..167fa6dd69e --- /dev/null +++ b/assets/javascripts/lunr/tinyseg.js @@ -0,0 +1,206 @@ +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + + return function(lunr) { + // TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript + // (c) 2008 Taku Kudo + // TinySegmenter is freely distributable under the terms of a new BSD licence. + // For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt + + function TinySegmenter() { + var patterns = { + "[一二三四五六七八九十百千万億兆]":"M", + "[一-龠々〆ヵヶ]":"H", + "[ぁ-ん]":"I", + "[ァ-ヴーア-ン゙ー]":"K", + "[a-zA-Za-zA-Z]":"A", + "[0-90-9]":"N" + } + this.chartype_ = []; + for (var i in patterns) { + var regexp = new RegExp(i); + this.chartype_.push([regexp, patterns[i]]); + } + + this.BIAS__ = -332 + this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378}; + this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920}; + this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266}; + this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352}; + this.BP2__ = {"BO":60,"OO":-1762}; + this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965}; + this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146}; + this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699}; + this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973}; + this.BW1__ = {",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741,"ませ":2448,"まで":1711,"まま":2600,"まる":-2155,"やむ":-1947,"よっ":-2565,"れた":2369,"れで":-913,"をし":1860,"を見":731,"亡く":-1886,"京都":2558,"取り":-2784,"大き":-2604,"大阪":1497,"平方":-2314,"引き":-1336,"日本":-195,"本当":-2423,"毎日":-2113,"目指":-724,"B1あ":1404,"B1同":542,"」と":1682}; + this.BW2__ = {"..":-11822,"11":-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1890,"とこ":-1746,"とと":-2279,"との":720,"とみ":5168,"とも":-3941,"ない":-2488,"なが":-1313,"など":-6509,"なの":2614,"なん":3099,"にお":-1615,"にし":2748,"にな":2454,"によ":-7236,"に対":-14943,"に従":-4688,"に関":-11388,"のか":2093,"ので":-7059,"のに":-6041,"のの":-6125,"はい":1073,"はが":-1033,"はず":-2532,"ばれ":1813,"まし":-1316,"まで":-6621,"まれ":5409,"めて":-3153,"もい":2230,"もの":-10713,"らか":-944,"らし":-1611,"らに":-1897,"りし":651,"りま":1620,"れた":4270,"れて":849,"れば":4114,"ろう":6067,"われ":7901,"を通":-11877,"んだ":728,"んな":-4115,"一人":602,"一方":-1375,"一日":970,"一部":-1051,"上が":-4479,"会社":-1116,"出て":2163,"分の":-7758,"同党":970,"同日":-913,"大阪":-2471,"委員":-1250,"少な":-1050,"年度":-8669,"年間":-1626,"府県":-2363,"手権":-1982,"新聞":-4066,"日新":-722,"日本":-7068,"日米":3372,"曜日":-601,"朝鮮":-2355,"本人":-2697,"東京":-1543,"然と":-1384,"社会":-1276,"立て":-990,"第に":-1612,"米国":-4268,"11":-669}; + this.BW3__ = {"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":6521,"ず,":3426,"ず、":3426,"ずに":841,"そう":428,"た.":8875,"た。":8875,"たい":-594,"たの":812,"たり":-1183,"たる":-853,"だ.":4098,"だ。":4098,"だっ":1004,"った":-4748,"って":300,"てい":6240,"てお":855,"ても":302,"です":1437,"でに":-1482,"では":2295,"とう":-1387,"とし":2266,"との":541,"とも":-3543,"どう":4664,"ない":1796,"なく":-903,"など":2135,"に,":-1021,"に、":-1021,"にし":1771,"にな":1906,"には":2644,"の,":-724,"の、":-724,"の子":-1000,"は,":1337,"は、":1337,"べき":2181,"まし":1113,"ます":6943,"まっ":-1549,"まで":6154,"まれ":-793,"らし":1479,"られ":6820,"るる":3818,"れ,":854,"れ、":854,"れた":1850,"れて":1375,"れば":-3246,"れる":1091,"われ":-605,"んだ":606,"んで":798,"カ月":990,"会議":860,"入り":1232,"大会":2217,"始め":1681,"市":965,"新聞":-5055,"日,":974,"日、":974,"社会":2024,"カ月":990}; + this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832}; + this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649}; + this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393}; + this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841}; + this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68}; + this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591}; + this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685}; + this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156}; + this.TW1__ = {"につい":-4681,"東京都":2026}; + this.TW2__ = {"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216}; + this.TW3__ = {"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287}; + this.TW4__ = {"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865}; + this.UC1__ = {"A":484,"K":93,"M":645,"O":-505}; + this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646}; + this.UC3__ = {"A":-1370,"I":2311}; + this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646}; + this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831}; + this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387}; + this.UP1__ = {"O":-214}; + this.UP2__ = {"B":69,"O":935}; + this.UP3__ = {"B":189}; + this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422}; + this.UQ2__ = {"BH":216,"BI":113,"OK":1759}; + this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212}; + this.UW1__ = {",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135}; + this.UW2__ = {",":-829,"、":-829,"〇":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978,"保":362,"入":548,"初":-3025,"副":-1566,"北":-3414,"区":-422,"大":-1769,"天":-865,"太":-483,"子":-1519,"学":760,"実":1023,"小":-2009,"市":-813,"年":-1060,"強":1067,"手":-1519,"揺":-1033,"政":1522,"文":-1355,"新":-1682,"日":-1815,"明":-1462,"最":-630,"朝":-1843,"本":-1650,"東":-931,"果":-665,"次":-2378,"民":-180,"気":-1740,"理":752,"発":529,"目":-1584,"相":-242,"県":-1165,"立":-763,"第":810,"米":509,"自":-1353,"行":838,"西":-744,"見":-3874,"調":1010,"議":1198,"込":3041,"開":1758,"間":-1257,"「":-645,"」":3145,"ッ":831,"ア":-587,"カ":306,"キ":568}; + this.UW3__ = {",":4889,"1":-800,"−":-1723,"、":4889,"々":-2311,"〇":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":2773,"わ":-1207,"を":6620,"ん":-518,"ア":551,"グ":1319,"ス":874,"ッ":-1350,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278,"・":-3794,"一":-1619,"下":-1759,"世":-2087,"両":3815,"中":653,"主":-758,"予":-1193,"二":974,"人":2742,"今":792,"他":1889,"以":-1368,"低":811,"何":4265,"作":-361,"保":-2439,"元":4858,"党":3593,"全":1574,"公":-3030,"六":755,"共":-1880,"円":5807,"再":3095,"分":457,"初":2475,"別":1129,"前":2286,"副":4437,"力":365,"動":-949,"務":-1872,"化":1327,"北":-1038,"区":4646,"千":-2309,"午":-783,"協":-1006,"口":483,"右":1233,"各":3588,"合":-241,"同":3906,"和":-837,"員":4513,"国":642,"型":1389,"場":1219,"外":-241,"妻":2016,"学":-1356,"安":-423,"実":-1008,"家":1078,"小":-513,"少":-3102,"州":1155,"市":3197,"平":-1804,"年":2416,"広":-1030,"府":1605,"度":1452,"建":-2352,"当":-3885,"得":1905,"思":-1291,"性":1822,"戸":-488,"指":-3973,"政":-2013,"教":-1479,"数":3222,"文":-1489,"新":1764,"日":2099,"旧":5792,"昨":-661,"時":-1248,"曜":-951,"最":-937,"月":4125,"期":360,"李":3094,"村":364,"東":-805,"核":5156,"森":2438,"業":484,"氏":2613,"民":-1694,"決":-1073,"法":1868,"海":-495,"無":979,"物":461,"特":-3850,"生":-273,"用":914,"町":1215,"的":7313,"直":-1835,"省":792,"県":6293,"知":-1528,"私":4231,"税":401,"立":-960,"第":1201,"米":7767,"系":3066,"約":3663,"級":1384,"統":-4229,"総":1163,"線":1255,"者":6457,"能":725,"自":-2869,"英":785,"見":1044,"調":-562,"財":-733,"費":1777,"車":1835,"軍":1375,"込":-1504,"通":-1136,"選":-681,"郎":1026,"郡":4404,"部":1200,"金":2163,"長":421,"開":-1432,"間":1302,"関":-1282,"雨":2009,"電":-1045,"非":2066,"駅":1620,"1":-800,"」":2670,"・":-3794,"ッ":-1350,"ア":551,"グ":1319,"ス":874,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278}; + this.UW4__ = {",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"〇":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":1464,"ま":1051,"み":-2082,"む":-882,"め":-5046,"も":4169,"ゃ":-2666,"や":2795,"ょ":-1544,"よ":3351,"ら":-2922,"り":-9726,"る":-14896,"れ":-2613,"ろ":-4570,"わ":-1783,"を":13150,"ん":-2352,"カ":2145,"コ":1789,"セ":1287,"ッ":-724,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637,"・":-4371,"ー":-11870,"一":-2069,"中":2210,"予":782,"事":-190,"井":-1768,"人":1036,"以":544,"会":950,"体":-1286,"作":530,"側":4292,"先":601,"党":-2006,"共":-1212,"内":584,"円":788,"初":1347,"前":1623,"副":3879,"力":-302,"動":-740,"務":-2715,"化":776,"区":4517,"協":1013,"参":1555,"合":-1834,"和":-681,"員":-910,"器":-851,"回":1500,"国":-619,"園":-1200,"地":866,"場":-1410,"塁":-2094,"士":-1413,"多":1067,"大":571,"子":-4802,"学":-1397,"定":-1057,"寺":-809,"小":1910,"屋":-1328,"山":-1500,"島":-2056,"川":-2667,"市":2771,"年":374,"庁":-4556,"後":456,"性":553,"感":916,"所":-1566,"支":856,"改":787,"政":2182,"教":704,"文":522,"方":-856,"日":1798,"時":1829,"最":845,"月":-9066,"木":-485,"来":-442,"校":-360,"業":-1043,"氏":5388,"民":-2716,"気":-910,"沢":-939,"済":-543,"物":-735,"率":672,"球":-1267,"生":-1286,"産":-1101,"田":-2900,"町":1826,"的":2586,"目":922,"省":-3485,"県":2997,"空":-867,"立":-2112,"第":788,"米":2937,"系":786,"約":2171,"経":1146,"統":-1169,"総":940,"線":-994,"署":749,"者":2145,"能":-730,"般":-852,"行":-792,"規":792,"警":-1184,"議":-244,"谷":-1000,"賞":730,"車":-1481,"軍":1158,"輪":-1433,"込":-3370,"近":929,"道":-1291,"選":2596,"郎":-4866,"都":1192,"野":-1100,"銀":-2213,"長":357,"間":-2344,"院":-2297,"際":-2604,"電":-878,"領":-1659,"題":-792,"館":-1984,"首":1749,"高":2120,"「":1895,"」":3798,"・":-4371,"ッ":-724,"ー":-11870,"カ":2145,"コ":1789,"セ":1287,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637}; + this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区":-901,"告":848,"員":2104,"大":-1296,"学":-548,"定":1785,"嵐":-1304,"市":-2991,"席":921,"年":1763,"思":872,"所":-814,"挙":1618,"新":-1682,"日":218,"月":-4353,"査":932,"格":1356,"機":-1508,"氏":-1347,"田":240,"町":-3912,"的":-3149,"相":1319,"省":-1052,"県":-4003,"研":-997,"社":-278,"空":-813,"統":1955,"者":-2233,"表":663,"語":-1073,"議":1219,"選":-1018,"郎":-368,"長":786,"間":1191,"題":2368,"館":-689,"1":-514,"E2":-32768,"「":363,"イ":241,"ル":451,"ン":-343}; + this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"1":-270,"E1":306,"ル":-673,"ン":-496}; + + return this; + } + TinySegmenter.prototype.ctype_ = function(str) { + for (var i in this.chartype_) { + if (str.match(this.chartype_[i][0])) { + return this.chartype_[i][1]; + } + } + return "O"; + } + + TinySegmenter.prototype.ts_ = function(v) { + if (v) { return v; } + return 0; + } + + TinySegmenter.prototype.segment = function(input) { + if (input == null || input == undefined || input == "") { + return []; + } + var result = []; + var seg = ["B3","B2","B1"]; + var ctype = ["O","O","O"]; + var o = input.split(""); + for (i = 0; i < o.length; ++i) { + seg.push(o[i]); + ctype.push(this.ctype_(o[i])) + } + seg.push("E1"); + seg.push("E2"); + seg.push("E3"); + ctype.push("O"); + ctype.push("O"); + ctype.push("O"); + var word = seg[3]; + var p1 = "U"; + var p2 = "U"; + var p3 = "U"; + for (var i = 4; i < seg.length - 3; ++i) { + var score = this.BIAS__; + var w1 = seg[i-3]; + var w2 = seg[i-2]; + var w3 = seg[i-1]; + var w4 = seg[i]; + var w5 = seg[i+1]; + var w6 = seg[i+2]; + var c1 = ctype[i-3]; + var c2 = ctype[i-2]; + var c3 = ctype[i-1]; + var c4 = ctype[i]; + var c5 = ctype[i+1]; + var c6 = ctype[i+2]; + score += this.ts_(this.UP1__[p1]); + score += this.ts_(this.UP2__[p2]); + score += this.ts_(this.UP3__[p3]); + score += this.ts_(this.BP1__[p1 + p2]); + score += this.ts_(this.BP2__[p2 + p3]); + score += this.ts_(this.UW1__[w1]); + score += this.ts_(this.UW2__[w2]); + score += this.ts_(this.UW3__[w3]); + score += this.ts_(this.UW4__[w4]); + score += this.ts_(this.UW5__[w5]); + score += this.ts_(this.UW6__[w6]); + score += this.ts_(this.BW1__[w2 + w3]); + score += this.ts_(this.BW2__[w3 + w4]); + score += this.ts_(this.BW3__[w4 + w5]); + score += this.ts_(this.TW1__[w1 + w2 + w3]); + score += this.ts_(this.TW2__[w2 + w3 + w4]); + score += this.ts_(this.TW3__[w3 + w4 + w5]); + score += this.ts_(this.TW4__[w4 + w5 + w6]); + score += this.ts_(this.UC1__[c1]); + score += this.ts_(this.UC2__[c2]); + score += this.ts_(this.UC3__[c3]); + score += this.ts_(this.UC4__[c4]); + score += this.ts_(this.UC5__[c5]); + score += this.ts_(this.UC6__[c6]); + score += this.ts_(this.BC1__[c2 + c3]); + score += this.ts_(this.BC2__[c3 + c4]); + score += this.ts_(this.BC3__[c4 + c5]); + score += this.ts_(this.TC1__[c1 + c2 + c3]); + score += this.ts_(this.TC2__[c2 + c3 + c4]); + score += this.ts_(this.TC3__[c3 + c4 + c5]); + score += this.ts_(this.TC4__[c4 + c5 + c6]); + // score += this.ts_(this.TC5__[c4 + c5 + c6]); + score += this.ts_(this.UQ1__[p1 + c1]); + score += this.ts_(this.UQ2__[p2 + c2]); + score += this.ts_(this.UQ3__[p3 + c3]); + score += this.ts_(this.BQ1__[p2 + c2 + c3]); + score += this.ts_(this.BQ2__[p2 + c3 + c4]); + score += this.ts_(this.BQ3__[p3 + c2 + c3]); + score += this.ts_(this.BQ4__[p3 + c3 + c4]); + score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]); + score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]); + score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]); + score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]); + var p = "O"; + if (score > 0) { + result.push(word); + word = ""; + p = "B"; + } + p1 = p2; + p2 = p3; + p3 = p; + word += seg[i]; + } + result.push(word); + + return result; + } + + lunr.TinySegmenter = TinySegmenter; + }; + +})); \ No newline at end of file diff --git a/assets/javascripts/lunr/wordcut.js b/assets/javascripts/lunr/wordcut.js new file mode 100644 index 00000000000..146f4b44bca --- /dev/null +++ b/assets/javascripts/lunr/wordcut.js @@ -0,0 +1,6708 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}(g.lunr || (g.lunr = {})).wordcut = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1; + }) + this.addWords(words, false) + } + if(finalize){ + this.finalizeDict(); + } + }, + + dictSeek: function (l, r, ch, strOffset, pos) { + var ans = null; + while (l <= r) { + var m = Math.floor((l + r) / 2), + dict_item = this.dict[m], + len = dict_item.length; + if (len <= strOffset) { + l = m + 1; + } else { + var ch_ = dict_item[strOffset]; + if (ch_ < ch) { + l = m + 1; + } else if (ch_ > ch) { + r = m - 1; + } else { + ans = m; + if (pos == LEFT) { + r = m - 1; + } else { + l = m + 1; + } + } + } + } + return ans; + }, + + isFinal: function (acceptor) { + return this.dict[acceptor.l].length == acceptor.strOffset; + }, + + createAcceptor: function () { + return { + l: 0, + r: this.dict.length - 1, + strOffset: 0, + isFinal: false, + dict: this, + transit: function (ch) { + return this.dict.transit(this, ch); + }, + isError: false, + tag: "DICT", + w: 1, + type: "DICT" + }; + }, + + transit: function (acceptor, ch) { + var l = this.dictSeek(acceptor.l, + acceptor.r, + ch, + acceptor.strOffset, + LEFT); + if (l !== null) { + var r = this.dictSeek(l, + acceptor.r, + ch, + acceptor.strOffset, + RIGHT); + acceptor.l = l; + acceptor.r = r; + acceptor.strOffset++; + acceptor.isFinal = this.isFinal(acceptor); + } else { + acceptor.isError = true; + } + return acceptor; + }, + + sortuniq: function(a){ + return a.sort().filter(function(item, pos, arr){ + return !pos || item != arr[pos - 1]; + }) + }, + + flatten: function(a){ + //[[1,2],[3]] -> [1,2,3] + return [].concat.apply([], a); + } +}; +module.exports = WordcutDict; + +}).call(this,"/dist/tmp") +},{"glob":16,"path":22}],3:[function(require,module,exports){ +var WordRule = { + createAcceptor: function(tag) { + if (tag["WORD_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + var lch = ch.toLowerCase(); + if (lch >= "a" && lch <= "z") { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "WORD_RULE", + type: "WORD_RULE", + w: 1}; + } +}; + +var NumberRule = { + createAcceptor: function(tag) { + if (tag["NUMBER_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (ch >= "0" && ch <= "9") { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "NUMBER_RULE", + type: "NUMBER_RULE", + w: 1}; + } +}; + +var SpaceRule = { + tag: "SPACE_RULE", + createAcceptor: function(tag) { + + if (tag["SPACE_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (ch == " " || ch == "\t" || ch == "\r" || ch == "\n" || + ch == "\u00A0" || ch=="\u2003"//nbsp and emsp + ) { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: SpaceRule.tag, + w: 1, + type: "SPACE_RULE"}; + } +} + +var SingleSymbolRule = { + tag: "SINSYM", + createAcceptor: function(tag) { + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (this.strOffset == 0 && ch.match(/^[\@\(\)\/\,\-\."`]$/)) { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "SINSYM", + w: 1, + type: "SINSYM"}; + } +} + + +var LatinRules = [WordRule, SpaceRule, SingleSymbolRule, NumberRule]; + +module.exports = LatinRules; + +},{}],4:[function(require,module,exports){ +var _ = require("underscore") + , WordcutCore = require("./wordcut_core"); +var PathInfoBuilder = { + + /* + buildByPartAcceptors: function(path, acceptors, i) { + var + var genInfos = partAcceptors.reduce(function(genInfos, acceptor) { + + }, []); + + return genInfos; + } + */ + + buildByAcceptors: function(path, finalAcceptors, i) { + var self = this; + var infos = finalAcceptors.map(function(acceptor) { + var p = i - acceptor.strOffset + 1 + , _info = path[p]; + + var info = {p: p, + mw: _info.mw + (acceptor.mw === undefined ? 0 : acceptor.mw), + w: acceptor.w + _info.w, + unk: (acceptor.unk ? acceptor.unk : 0) + _info.unk, + type: acceptor.type}; + + if (acceptor.type == "PART") { + for(var j = p + 1; j <= i; j++) { + path[j].merge = p; + } + info.merge = p; + } + + return info; + }); + return infos.filter(function(info) { return info; }); + }, + + fallback: function(path, leftBoundary, text, i) { + var _info = path[leftBoundary]; + if (text[i].match(/[\u0E48-\u0E4E]/)) { + if (leftBoundary != 0) + leftBoundary = path[leftBoundary].p; + return {p: leftBoundary, + mw: 0, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; +/* } else if(leftBoundary > 0 && path[leftBoundary].type !== "UNK") { + leftBoundary = path[leftBoundary].p; + return {p: leftBoundary, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; */ + } else { + return {p: leftBoundary, + mw: _info.mw, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; + } + }, + + build: function(path, finalAcceptors, i, leftBoundary, text) { + var basicPathInfos = this.buildByAcceptors(path, finalAcceptors, i); + if (basicPathInfos.length > 0) { + return basicPathInfos; + } else { + return [this.fallback(path, leftBoundary, text, i)]; + } + } +}; + +module.exports = function() { + return _.clone(PathInfoBuilder); +} + +},{"./wordcut_core":8,"underscore":25}],5:[function(require,module,exports){ +var _ = require("underscore"); + + +var PathSelector = { + selectPath: function(paths) { + var path = paths.reduce(function(selectedPath, path) { + if (selectedPath == null) { + return path; + } else { + if (path.unk < selectedPath.unk) + return path; + if (path.unk == selectedPath.unk) { + if (path.mw < selectedPath.mw) + return path + if (path.mw == selectedPath.mw) { + if (path.w < selectedPath.w) + return path; + } + } + return selectedPath; + } + }, null); + return path; + }, + + createPath: function() { + return [{p:null, w:0, unk:0, type: "INIT", mw:0}]; + } +}; + +module.exports = function() { + return _.clone(PathSelector); +}; + +},{"underscore":25}],6:[function(require,module,exports){ +function isMatch(pat, offset, ch) { + if (pat.length <= offset) + return false; + var _ch = pat[offset]; + return _ch == ch || + (_ch.match(/[กข]/) && ch.match(/[ก-ฮ]/)) || + (_ch.match(/[มบ]/) && ch.match(/[ก-ฮ]/)) || + (_ch.match(/\u0E49/) && ch.match(/[\u0E48-\u0E4B]/)); +} + +var Rule0 = { + pat: "เหก็ม", + createAcceptor: function(tag) { + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (isMatch(Rule0.pat, this.strOffset,ch)) { + this.isFinal = (this.strOffset + 1 == Rule0.pat.length); + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "THAI_RULE", + type: "THAI_RULE", + w: 1}; + } +}; + +var PartRule = { + createAcceptor: function(tag) { + return {strOffset: 0, + patterns: [ + "แก", "เก", "ก้", "กก์", "กา", "กี", "กิ", "กืก" + ], + isFinal: false, + transit: function(ch) { + var offset = this.strOffset; + this.patterns = this.patterns.filter(function(pat) { + return isMatch(pat, offset, ch); + }); + + if (this.patterns.length > 0) { + var len = 1 + offset; + this.isFinal = this.patterns.some(function(pat) { + return pat.length == len; + }); + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "PART", + type: "PART", + unk: 1, + w: 1}; + } +}; + +var ThaiRules = [Rule0, PartRule]; + +module.exports = ThaiRules; + +},{}],7:[function(require,module,exports){ +var sys = require("sys") + , WordcutDict = require("./dict") + , WordcutCore = require("./wordcut_core") + , PathInfoBuilder = require("./path_info_builder") + , PathSelector = require("./path_selector") + , Acceptors = require("./acceptors") + , latinRules = require("./latin_rules") + , thaiRules = require("./thai_rules") + , _ = require("underscore"); + + +var Wordcut = Object.create(WordcutCore); +Wordcut.defaultPathInfoBuilder = PathInfoBuilder; +Wordcut.defaultPathSelector = PathSelector; +Wordcut.defaultAcceptors = Acceptors; +Wordcut.defaultLatinRules = latinRules; +Wordcut.defaultThaiRules = thaiRules; +Wordcut.defaultDict = WordcutDict; + + +Wordcut.initNoDict = function(dict_path) { + var self = this; + self.pathInfoBuilder = new self.defaultPathInfoBuilder; + self.pathSelector = new self.defaultPathSelector; + self.acceptors = new self.defaultAcceptors; + self.defaultLatinRules.forEach(function(rule) { + self.acceptors.creators.push(rule); + }); + self.defaultThaiRules.forEach(function(rule) { + self.acceptors.creators.push(rule); + }); +}; + +Wordcut.init = function(dict_path, withDefault, additionalWords) { + withDefault = withDefault || false; + this.initNoDict(); + var dict = _.clone(this.defaultDict); + dict.init(dict_path, withDefault, additionalWords); + this.acceptors.creators.push(dict); +}; + +module.exports = Wordcut; + +},{"./acceptors":1,"./dict":2,"./latin_rules":3,"./path_info_builder":4,"./path_selector":5,"./thai_rules":6,"./wordcut_core":8,"sys":28,"underscore":25}],8:[function(require,module,exports){ +var WordcutCore = { + + buildPath: function(text) { + var self = this + , path = self.pathSelector.createPath() + , leftBoundary = 0; + self.acceptors.reset(); + for (var i = 0; i < text.length; i++) { + var ch = text[i]; + self.acceptors.transit(ch); + + var possiblePathInfos = self + .pathInfoBuilder + .build(path, + self.acceptors.getFinalAcceptors(), + i, + leftBoundary, + text); + var selectedPath = self.pathSelector.selectPath(possiblePathInfos) + + path.push(selectedPath); + if (selectedPath.type !== "UNK") { + leftBoundary = i; + } + } + return path; + }, + + pathToRanges: function(path) { + var e = path.length - 1 + , ranges = []; + + while (e > 0) { + var info = path[e] + , s = info.p; + + if (info.merge !== undefined && ranges.length > 0) { + var r = ranges[ranges.length - 1]; + r.s = info.merge; + s = r.s; + } else { + ranges.push({s:s, e:e}); + } + e = s; + } + return ranges.reverse(); + }, + + rangesToText: function(text, ranges, delimiter) { + return ranges.map(function(r) { + return text.substring(r.s, r.e); + }).join(delimiter); + }, + + cut: function(text, delimiter) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + return this + .rangesToText(text, ranges, + (delimiter === undefined ? "|" : delimiter)); + }, + + cutIntoRanges: function(text, noText) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + + if (!noText) { + ranges.forEach(function(r) { + r.text = text.substring(r.s, r.e); + }); + } + return ranges; + }, + + cutIntoArray: function(text) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + + return ranges.map(function(r) { + return text.substring(r.s, r.e) + }); + } +}; + +module.exports = WordcutCore; + +},{}],9:[function(require,module,exports){ +// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 +// +// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! +// +// Originally from narwhal.js (http://narwhaljs.org) +// Copyright (c) 2009 Thomas Robinson <280north.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the 'Software'), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// when used in node, this will actually load the util module we depend on +// versus loading the builtin util module as happens otherwise +// this is a bug in node module loading as far as I am concerned +var util = require('util/'); + +var pSlice = Array.prototype.slice; +var hasOwn = Object.prototype.hasOwnProperty; + +// 1. The assert module provides functions that throw +// AssertionError's when particular conditions are not met. The +// assert module must conform to the following interface. + +var assert = module.exports = ok; + +// 2. The AssertionError is defined in assert. +// new assert.AssertionError({ message: message, +// actual: actual, +// expected: expected }) + +assert.AssertionError = function AssertionError(options) { + this.name = 'AssertionError'; + this.actual = options.actual; + this.expected = options.expected; + this.operator = options.operator; + if (options.message) { + this.message = options.message; + this.generatedMessage = false; + } else { + this.message = getMessage(this); + this.generatedMessage = true; + } + var stackStartFunction = options.stackStartFunction || fail; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, stackStartFunction); + } + else { + // non v8 browsers so we can have a stacktrace + var err = new Error(); + if (err.stack) { + var out = err.stack; + + // try to strip useless frames + var fn_name = stackStartFunction.name; + var idx = out.indexOf('\n' + fn_name); + if (idx >= 0) { + // once we have located the function frame + // we need to strip out everything before it (and its line) + var next_line = out.indexOf('\n', idx + 1); + out = out.substring(next_line + 1); + } + + this.stack = out; + } + } +}; + +// assert.AssertionError instanceof Error +util.inherits(assert.AssertionError, Error); + +function replacer(key, value) { + if (util.isUndefined(value)) { + return '' + value; + } + if (util.isNumber(value) && !isFinite(value)) { + return value.toString(); + } + if (util.isFunction(value) || util.isRegExp(value)) { + return value.toString(); + } + return value; +} + +function truncate(s, n) { + if (util.isString(s)) { + return s.length < n ? s : s.slice(0, n); + } else { + return s; + } +} + +function getMessage(self) { + return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + + self.operator + ' ' + + truncate(JSON.stringify(self.expected, replacer), 128); +} + +// At present only the three keys mentioned above are used and +// understood by the spec. Implementations or sub modules can pass +// other keys to the AssertionError's constructor - they will be +// ignored. + +// 3. All of the following functions must throw an AssertionError +// when a corresponding condition is not met, with a message that +// may be undefined if not provided. All assertion methods provide +// both the actual and expected values to the assertion error for +// display purposes. + +function fail(actual, expected, message, operator, stackStartFunction) { + throw new assert.AssertionError({ + message: message, + actual: actual, + expected: expected, + operator: operator, + stackStartFunction: stackStartFunction + }); +} + +// EXTENSION! allows for well behaved errors defined elsewhere. +assert.fail = fail; + +// 4. Pure assertion tests whether a value is truthy, as determined +// by !!guard. +// assert.ok(guard, message_opt); +// This statement is equivalent to assert.equal(true, !!guard, +// message_opt);. To test strictly for the value true, use +// assert.strictEqual(true, guard, message_opt);. + +function ok(value, message) { + if (!value) fail(value, true, message, '==', assert.ok); +} +assert.ok = ok; + +// 5. The equality assertion tests shallow, coercive equality with +// ==. +// assert.equal(actual, expected, message_opt); + +assert.equal = function equal(actual, expected, message) { + if (actual != expected) fail(actual, expected, message, '==', assert.equal); +}; + +// 6. The non-equality assertion tests for whether two objects are not equal +// with != assert.notEqual(actual, expected, message_opt); + +assert.notEqual = function notEqual(actual, expected, message) { + if (actual == expected) { + fail(actual, expected, message, '!=', assert.notEqual); + } +}; + +// 7. The equivalence assertion tests a deep equality relation. +// assert.deepEqual(actual, expected, message_opt); + +assert.deepEqual = function deepEqual(actual, expected, message) { + if (!_deepEqual(actual, expected)) { + fail(actual, expected, message, 'deepEqual', assert.deepEqual); + } +}; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + +function isArguments(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +function objEquiv(a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + // if one is a primitive, the other must be same + if (util.isPrimitive(a) || util.isPrimitive(b)) { + return a === b; + } + var aIsArgs = isArguments(a), + bIsArgs = isArguments(b); + if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) + return false; + if (aIsArgs) { + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + var ka = objectKeys(a), + kb = objectKeys(b), + key, i; + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} + +// 8. The non-equivalence assertion tests for any deep inequality. +// assert.notDeepEqual(actual, expected, message_opt); + +assert.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (_deepEqual(actual, expected)) { + fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); + } +}; + +// 9. The strict equality assertion tests strict equality, as determined by ===. +// assert.strictEqual(actual, expected, message_opt); + +assert.strictEqual = function strictEqual(actual, expected, message) { + if (actual !== expected) { + fail(actual, expected, message, '===', assert.strictEqual); + } +}; + +// 10. The strict non-equality assertion tests for strict inequality, as +// determined by !==. assert.notStrictEqual(actual, expected, message_opt); + +assert.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (actual === expected) { + fail(actual, expected, message, '!==', assert.notStrictEqual); + } +}; + +function expectedException(actual, expected) { + if (!actual || !expected) { + return false; + } + + if (Object.prototype.toString.call(expected) == '[object RegExp]') { + return expected.test(actual); + } else if (actual instanceof expected) { + return true; + } else if (expected.call({}, actual) === true) { + return true; + } + + return false; +} + +function _throws(shouldThrow, block, expected, message) { + var actual; + + if (util.isString(expected)) { + message = expected; + expected = null; + } + + try { + block(); + } catch (e) { + actual = e; + } + + message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + + (message ? ' ' + message : '.'); + + if (shouldThrow && !actual) { + fail(actual, expected, 'Missing expected exception' + message); + } + + if (!shouldThrow && expectedException(actual, expected)) { + fail(actual, expected, 'Got unwanted exception' + message); + } + + if ((shouldThrow && actual && expected && + !expectedException(actual, expected)) || (!shouldThrow && actual)) { + throw actual; + } +} + +// 11. Expected to throw an error: +// assert.throws(block, Error_opt, message_opt); + +assert.throws = function(block, /*optional*/error, /*optional*/message) { + _throws.apply(this, [true].concat(pSlice.call(arguments))); +}; + +// EXTENSION! This is annoying to write outside this module. +assert.doesNotThrow = function(block, /*optional*/message) { + _throws.apply(this, [false].concat(pSlice.call(arguments))); +}; + +assert.ifError = function(err) { if (err) {throw err;}}; + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + if (hasOwn.call(obj, key)) keys.push(key); + } + return keys; +}; + +},{"util/":28}],10:[function(require,module,exports){ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} + +},{}],11:[function(require,module,exports){ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + + +},{"balanced-match":10,"concat-map":13}],12:[function(require,module,exports){ + +},{}],13:[function(require,module,exports){ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +},{}],14:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } + throw TypeError('Uncaught, unspecified "error" event.'); + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + handler.apply(this, args); + } + } else if (isObject(handler)) { + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + var m; + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.listenerCount = function(emitter, type) { + var ret; + if (!emitter._events || !emitter._events[type]) + ret = 0; + else if (isFunction(emitter._events[type])) + ret = 1; + else + ret = emitter._events[type].length; + return ret; +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],15:[function(require,module,exports){ +(function (process){ +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = require("path") +var minimatch = require("minimatch") +var isAbsolute = require("path-is-absolute") +var Minimatch = minimatch.Minimatch + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern) + } + + return { + matcher: new Minimatch(pattern), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = options.cwd + self.changedCwd = path.resolve(options.cwd) !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + self.nomount = !!options.nomount + + // disable comments and negation unless the user explicitly + // passes in false as the option. + options.nonegate = options.nonegate === false ? false : true + options.nocomment = options.nocomment === false ? false : true + deprecationWarning(options) + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +// TODO(isaacs): remove entirely in v6 +// exported to reset in tests +exports.deprecationWarned +function deprecationWarning(options) { + if (!options.nonegate || !options.nocomment) { + if (process.noDeprecation !== true && !exports.deprecationWarned) { + var msg = 'glob WARNING: comments and negation will be disabled in v6' + if (process.throwDeprecation) + throw new Error(msg) + else if (process.traceDeprecation) + console.trace(msg) + else + console.error(msg) + + exports.deprecationWarned = true + } + } +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + return !(/\/$/.test(e)) + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +}).call(this,require('_process')) +},{"_process":24,"minimatch":20,"path":22,"path-is-absolute":23}],16:[function(require,module,exports){ +(function (process){ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. + +module.exports = glob + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var inherits = require('inherits') +var EE = require('events').EventEmitter +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var globSync = require('./sync.js') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = require('inflight') +var util = require('util') +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +var once = require('once') + +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} + + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } + + return new Glob(pattern, options, cb) +} + +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync + +// old api surface +glob.glob = glob + +glob.hasMagic = function (pattern, options_) { + var options = util._extend({}, options_) + options.noprocess = true + + var g = new Glob(pattern, options) + var set = g.minimatch.set + if (set.length > 1) + return true + + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } + + return false +} + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } + + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) + + setopts(this, pattern, options) + this._didRealPath = false + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) + + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } + + var self = this + var n = this.minimatch.set.length + this._processing = 0 + this.matches = new Array(n) + + this._emitQueue = [] + this._processQueue = [] + this.paused = false + + if (this.noprocess) + return this + + if (n === 0) + return done() + + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + + function done () { + --self._processing + if (self._processing <= 0) + self._finish() + } +} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return + + if (this.realpath && !this._didRealpath) + return this._realpath() + + common.finish(this) + this.emit('end', this.found) +} + +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + + this._didRealpath = true + + var n = this.matches.length + if (n === 0) + return this._finish() + + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) + + function next () { + if (--n === 0) + self._finish() + } +} + +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() + + var found = Object.keys(matchset) + var self = this + var n = found.length + + if (n === 0) + return cb() + + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + fs.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() + } + }) + }) +} + +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} + +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} + +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} + +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } + } +} + +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return + } + + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return cb() + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + this._process([e].concat(remain), index, inGlobStar, cb) + } + cb() +} + +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return + + if (this.matches[index][e]) + return + + if (isIgnored(this, e)) + return + + if (this.paused) { + this._emitQueue.push([index, e]) + return + } + + var abs = this._makeAbs(e) + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + if (this.mark) + e = this._mark(e) + + this.matches[index][e] = true + + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) + + this.emit('match', e) +} + +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return + + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) + + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) + + if (lstatcb) + fs.lstat(abs, lstatcb) + + function lstatcb_ (er, lstat) { + if (er) + return cb() + + var isSym = lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) + } +} + +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return + + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() + + if (Array.isArray(c)) + return cb(null, c) + } + + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} + +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } +} + +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return + + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + return cb(null, entries) +} + +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return + + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break + } + + return cb() +} + +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + + +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) + + var isSym = this.symlinks[abs] + var len = entries.length + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } + + cb() +} + +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + + //console.error('ps2', prefix, exists) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} + +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return cb() + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) + + if (needDir && c === 'FILE') + return cb() + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } + + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) + + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} + +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er) { + this.statCache[abs] = false + return cb() + } + + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat + + if (abs.slice(-1) === '/' && !stat.isDirectory()) + return cb(null, false, stat) + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return cb() + + return cb(null, c, stat) +} + +}).call(this,require('_process')) +},{"./common.js":15,"./sync.js":17,"_process":24,"assert":9,"events":14,"fs":12,"inflight":18,"inherits":19,"minimatch":20,"once":21,"path":22,"path-is-absolute":23,"util":28}],17:[function(require,module,exports){ +(function (process){ +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var Glob = require('./glob.js').Glob +var util = require('util') +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = fs.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } + } + }) + } + common.finish(this) +} + + +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this.matches[index][e] = true + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + var abs = this._makeAbs(e) + if (this.mark) + e = this._mark(e) + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[this._makeAbs(e)] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + // lstat failed, doesn't exist + return null + } + + var isSym = lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this.matches[index][prefix] = true +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + return false + } + + if (lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +}).call(this,require('_process')) +},{"./common.js":15,"./glob.js":16,"_process":24,"assert":9,"fs":12,"minimatch":20,"path":22,"path-is-absolute":23,"util":28}],18:[function(require,module,exports){ +(function (process){ +var wrappy = require('wrappy') +var reqs = Object.create(null) +var once = require('once') + +module.exports = wrappy(inflight) + +function inflight (key, cb) { + if (reqs[key]) { + reqs[key].push(cb) + return null + } else { + reqs[key] = [cb] + return makeres(key) + } +} + +function makeres (key) { + return once(function RES () { + var cbs = reqs[key] + var len = cbs.length + var args = slice(arguments) + + // XXX It's somewhat ambiguous whether a new callback added in this + // pass should be queued for later execution if something in the + // list of callbacks throws, or if it should just be discarded. + // However, it's such an edge case that it hardly matters, and either + // choice is likely as surprising as the other. + // As it happens, we do go ahead and schedule it for later execution. + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args) + } + } finally { + if (cbs.length > len) { + // added more in the interim. + // de-zalgo, just in case, but don't call again. + cbs.splice(0, len) + process.nextTick(function () { + RES.apply(null, args) + }) + } else { + delete reqs[key] + } + } + }) +} + +function slice (args) { + var length = args.length + var array = [] + + for (var i = 0; i < length; i++) array[i] = args[i] + return array +} + +}).call(this,require('_process')) +},{"_process":24,"once":21,"wrappy":29}],19:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],20:[function(require,module,exports){ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = { sep: '/' } +try { + path = require('path') +} catch (er) {} + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = require('brace-expansion') + +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + // "" only matches "" + if (pattern.trim() === '') return p === '' + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + if (typeof pattern === 'undefined') { + throw new TypeError('undefined pattern') + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError('pattern is too long') + } + + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === '**') return GLOBSTAR + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + if (inClass) { + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '.': + case '[': + case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) + + this.debug('matchOne', file.length, pattern.length) + + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ + } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') + return emptyFileEnd + } + + // should be unreachable. + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} + +},{"brace-expansion":11,"path":22}],21:[function(require,module,exports){ +var wrappy = require('wrappy') +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} + +},{"wrappy":29}],22:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var splitPath = function(filename) { + return splitPathRe.exec(filename).slice(1); +}; + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function(path) { + var result = splitPath(path), + root = result[0], + dir = result[1]; + + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + + return root + dir; +}; + + +exports.basename = function(path, ext) { + var f = splitPath(path)[2]; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + + +exports.extname = function(path) { + return splitPath(path)[3]; +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) +},{"_process":24}],23:[function(require,module,exports){ +(function (process){ +'use strict'; + +function posix(path) { + return path.charAt(0) === '/'; +} + +function win32(path) { + // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ''; + var isUnc = Boolean(device && device.charAt(1) !== ':'); + + // UNC paths are always absolute + return Boolean(result[2] || isUnc); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; + +}).call(this,require('_process')) +},{"_process":24}],24:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],25:[function(require,module,exports){ +// Underscore.js 1.8.3 +// http://underscorejs.org +// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `exports` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var + push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object. + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.8.3'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + case 2: return function(value, other) { + return func.call(context, value, other); + }; + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + // A mostly-internal function to generate callbacks that can be applied + // to each element in a collection, returning the desired result — either + // identity, an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value)) return _.matcher(value); + return _.property(value); + }; + _.iteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, undefinedOnly) { + return function(obj) { + var length = arguments.length; + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var property = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = property('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var keys = _.keys(obj); + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); + } + } + return obj; + }; + + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Create a reducing function iterating left or right. + function createReduce(dir) { + // Optimized iterator function as using arguments.length + // in the main function will deoptimize the, see #1991. + function iterator(obj, iteratee, memo, keys, index, length) { + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + } + + return function(obj, iteratee, memo, context) { + iteratee = optimizeCb(iteratee, context, 4); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + // Determine the initial value if none is provided. + if (arguments.length < 3) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + return iterator(obj, iteratee, memo, keys, index, length); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + _.reduceRight = _.foldr = createReduce(-1); + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, predicate, context) { + var key; + if (isArrayLike(obj)) { + key = _.findIndex(obj, predicate, context); + } else { + key = _.findKey(obj, predicate, context); + } + if (key !== void 0 && key !== -1) return obj[key]; + }; + + // Return all the elements that pass a truth test. + // Aliased as `select`. + _.filter = _.select = function(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); + }; + + // Determine whether all of the elements match a truth test. + // Aliased as `all`. + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + // Determine if at least one element in the object matches a truth test. + // Aliased as `any`. + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + }; + + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + var isFunc = _.isFunction(method); + return _.map(obj, function(value) { + var func = isFunc ? method : value[method]; + return func == null ? func : func.apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, _.property(key)); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.find(obj, _.matcher(attrs)); + }; + + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Shuffle a collection, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + _.shuffle = function(obj) { + var set = isArrayLike(obj) ? obj : _.values(obj); + var length = set.length; + var shuffled = Array(length); + for (var index = 0, rand; index < length; index++) { + rand = _.random(0, index); + if (rand !== index) shuffled[index] = shuffled[rand]; + shuffled[rand] = set[index]; + } + return shuffled; + }; + + // Sample **n** random values from a collection. + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); + }; + + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, index, list) { + return { + value: value, + index: index, + criteria: iteratee(value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior) { + return function(obj, iteratee, context) { + var result = {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, value, key) { + if (_.has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, value, key) { + if (_.has(result, key)) result[key]++; else result[key] = 1; + }); + + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (isArrayLike(obj)) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; + }; + + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = function(obj, predicate, context) { + predicate = cb(predicate, context); + var pass = [], fail = []; + _.each(obj, function(value, key, obj) { + (predicate(value, key, obj) ? pass : fail).push(value); + }); + return [pass, fail]; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + _.initial = function(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + _.last = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, _.identity); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, strict, startIndex) { + var output = [], idx = 0; + for (var i = startIndex || 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + //flatten current level of array or arguments object + if (!shallow) value = flatten(value, shallow, strict); + var j = 0, len = value.length; + output.length += len; + while (j < len) { + output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, false); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); + } + } + return result; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(flatten(arguments, true, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + for (var j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = flatten(arguments, true, true, 1); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + return _.unzip(arguments); + }; + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; + }; + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. + _.object = function(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // Generator function to create the findIndex and findLastIndex functions + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a predicate test + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + }; + + // Generator function to create the indexOf and lastIndexOf functions + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + step = step || 1; + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = function(func, context) { + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var args = slice.call(arguments, 2); + var bound = function() { + return executeBound(func, bound, context, this, args.concat(slice.call(arguments))); + }; + return bound; + }; + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder, allowing any combination of arguments to be pre-filled. + _.partial = function(func) { + var boundArgs = slice.call(arguments, 1); + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = function(obj) { + var i, length = arguments.length, key; + if (length <= 1) throw new Error('bindAll must be passed function names'); + for (i = 1; i < length; i++) { + key = arguments[i]; + obj[key] = _.bind(obj[key], obj); + } + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ + return func.apply(null, args); + }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = _.partial(_.delay, _, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + var later = function() { + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + return function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, args, context, timestamp, result; + + var later = function() { + var last = _.now() - timestamp; + + if (last < wait && last >= 0) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + if (!timeout) context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = _.now(); + var callNow = immediate && !timeout; + if (!timeout) timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + }; + + // Returns a function that will only be executed on and after the Nth call. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + // Object Functions + // ---------------- + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + function collectNonEnumProps(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Returns the results of applying the iteratee to each element of the object + // In contrast to _.map it returns an object + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}, + currentKey; + for (var index = 0; index < length; index++) { + currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Convert an object into a list of `[key, value]` pairs. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s) + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(object, oiteratee, context) { + var result = {}, obj = object, iteratee, keys; + if (obj == null) return result; + if (_.isFunction(oiteratee)) { + keys = _.allKeys(obj); + iteratee = optimizeCb(oiteratee, context); + } else { + keys = flatten(arguments, false, false, 1); + iteratee = function(value, key, obj) { return key in obj; }; + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }; + + // Return a copy of the object without the blacklisted properties. + _.omit = function(obj, iteratee, context) { + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + } else { + var keys = _.map(flatten(arguments, false, false, 1), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }; + + // Fill in a given object with default properties. + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + + // Internal recursive comparison function for `isEqual`. + var eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + switch (className) { + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) === '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) === '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return _.has(obj, 'callee'); + }; + } + + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), and in Safari 8 (#1929). + if (typeof /./ != 'function' && typeof Int8Array != 'object') { + _.isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? (NaN is the only number which does not equal itself). + _.isNaN = function(obj) { + return _.isNumber(obj) && obj !== +obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iteratees. + _.identity = function(value) { + return value; + }; + + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + _.property = property; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + return obj == null ? function(){} : function(key) { + return obj[key]; + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + + // Run a function **n** times. + _.times = function(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); + }; + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + var unescapeMap = _.invert(escapeMap); + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); + + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property, fallback) { + var value = object == null ? void 0 : object[property]; + if (value === void 0) { + value = fallback; + } + return _.isFunction(value) ? value.call(object) : value; + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escaper = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escaper, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offest. + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + try { + var render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function. Start chaining a wrapped Underscore object. + _.chain = function(obj) { + var instance = _(obj); + instance._chain = true; + return instance; + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var result = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result(this, func.apply(_, args)); + }; + }); + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return result(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + _.each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return result(this, method.apply(this._wrapped, arguments)); + }; + }); + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return '' + this._wrapped; + }; + + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define === 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}.call(this)); + +},{}],26:[function(require,module,exports){ +arguments[4][19][0].apply(exports,arguments) +},{"dup":19}],27:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],28:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./support/isBuffer":27,"_process":24,"inherits":26}],29:[function(require,module,exports){ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} + +},{}]},{},[7])(7) +}); \ No newline at end of file diff --git a/assets/javascripts/workers/search.16e2a7d4.min.js b/assets/javascripts/workers/search.16e2a7d4.min.js new file mode 100644 index 00000000000..e0dc159e89e --- /dev/null +++ b/assets/javascripts/workers/search.16e2a7d4.min.js @@ -0,0 +1,48 @@ +"use strict";(()=>{var ge=Object.create;var W=Object.defineProperty,ye=Object.defineProperties,me=Object.getOwnPropertyDescriptor,ve=Object.getOwnPropertyDescriptors,xe=Object.getOwnPropertyNames,G=Object.getOwnPropertySymbols,Se=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty,Qe=Object.prototype.propertyIsEnumerable;var J=(t,e,r)=>e in t?W(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,M=(t,e)=>{for(var r in e||(e={}))X.call(e,r)&&J(t,r,e[r]);if(G)for(var r of G(e))Qe.call(e,r)&&J(t,r,e[r]);return t},Z=(t,e)=>ye(t,ve(e));var K=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var be=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of xe(e))!X.call(t,i)&&i!==r&&W(t,i,{get:()=>e[i],enumerable:!(n=me(e,i))||n.enumerable});return t};var H=(t,e,r)=>(r=t!=null?ge(Se(t)):{},be(e||!t||!t.__esModule?W(r,"default",{value:t,enumerable:!0}):r,t));var z=(t,e,r)=>new Promise((n,i)=>{var s=u=>{try{a(r.next(u))}catch(c){i(c)}},o=u=>{try{a(r.throw(u))}catch(c){i(c)}},a=u=>u.done?n(u.value):Promise.resolve(u.value).then(s,o);a((r=r.apply(t,e)).next())});var re=K((ee,te)=>{/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */t.utils={},t.utils.warn=function(e){return function(r){e.console&&console.warn&&console.warn(r)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i0){var h=t.utils.clone(r)||{};h.position=[a,c],h.index=s.length,s.push(new t.Token(n.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n=n+1,this._stack.splice(n,0,r)},t.Pipeline.prototype.before=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,r)},t.Pipeline.prototype.remove=function(e){var r=this._stack.indexOf(e);r!=-1&&this._stack.splice(r,1)},t.Pipeline.prototype.run=function(e){for(var r=this._stack.length,n=0;n1&&(oe&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ou?h+=2:a==u&&(r+=n[c+1]*i[h+1],c+=2,h+=2);return r},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),r=1,n=0;r0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}s.str.length==1&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),y=s.str.charAt(1),g;y in s.node.edges?g=s.node.edges[y]:(g=new t.TokenSet,s.node.edges[y]=g),s.str.length==1&&(g.final=!0),i.push({node:g,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return n},t.TokenSet.fromString=function(e){for(var r=new t.TokenSet,n=r,i=0,s=e.length;i=e;r--){var n=this.uncheckedNodes[r],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}};/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,r){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,r;do e=this.next(),r=e.charCodeAt(0);while(r>47&&r<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var r=e.next();if(r==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(r.charCodeAt(0)==92){e.escapeCharacter();continue}if(r==":")return t.QueryLexer.lexField;if(r=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(r=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(r=="+"&&e.width()===1||r=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(r.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,r){this.lexer=new t.QueryLexer(e),this.query=r,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var r=e.peekLexeme();if(r!=null)switch(r.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(n+=" with value '"+r.str+"'"),new t.QueryParseError(n,r.start,r.end)}},t.QueryParser.parsePresence=function(e){var r=e.consumeLexeme();if(r!=null){switch(r.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+r.str+"'";throw new t.QueryParseError(n,r.start,r.end)}var i=e.peekLexeme();if(i==null){var n="expecting term or field, found nothing";throw new t.QueryParseError(n,r.start,r.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(n,i.start,i.end)}}},t.QueryParser.parseField=function(e){var r=e.consumeLexeme();if(r!=null){if(e.query.allFields.indexOf(r.str)==-1){var n=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+r.str+"', possible fields: "+n;throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.fields=[r.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,r.start,r.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var r=e.consumeLexeme();if(r!=null){e.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(n==null){e.nextClause();return}switch(n.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new t.QueryParseError(i,n.start,n.end)}}},t.QueryParser.parseEditDistance=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.editDistance=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="boost must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.boost=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,r){typeof define=="function"&&define.amd?define(r):typeof ee=="object"?te.exports=r():e.lunr=r()}(this,function(){return t})})()});var q=K((Re,ne)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var Le=/["'&<>]/;ne.exports=we;function we(t){var e=""+t,r=Le.exec(e);if(!r)return e;var n,i="",s=0,o=0;for(s=r.index;s=0;r--){let n=t[r];typeof n=="string"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?e.insertBefore(this.previousSibling,n):e.replaceChild(n,this)}}}));var ie=H(q());function se(t){let e=new Map,r=new Set;for(let n of t){let[i,s]=n.location.split("#"),o=n.location,a=n.title,u=n.tags,c=(0,ie.default)(n.text).replace(/\s+(?=[,.:;!?])/g,"").replace(/\s+/g," ");if(s){let h=e.get(i);r.has(h)?e.set(o,{location:o,title:a,text:c,parent:h}):(h.title=n.title,h.text=c,r.add(h))}else e.set(o,M({location:o,title:a,text:c},u&&{tags:u}))}return e}var oe=H(q());function ae(t,e){let r=new RegExp(t.separator,"img"),n=(i,s,o)=>`${s}${o}`;return i=>{i=i.replace(/[\s*+\-:~^]+/g," ").trim();let s=new RegExp(`(^|${t.separator})(${i.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return o=>(e?(0,oe.default)(o):o).replace(s,n).replace(/<\/mark>(\s+)]*>/img,"$1")}}function ue(t){let e=new lunr.Query(["title","text"]);return new lunr.QueryParser(t,e).parse(),e.clauses}function ce(t,e){var i;let r=new Set(t),n={};for(let s=0;s!n.has(i)))]}var U=class{constructor({config:e,docs:r,options:n}){this.options=n,this.documents=se(r),this.highlight=ae(e,!1),lunr.tokenizer.separator=new RegExp(e.separator),this.index=lunr(function(){e.lang.length===1&&e.lang[0]!=="en"?this.use(lunr[e.lang[0]]):e.lang.length>1&&this.use(lunr.multiLanguage(...e.lang));let i=Ee(["trimmer","stopWordFilter","stemmer"],n.pipeline);for(let s of e.lang.map(o=>o==="en"?lunr:lunr[o]))for(let o of i)this.pipeline.remove(s[o]),this.searchPipeline.remove(s[o]);this.ref("location"),this.field("title",{boost:1e3}),this.field("text"),this.field("tags",{boost:1e6,extractor:s=>{let{tags:o=[]}=s;return o.reduce((a,u)=>[...a,...lunr.tokenizer(u)],[])}});for(let s of r)this.add(s,{boost:s.boost})})}search(e){if(e)try{let r=this.highlight(e),n=ue(e).filter(o=>o.presence!==lunr.Query.presence.PROHIBITED),i=this.index.search(`${e}*`).reduce((o,{ref:a,score:u,matchData:c})=>{let h=this.documents.get(a);if(typeof h!="undefined"){let{location:y,title:g,text:b,tags:m,parent:Q}=h,p=ce(n,Object.keys(c.metadata)),d=+!Q+ +Object.values(p).every(w=>w);o.push(Z(M({location:y,title:r(g),text:r(b)},m&&{tags:m.map(r)}),{score:u*(1+d),terms:p}))}return o},[]).sort((o,a)=>a.score-o.score).reduce((o,a)=>{let u=this.documents.get(a.location);if(typeof u!="undefined"){let c="parent"in u?u.parent.location:u.location;o.set(c,[...o.get(c)||[],a])}return o},new Map),s;if(this.options.suggestions){let o=this.index.query(a=>{for(let u of n)a.term(u.term,{fields:["title"],presence:lunr.Query.presence.REQUIRED,wildcard:lunr.Query.wildcard.TRAILING})});s=o.length?Object.keys(o[0].matchData.metadata):[]}return M({items:[...i.values()]},typeof s!="undefined"&&{suggestions:s})}catch(r){console.warn(`Invalid query: ${e} \u2013 see https://bit.ly/2s3ChXG`)}return{items:[]}}};var Y;function ke(t){return z(this,null,function*(){let e="../lunr";if(typeof parent!="undefined"&&"IFrameWorker"in parent){let n=document.querySelector("script[src]"),[i]=n.src.split("/worker");e=e.replace("..",i)}let r=[];for(let n of t.lang){switch(n){case"ja":r.push(`${e}/tinyseg.js`);break;case"hi":case"th":r.push(`${e}/wordcut.js`);break}n!=="en"&&r.push(`${e}/min/lunr.${n}.min.js`)}t.lang.length>1&&r.push(`${e}/min/lunr.multi.min.js`),r.length&&(yield importScripts(`${e}/min/lunr.stemmer.support.min.js`,...r))})}function Te(t){return z(this,null,function*(){switch(t.type){case 0:return yield ke(t.data.config),Y=new U(t.data),{type:1};case 2:return{type:3,data:Y?Y.search(t.data):{items:[]}};default:throw new TypeError("Invalid message type")}})}self.lunr=le.default;addEventListener("message",t=>z(void 0,null,function*(){postMessage(yield Te(t.data))}));})(); +//# sourceMappingURL=search.16e2a7d4.min.js.map + diff --git a/assets/javascripts/workers/search.16e2a7d4.min.js.map b/assets/javascripts/workers/search.16e2a7d4.min.js.map new file mode 100644 index 00000000000..fa01f374277 --- /dev/null +++ b/assets/javascripts/workers/search.16e2a7d4.min.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["node_modules/lunr/lunr.js", "node_modules/escape-html/index.js", "src/assets/javascripts/integrations/search/worker/main/index.ts", "src/assets/javascripts/polyfills/index.ts", "src/assets/javascripts/integrations/search/document/index.ts", "src/assets/javascripts/integrations/search/highlighter/index.ts", "src/assets/javascripts/integrations/search/query/_/index.ts", "src/assets/javascripts/integrations/search/_/index.ts"], + "sourceRoot": "../../../..", + "sourcesContent": ["/**\n * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9\n * Copyright (C) 2020 Oliver Nightingale\n * @license MIT\n */\n\n;(function(){\n\n/**\n * A convenience function for configuring and constructing\n * a new lunr Index.\n *\n * A lunr.Builder instance is created and the pipeline setup\n * with a trimmer, stop word filter and stemmer.\n *\n * This builder object is yielded to the configuration function\n * that is passed as a parameter, allowing the list of fields\n * and other builder parameters to be customised.\n *\n * All documents _must_ be added within the passed config function.\n *\n * @example\n * var idx = lunr(function () {\n * this.field('title')\n * this.field('body')\n * this.ref('id')\n *\n * documents.forEach(function (doc) {\n * this.add(doc)\n * }, this)\n * })\n *\n * @see {@link lunr.Builder}\n * @see {@link lunr.Pipeline}\n * @see {@link lunr.trimmer}\n * @see {@link lunr.stopWordFilter}\n * @see {@link lunr.stemmer}\n * @namespace {function} lunr\n */\nvar lunr = function (config) {\n var builder = new lunr.Builder\n\n builder.pipeline.add(\n lunr.trimmer,\n lunr.stopWordFilter,\n lunr.stemmer\n )\n\n builder.searchPipeline.add(\n lunr.stemmer\n )\n\n config.call(builder, builder)\n return builder.build()\n}\n\nlunr.version = \"2.3.9\"\n/*!\n * lunr.utils\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A namespace containing utils for the rest of the lunr library\n * @namespace lunr.utils\n */\nlunr.utils = {}\n\n/**\n * Print a warning message to the console.\n *\n * @param {String} message The message to be printed.\n * @memberOf lunr.utils\n * @function\n */\nlunr.utils.warn = (function (global) {\n /* eslint-disable no-console */\n return function (message) {\n if (global.console && console.warn) {\n console.warn(message)\n }\n }\n /* eslint-enable no-console */\n})(this)\n\n/**\n * Convert an object to a string.\n *\n * In the case of `null` and `undefined` the function returns\n * the empty string, in all other cases the result of calling\n * `toString` on the passed object is returned.\n *\n * @param {Any} obj The object to convert to a string.\n * @return {String} string representation of the passed object.\n * @memberOf lunr.utils\n */\nlunr.utils.asString = function (obj) {\n if (obj === void 0 || obj === null) {\n return \"\"\n } else {\n return obj.toString()\n }\n}\n\n/**\n * Clones an object.\n *\n * Will create a copy of an existing object such that any mutations\n * on the copy cannot affect the original.\n *\n * Only shallow objects are supported, passing a nested object to this\n * function will cause a TypeError.\n *\n * Objects with primitives, and arrays of primitives are supported.\n *\n * @param {Object} obj The object to clone.\n * @return {Object} a clone of the passed object.\n * @throws {TypeError} when a nested object is passed.\n * @memberOf Utils\n */\nlunr.utils.clone = function (obj) {\n if (obj === null || obj === undefined) {\n return obj\n }\n\n var clone = Object.create(null),\n keys = Object.keys(obj)\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i],\n val = obj[key]\n\n if (Array.isArray(val)) {\n clone[key] = val.slice()\n continue\n }\n\n if (typeof val === 'string' ||\n typeof val === 'number' ||\n typeof val === 'boolean') {\n clone[key] = val\n continue\n }\n\n throw new TypeError(\"clone is not deep and does not support nested objects\")\n }\n\n return clone\n}\nlunr.FieldRef = function (docRef, fieldName, stringValue) {\n this.docRef = docRef\n this.fieldName = fieldName\n this._stringValue = stringValue\n}\n\nlunr.FieldRef.joiner = \"/\"\n\nlunr.FieldRef.fromString = function (s) {\n var n = s.indexOf(lunr.FieldRef.joiner)\n\n if (n === -1) {\n throw \"malformed field ref string\"\n }\n\n var fieldRef = s.slice(0, n),\n docRef = s.slice(n + 1)\n\n return new lunr.FieldRef (docRef, fieldRef, s)\n}\n\nlunr.FieldRef.prototype.toString = function () {\n if (this._stringValue == undefined) {\n this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef\n }\n\n return this._stringValue\n}\n/*!\n * lunr.Set\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A lunr set.\n *\n * @constructor\n */\nlunr.Set = function (elements) {\n this.elements = Object.create(null)\n\n if (elements) {\n this.length = elements.length\n\n for (var i = 0; i < this.length; i++) {\n this.elements[elements[i]] = true\n }\n } else {\n this.length = 0\n }\n}\n\n/**\n * A complete set that contains all elements.\n *\n * @static\n * @readonly\n * @type {lunr.Set}\n */\nlunr.Set.complete = {\n intersect: function (other) {\n return other\n },\n\n union: function () {\n return this\n },\n\n contains: function () {\n return true\n }\n}\n\n/**\n * An empty set that contains no elements.\n *\n * @static\n * @readonly\n * @type {lunr.Set}\n */\nlunr.Set.empty = {\n intersect: function () {\n return this\n },\n\n union: function (other) {\n return other\n },\n\n contains: function () {\n return false\n }\n}\n\n/**\n * Returns true if this set contains the specified object.\n *\n * @param {object} object - Object whose presence in this set is to be tested.\n * @returns {boolean} - True if this set contains the specified object.\n */\nlunr.Set.prototype.contains = function (object) {\n return !!this.elements[object]\n}\n\n/**\n * Returns a new set containing only the elements that are present in both\n * this set and the specified set.\n *\n * @param {lunr.Set} other - set to intersect with this set.\n * @returns {lunr.Set} a new set that is the intersection of this and the specified set.\n */\n\nlunr.Set.prototype.intersect = function (other) {\n var a, b, elements, intersection = []\n\n if (other === lunr.Set.complete) {\n return this\n }\n\n if (other === lunr.Set.empty) {\n return other\n }\n\n if (this.length < other.length) {\n a = this\n b = other\n } else {\n a = other\n b = this\n }\n\n elements = Object.keys(a.elements)\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i]\n if (element in b.elements) {\n intersection.push(element)\n }\n }\n\n return new lunr.Set (intersection)\n}\n\n/**\n * Returns a new set combining the elements of this and the specified set.\n *\n * @param {lunr.Set} other - set to union with this set.\n * @return {lunr.Set} a new set that is the union of this and the specified set.\n */\n\nlunr.Set.prototype.union = function (other) {\n if (other === lunr.Set.complete) {\n return lunr.Set.complete\n }\n\n if (other === lunr.Set.empty) {\n return this\n }\n\n return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements)))\n}\n/**\n * A function to calculate the inverse document frequency for\n * a posting. This is shared between the builder and the index\n *\n * @private\n * @param {object} posting - The posting for a given term\n * @param {number} documentCount - The total number of documents.\n */\nlunr.idf = function (posting, documentCount) {\n var documentsWithTerm = 0\n\n for (var fieldName in posting) {\n if (fieldName == '_index') continue // Ignore the term index, its not a field\n documentsWithTerm += Object.keys(posting[fieldName]).length\n }\n\n var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5)\n\n return Math.log(1 + Math.abs(x))\n}\n\n/**\n * A token wraps a string representation of a token\n * as it is passed through the text processing pipeline.\n *\n * @constructor\n * @param {string} [str=''] - The string token being wrapped.\n * @param {object} [metadata={}] - Metadata associated with this token.\n */\nlunr.Token = function (str, metadata) {\n this.str = str || \"\"\n this.metadata = metadata || {}\n}\n\n/**\n * Returns the token string that is being wrapped by this object.\n *\n * @returns {string}\n */\nlunr.Token.prototype.toString = function () {\n return this.str\n}\n\n/**\n * A token update function is used when updating or optionally\n * when cloning a token.\n *\n * @callback lunr.Token~updateFunction\n * @param {string} str - The string representation of the token.\n * @param {Object} metadata - All metadata associated with this token.\n */\n\n/**\n * Applies the given function to the wrapped string token.\n *\n * @example\n * token.update(function (str, metadata) {\n * return str.toUpperCase()\n * })\n *\n * @param {lunr.Token~updateFunction} fn - A function to apply to the token string.\n * @returns {lunr.Token}\n */\nlunr.Token.prototype.update = function (fn) {\n this.str = fn(this.str, this.metadata)\n return this\n}\n\n/**\n * Creates a clone of this token. Optionally a function can be\n * applied to the cloned token.\n *\n * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token.\n * @returns {lunr.Token}\n */\nlunr.Token.prototype.clone = function (fn) {\n fn = fn || function (s) { return s }\n return new lunr.Token (fn(this.str, this.metadata), this.metadata)\n}\n/*!\n * lunr.tokenizer\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A function for splitting a string into tokens ready to be inserted into\n * the search index. Uses `lunr.tokenizer.separator` to split strings, change\n * the value of this property to change how strings are split into tokens.\n *\n * This tokenizer will convert its parameter to a string by calling `toString` and\n * then will split this string on the character in `lunr.tokenizer.separator`.\n * Arrays will have their elements converted to strings and wrapped in a lunr.Token.\n *\n * Optional metadata can be passed to the tokenizer, this metadata will be cloned and\n * added as metadata to every token that is created from the object to be tokenized.\n *\n * @static\n * @param {?(string|object|object[])} obj - The object to convert into tokens\n * @param {?object} metadata - Optional metadata to associate with every token\n * @returns {lunr.Token[]}\n * @see {@link lunr.Pipeline}\n */\nlunr.tokenizer = function (obj, metadata) {\n if (obj == null || obj == undefined) {\n return []\n }\n\n if (Array.isArray(obj)) {\n return obj.map(function (t) {\n return new lunr.Token(\n lunr.utils.asString(t).toLowerCase(),\n lunr.utils.clone(metadata)\n )\n })\n }\n\n var str = obj.toString().toLowerCase(),\n len = str.length,\n tokens = []\n\n for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) {\n var char = str.charAt(sliceEnd),\n sliceLength = sliceEnd - sliceStart\n\n if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) {\n\n if (sliceLength > 0) {\n var tokenMetadata = lunr.utils.clone(metadata) || {}\n tokenMetadata[\"position\"] = [sliceStart, sliceLength]\n tokenMetadata[\"index\"] = tokens.length\n\n tokens.push(\n new lunr.Token (\n str.slice(sliceStart, sliceEnd),\n tokenMetadata\n )\n )\n }\n\n sliceStart = sliceEnd + 1\n }\n\n }\n\n return tokens\n}\n\n/**\n * The separator used to split a string into tokens. Override this property to change the behaviour of\n * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens.\n *\n * @static\n * @see lunr.tokenizer\n */\nlunr.tokenizer.separator = /[\\s\\-]+/\n/*!\n * lunr.Pipeline\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.Pipelines maintain an ordered list of functions to be applied to all\n * tokens in documents entering the search index and queries being ran against\n * the index.\n *\n * An instance of lunr.Index created with the lunr shortcut will contain a\n * pipeline with a stop word filter and an English language stemmer. Extra\n * functions can be added before or after either of these functions or these\n * default functions can be removed.\n *\n * When run the pipeline will call each function in turn, passing a token, the\n * index of that token in the original list of all tokens and finally a list of\n * all the original tokens.\n *\n * The output of functions in the pipeline will be passed to the next function\n * in the pipeline. To exclude a token from entering the index the function\n * should return undefined, the rest of the pipeline will not be called with\n * this token.\n *\n * For serialisation of pipelines to work, all functions used in an instance of\n * a pipeline should be registered with lunr.Pipeline. Registered functions can\n * then be loaded. If trying to load a serialised pipeline that uses functions\n * that are not registered an error will be thrown.\n *\n * If not planning on serialising the pipeline then registering pipeline functions\n * is not necessary.\n *\n * @constructor\n */\nlunr.Pipeline = function () {\n this._stack = []\n}\n\nlunr.Pipeline.registeredFunctions = Object.create(null)\n\n/**\n * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token\n * string as well as all known metadata. A pipeline function can mutate the token string\n * or mutate (or add) metadata for a given token.\n *\n * A pipeline function can indicate that the passed token should be discarded by returning\n * null, undefined or an empty string. This token will not be passed to any downstream pipeline\n * functions and will not be added to the index.\n *\n * Multiple tokens can be returned by returning an array of tokens. Each token will be passed\n * to any downstream pipeline functions and all will returned tokens will be added to the index.\n *\n * Any number of pipeline functions may be chained together using a lunr.Pipeline.\n *\n * @interface lunr.PipelineFunction\n * @param {lunr.Token} token - A token from the document being processed.\n * @param {number} i - The index of this token in the complete list of tokens for this document/field.\n * @param {lunr.Token[]} tokens - All tokens for this document/field.\n * @returns {(?lunr.Token|lunr.Token[])}\n */\n\n/**\n * Register a function with the pipeline.\n *\n * Functions that are used in the pipeline should be registered if the pipeline\n * needs to be serialised, or a serialised pipeline needs to be loaded.\n *\n * Registering a function does not add it to a pipeline, functions must still be\n * added to instances of the pipeline for them to be used when running a pipeline.\n *\n * @param {lunr.PipelineFunction} fn - The function to check for.\n * @param {String} label - The label to register this function with\n */\nlunr.Pipeline.registerFunction = function (fn, label) {\n if (label in this.registeredFunctions) {\n lunr.utils.warn('Overwriting existing registered function: ' + label)\n }\n\n fn.label = label\n lunr.Pipeline.registeredFunctions[fn.label] = fn\n}\n\n/**\n * Warns if the function is not registered as a Pipeline function.\n *\n * @param {lunr.PipelineFunction} fn - The function to check for.\n * @private\n */\nlunr.Pipeline.warnIfFunctionNotRegistered = function (fn) {\n var isRegistered = fn.label && (fn.label in this.registeredFunctions)\n\n if (!isRegistered) {\n lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\\n', fn)\n }\n}\n\n/**\n * Loads a previously serialised pipeline.\n *\n * All functions to be loaded must already be registered with lunr.Pipeline.\n * If any function from the serialised data has not been registered then an\n * error will be thrown.\n *\n * @param {Object} serialised - The serialised pipeline to load.\n * @returns {lunr.Pipeline}\n */\nlunr.Pipeline.load = function (serialised) {\n var pipeline = new lunr.Pipeline\n\n serialised.forEach(function (fnName) {\n var fn = lunr.Pipeline.registeredFunctions[fnName]\n\n if (fn) {\n pipeline.add(fn)\n } else {\n throw new Error('Cannot load unregistered function: ' + fnName)\n }\n })\n\n return pipeline\n}\n\n/**\n * Adds new functions to the end of the pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline.\n */\nlunr.Pipeline.prototype.add = function () {\n var fns = Array.prototype.slice.call(arguments)\n\n fns.forEach(function (fn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(fn)\n this._stack.push(fn)\n }, this)\n}\n\n/**\n * Adds a single function after a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.\n * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.\n */\nlunr.Pipeline.prototype.after = function (existingFn, newFn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(newFn)\n\n var pos = this._stack.indexOf(existingFn)\n if (pos == -1) {\n throw new Error('Cannot find existingFn')\n }\n\n pos = pos + 1\n this._stack.splice(pos, 0, newFn)\n}\n\n/**\n * Adds a single function before a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.\n * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.\n */\nlunr.Pipeline.prototype.before = function (existingFn, newFn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(newFn)\n\n var pos = this._stack.indexOf(existingFn)\n if (pos == -1) {\n throw new Error('Cannot find existingFn')\n }\n\n this._stack.splice(pos, 0, newFn)\n}\n\n/**\n * Removes a function from the pipeline.\n *\n * @param {lunr.PipelineFunction} fn The function to remove from the pipeline.\n */\nlunr.Pipeline.prototype.remove = function (fn) {\n var pos = this._stack.indexOf(fn)\n if (pos == -1) {\n return\n }\n\n this._stack.splice(pos, 1)\n}\n\n/**\n * Runs the current list of functions that make up the pipeline against the\n * passed tokens.\n *\n * @param {Array} tokens The tokens to run through the pipeline.\n * @returns {Array}\n */\nlunr.Pipeline.prototype.run = function (tokens) {\n var stackLength = this._stack.length\n\n for (var i = 0; i < stackLength; i++) {\n var fn = this._stack[i]\n var memo = []\n\n for (var j = 0; j < tokens.length; j++) {\n var result = fn(tokens[j], j, tokens)\n\n if (result === null || result === void 0 || result === '') continue\n\n if (Array.isArray(result)) {\n for (var k = 0; k < result.length; k++) {\n memo.push(result[k])\n }\n } else {\n memo.push(result)\n }\n }\n\n tokens = memo\n }\n\n return tokens\n}\n\n/**\n * Convenience method for passing a string through a pipeline and getting\n * strings out. This method takes care of wrapping the passed string in a\n * token and mapping the resulting tokens back to strings.\n *\n * @param {string} str - The string to pass through the pipeline.\n * @param {?object} metadata - Optional metadata to associate with the token\n * passed to the pipeline.\n * @returns {string[]}\n */\nlunr.Pipeline.prototype.runString = function (str, metadata) {\n var token = new lunr.Token (str, metadata)\n\n return this.run([token]).map(function (t) {\n return t.toString()\n })\n}\n\n/**\n * Resets the pipeline by removing any existing processors.\n *\n */\nlunr.Pipeline.prototype.reset = function () {\n this._stack = []\n}\n\n/**\n * Returns a representation of the pipeline ready for serialisation.\n *\n * Logs a warning if the function has not been registered.\n *\n * @returns {Array}\n */\nlunr.Pipeline.prototype.toJSON = function () {\n return this._stack.map(function (fn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(fn)\n\n return fn.label\n })\n}\n/*!\n * lunr.Vector\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A vector is used to construct the vector space of documents and queries. These\n * vectors support operations to determine the similarity between two documents or\n * a document and a query.\n *\n * Normally no parameters are required for initializing a vector, but in the case of\n * loading a previously dumped vector the raw elements can be provided to the constructor.\n *\n * For performance reasons vectors are implemented with a flat array, where an elements\n * index is immediately followed by its value. E.g. [index, value, index, value]. This\n * allows the underlying array to be as sparse as possible and still offer decent\n * performance when being used for vector calculations.\n *\n * @constructor\n * @param {Number[]} [elements] - The flat list of element index and element value pairs.\n */\nlunr.Vector = function (elements) {\n this._magnitude = 0\n this.elements = elements || []\n}\n\n\n/**\n * Calculates the position within the vector to insert a given index.\n *\n * This is used internally by insert and upsert. If there are duplicate indexes then\n * the position is returned as if the value for that index were to be updated, but it\n * is the callers responsibility to check whether there is a duplicate at that index\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @returns {Number}\n */\nlunr.Vector.prototype.positionForIndex = function (index) {\n // For an empty vector the tuple can be inserted at the beginning\n if (this.elements.length == 0) {\n return 0\n }\n\n var start = 0,\n end = this.elements.length / 2,\n sliceLength = end - start,\n pivotPoint = Math.floor(sliceLength / 2),\n pivotIndex = this.elements[pivotPoint * 2]\n\n while (sliceLength > 1) {\n if (pivotIndex < index) {\n start = pivotPoint\n }\n\n if (pivotIndex > index) {\n end = pivotPoint\n }\n\n if (pivotIndex == index) {\n break\n }\n\n sliceLength = end - start\n pivotPoint = start + Math.floor(sliceLength / 2)\n pivotIndex = this.elements[pivotPoint * 2]\n }\n\n if (pivotIndex == index) {\n return pivotPoint * 2\n }\n\n if (pivotIndex > index) {\n return pivotPoint * 2\n }\n\n if (pivotIndex < index) {\n return (pivotPoint + 1) * 2\n }\n}\n\n/**\n * Inserts an element at an index within the vector.\n *\n * Does not allow duplicates, will throw an error if there is already an entry\n * for this index.\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @param {Number} val - The value to be inserted into the vector.\n */\nlunr.Vector.prototype.insert = function (insertIdx, val) {\n this.upsert(insertIdx, val, function () {\n throw \"duplicate index\"\n })\n}\n\n/**\n * Inserts or updates an existing index within the vector.\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @param {Number} val - The value to be inserted into the vector.\n * @param {function} fn - A function that is called for updates, the existing value and the\n * requested value are passed as arguments\n */\nlunr.Vector.prototype.upsert = function (insertIdx, val, fn) {\n this._magnitude = 0\n var position = this.positionForIndex(insertIdx)\n\n if (this.elements[position] == insertIdx) {\n this.elements[position + 1] = fn(this.elements[position + 1], val)\n } else {\n this.elements.splice(position, 0, insertIdx, val)\n }\n}\n\n/**\n * Calculates the magnitude of this vector.\n *\n * @returns {Number}\n */\nlunr.Vector.prototype.magnitude = function () {\n if (this._magnitude) return this._magnitude\n\n var sumOfSquares = 0,\n elementsLength = this.elements.length\n\n for (var i = 1; i < elementsLength; i += 2) {\n var val = this.elements[i]\n sumOfSquares += val * val\n }\n\n return this._magnitude = Math.sqrt(sumOfSquares)\n}\n\n/**\n * Calculates the dot product of this vector and another vector.\n *\n * @param {lunr.Vector} otherVector - The vector to compute the dot product with.\n * @returns {Number}\n */\nlunr.Vector.prototype.dot = function (otherVector) {\n var dotProduct = 0,\n a = this.elements, b = otherVector.elements,\n aLen = a.length, bLen = b.length,\n aVal = 0, bVal = 0,\n i = 0, j = 0\n\n while (i < aLen && j < bLen) {\n aVal = a[i], bVal = b[j]\n if (aVal < bVal) {\n i += 2\n } else if (aVal > bVal) {\n j += 2\n } else if (aVal == bVal) {\n dotProduct += a[i + 1] * b[j + 1]\n i += 2\n j += 2\n }\n }\n\n return dotProduct\n}\n\n/**\n * Calculates the similarity between this vector and another vector.\n *\n * @param {lunr.Vector} otherVector - The other vector to calculate the\n * similarity with.\n * @returns {Number}\n */\nlunr.Vector.prototype.similarity = function (otherVector) {\n return this.dot(otherVector) / this.magnitude() || 0\n}\n\n/**\n * Converts the vector to an array of the elements within the vector.\n *\n * @returns {Number[]}\n */\nlunr.Vector.prototype.toArray = function () {\n var output = new Array (this.elements.length / 2)\n\n for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) {\n output[j] = this.elements[i]\n }\n\n return output\n}\n\n/**\n * A JSON serializable representation of the vector.\n *\n * @returns {Number[]}\n */\nlunr.Vector.prototype.toJSON = function () {\n return this.elements\n}\n/* eslint-disable */\n/*!\n * lunr.stemmer\n * Copyright (C) 2020 Oliver Nightingale\n * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt\n */\n\n/**\n * lunr.stemmer is an english language stemmer, this is a JavaScript\n * implementation of the PorterStemmer taken from http://tartarus.org/~martin\n *\n * @static\n * @implements {lunr.PipelineFunction}\n * @param {lunr.Token} token - The string to stem\n * @returns {lunr.Token}\n * @see {@link lunr.Pipeline}\n * @function\n */\nlunr.stemmer = (function(){\n var step2list = {\n \"ational\" : \"ate\",\n \"tional\" : \"tion\",\n \"enci\" : \"ence\",\n \"anci\" : \"ance\",\n \"izer\" : \"ize\",\n \"bli\" : \"ble\",\n \"alli\" : \"al\",\n \"entli\" : \"ent\",\n \"eli\" : \"e\",\n \"ousli\" : \"ous\",\n \"ization\" : \"ize\",\n \"ation\" : \"ate\",\n \"ator\" : \"ate\",\n \"alism\" : \"al\",\n \"iveness\" : \"ive\",\n \"fulness\" : \"ful\",\n \"ousness\" : \"ous\",\n \"aliti\" : \"al\",\n \"iviti\" : \"ive\",\n \"biliti\" : \"ble\",\n \"logi\" : \"log\"\n },\n\n step3list = {\n \"icate\" : \"ic\",\n \"ative\" : \"\",\n \"alize\" : \"al\",\n \"iciti\" : \"ic\",\n \"ical\" : \"ic\",\n \"ful\" : \"\",\n \"ness\" : \"\"\n },\n\n c = \"[^aeiou]\", // consonant\n v = \"[aeiouy]\", // vowel\n C = c + \"[^aeiouy]*\", // consonant sequence\n V = v + \"[aeiou]*\", // vowel sequence\n\n mgr0 = \"^(\" + C + \")?\" + V + C, // [C]VC... is m>0\n meq1 = \"^(\" + C + \")?\" + V + C + \"(\" + V + \")?$\", // [C]VC[V] is m=1\n mgr1 = \"^(\" + C + \")?\" + V + C + V + C, // [C]VCVC... is m>1\n s_v = \"^(\" + C + \")?\" + v; // vowel in stem\n\n var re_mgr0 = new RegExp(mgr0);\n var re_mgr1 = new RegExp(mgr1);\n var re_meq1 = new RegExp(meq1);\n var re_s_v = new RegExp(s_v);\n\n var re_1a = /^(.+?)(ss|i)es$/;\n var re2_1a = /^(.+?)([^s])s$/;\n var re_1b = /^(.+?)eed$/;\n var re2_1b = /^(.+?)(ed|ing)$/;\n var re_1b_2 = /.$/;\n var re2_1b_2 = /(at|bl|iz)$/;\n var re3_1b_2 = new RegExp(\"([^aeiouylsz])\\\\1$\");\n var re4_1b_2 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n\n var re_1c = /^(.+?[^aeiou])y$/;\n var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;\n\n var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;\n\n var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n var re2_4 = /^(.+?)(s|t)(ion)$/;\n\n var re_5 = /^(.+?)e$/;\n var re_5_1 = /ll$/;\n var re3_5 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n\n var porterStemmer = function porterStemmer(w) {\n var stem,\n suffix,\n firstch,\n re,\n re2,\n re3,\n re4;\n\n if (w.length < 3) { return w; }\n\n firstch = w.substr(0,1);\n if (firstch == \"y\") {\n w = firstch.toUpperCase() + w.substr(1);\n }\n\n // Step 1a\n re = re_1a\n re2 = re2_1a;\n\n if (re.test(w)) { w = w.replace(re,\"$1$2\"); }\n else if (re2.test(w)) { w = w.replace(re2,\"$1$2\"); }\n\n // Step 1b\n re = re_1b;\n re2 = re2_1b;\n if (re.test(w)) {\n var fp = re.exec(w);\n re = re_mgr0;\n if (re.test(fp[1])) {\n re = re_1b_2;\n w = w.replace(re,\"\");\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1];\n re2 = re_s_v;\n if (re2.test(stem)) {\n w = stem;\n re2 = re2_1b_2;\n re3 = re3_1b_2;\n re4 = re4_1b_2;\n if (re2.test(w)) { w = w + \"e\"; }\n else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,\"\"); }\n else if (re4.test(w)) { w = w + \"e\"; }\n }\n }\n\n // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say)\n re = re_1c;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n w = stem + \"i\";\n }\n\n // Step 2\n re = re_2;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step2list[suffix];\n }\n }\n\n // Step 3\n re = re_3;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step3list[suffix];\n }\n }\n\n // Step 4\n re = re_4;\n re2 = re2_4;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n if (re.test(stem)) {\n w = stem;\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1] + fp[2];\n re2 = re_mgr1;\n if (re2.test(stem)) {\n w = stem;\n }\n }\n\n // Step 5\n re = re_5;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n re2 = re_meq1;\n re3 = re3_5;\n if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {\n w = stem;\n }\n }\n\n re = re_5_1;\n re2 = re_mgr1;\n if (re.test(w) && re2.test(w)) {\n re = re_1b_2;\n w = w.replace(re,\"\");\n }\n\n // and turn initial Y back to y\n\n if (firstch == \"y\") {\n w = firstch.toLowerCase() + w.substr(1);\n }\n\n return w;\n };\n\n return function (token) {\n return token.update(porterStemmer);\n }\n})();\n\nlunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer')\n/*!\n * lunr.stopWordFilter\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.generateStopWordFilter builds a stopWordFilter function from the provided\n * list of stop words.\n *\n * The built in lunr.stopWordFilter is built using this generator and can be used\n * to generate custom stopWordFilters for applications or non English languages.\n *\n * @function\n * @param {Array} token The token to pass through the filter\n * @returns {lunr.PipelineFunction}\n * @see lunr.Pipeline\n * @see lunr.stopWordFilter\n */\nlunr.generateStopWordFilter = function (stopWords) {\n var words = stopWords.reduce(function (memo, stopWord) {\n memo[stopWord] = stopWord\n return memo\n }, {})\n\n return function (token) {\n if (token && words[token.toString()] !== token.toString()) return token\n }\n}\n\n/**\n * lunr.stopWordFilter is an English language stop word list filter, any words\n * contained in the list will not be passed through the filter.\n *\n * This is intended to be used in the Pipeline. If the token does not pass the\n * filter then undefined will be returned.\n *\n * @function\n * @implements {lunr.PipelineFunction}\n * @params {lunr.Token} token - A token to check for being a stop word.\n * @returns {lunr.Token}\n * @see {@link lunr.Pipeline}\n */\nlunr.stopWordFilter = lunr.generateStopWordFilter([\n 'a',\n 'able',\n 'about',\n 'across',\n 'after',\n 'all',\n 'almost',\n 'also',\n 'am',\n 'among',\n 'an',\n 'and',\n 'any',\n 'are',\n 'as',\n 'at',\n 'be',\n 'because',\n 'been',\n 'but',\n 'by',\n 'can',\n 'cannot',\n 'could',\n 'dear',\n 'did',\n 'do',\n 'does',\n 'either',\n 'else',\n 'ever',\n 'every',\n 'for',\n 'from',\n 'get',\n 'got',\n 'had',\n 'has',\n 'have',\n 'he',\n 'her',\n 'hers',\n 'him',\n 'his',\n 'how',\n 'however',\n 'i',\n 'if',\n 'in',\n 'into',\n 'is',\n 'it',\n 'its',\n 'just',\n 'least',\n 'let',\n 'like',\n 'likely',\n 'may',\n 'me',\n 'might',\n 'most',\n 'must',\n 'my',\n 'neither',\n 'no',\n 'nor',\n 'not',\n 'of',\n 'off',\n 'often',\n 'on',\n 'only',\n 'or',\n 'other',\n 'our',\n 'own',\n 'rather',\n 'said',\n 'say',\n 'says',\n 'she',\n 'should',\n 'since',\n 'so',\n 'some',\n 'than',\n 'that',\n 'the',\n 'their',\n 'them',\n 'then',\n 'there',\n 'these',\n 'they',\n 'this',\n 'tis',\n 'to',\n 'too',\n 'twas',\n 'us',\n 'wants',\n 'was',\n 'we',\n 'were',\n 'what',\n 'when',\n 'where',\n 'which',\n 'while',\n 'who',\n 'whom',\n 'why',\n 'will',\n 'with',\n 'would',\n 'yet',\n 'you',\n 'your'\n])\n\nlunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter')\n/*!\n * lunr.trimmer\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.trimmer is a pipeline function for trimming non word\n * characters from the beginning and end of tokens before they\n * enter the index.\n *\n * This implementation may not work correctly for non latin\n * characters and should either be removed or adapted for use\n * with languages with non-latin characters.\n *\n * @static\n * @implements {lunr.PipelineFunction}\n * @param {lunr.Token} token The token to pass through the filter\n * @returns {lunr.Token}\n * @see lunr.Pipeline\n */\nlunr.trimmer = function (token) {\n return token.update(function (s) {\n return s.replace(/^\\W+/, '').replace(/\\W+$/, '')\n })\n}\n\nlunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer')\n/*!\n * lunr.TokenSet\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A token set is used to store the unique list of all tokens\n * within an index. Token sets are also used to represent an\n * incoming query to the index, this query token set and index\n * token set are then intersected to find which tokens to look\n * up in the inverted index.\n *\n * A token set can hold multiple tokens, as in the case of the\n * index token set, or it can hold a single token as in the\n * case of a simple query token set.\n *\n * Additionally token sets are used to perform wildcard matching.\n * Leading, contained and trailing wildcards are supported, and\n * from this edit distance matching can also be provided.\n *\n * Token sets are implemented as a minimal finite state automata,\n * where both common prefixes and suffixes are shared between tokens.\n * This helps to reduce the space used for storing the token set.\n *\n * @constructor\n */\nlunr.TokenSet = function () {\n this.final = false\n this.edges = {}\n this.id = lunr.TokenSet._nextId\n lunr.TokenSet._nextId += 1\n}\n\n/**\n * Keeps track of the next, auto increment, identifier to assign\n * to a new tokenSet.\n *\n * TokenSets require a unique identifier to be correctly minimised.\n *\n * @private\n */\nlunr.TokenSet._nextId = 1\n\n/**\n * Creates a TokenSet instance from the given sorted array of words.\n *\n * @param {String[]} arr - A sorted array of strings to create the set from.\n * @returns {lunr.TokenSet}\n * @throws Will throw an error if the input array is not sorted.\n */\nlunr.TokenSet.fromArray = function (arr) {\n var builder = new lunr.TokenSet.Builder\n\n for (var i = 0, len = arr.length; i < len; i++) {\n builder.insert(arr[i])\n }\n\n builder.finish()\n return builder.root\n}\n\n/**\n * Creates a token set from a query clause.\n *\n * @private\n * @param {Object} clause - A single clause from lunr.Query.\n * @param {string} clause.term - The query clause term.\n * @param {number} [clause.editDistance] - The optional edit distance for the term.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.fromClause = function (clause) {\n if ('editDistance' in clause) {\n return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance)\n } else {\n return lunr.TokenSet.fromString(clause.term)\n }\n}\n\n/**\n * Creates a token set representing a single string with a specified\n * edit distance.\n *\n * Insertions, deletions, substitutions and transpositions are each\n * treated as an edit distance of 1.\n *\n * Increasing the allowed edit distance will have a dramatic impact\n * on the performance of both creating and intersecting these TokenSets.\n * It is advised to keep the edit distance less than 3.\n *\n * @param {string} str - The string to create the token set from.\n * @param {number} editDistance - The allowed edit distance to match.\n * @returns {lunr.Vector}\n */\nlunr.TokenSet.fromFuzzyString = function (str, editDistance) {\n var root = new lunr.TokenSet\n\n var stack = [{\n node: root,\n editsRemaining: editDistance,\n str: str\n }]\n\n while (stack.length) {\n var frame = stack.pop()\n\n // no edit\n if (frame.str.length > 0) {\n var char = frame.str.charAt(0),\n noEditNode\n\n if (char in frame.node.edges) {\n noEditNode = frame.node.edges[char]\n } else {\n noEditNode = new lunr.TokenSet\n frame.node.edges[char] = noEditNode\n }\n\n if (frame.str.length == 1) {\n noEditNode.final = true\n }\n\n stack.push({\n node: noEditNode,\n editsRemaining: frame.editsRemaining,\n str: frame.str.slice(1)\n })\n }\n\n if (frame.editsRemaining == 0) {\n continue\n }\n\n // insertion\n if (\"*\" in frame.node.edges) {\n var insertionNode = frame.node.edges[\"*\"]\n } else {\n var insertionNode = new lunr.TokenSet\n frame.node.edges[\"*\"] = insertionNode\n }\n\n if (frame.str.length == 0) {\n insertionNode.final = true\n }\n\n stack.push({\n node: insertionNode,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str\n })\n\n // deletion\n // can only do a deletion if we have enough edits remaining\n // and if there are characters left to delete in the string\n if (frame.str.length > 1) {\n stack.push({\n node: frame.node,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str.slice(1)\n })\n }\n\n // deletion\n // just removing the last character from the str\n if (frame.str.length == 1) {\n frame.node.final = true\n }\n\n // substitution\n // can only do a substitution if we have enough edits remaining\n // and if there are characters left to substitute\n if (frame.str.length >= 1) {\n if (\"*\" in frame.node.edges) {\n var substitutionNode = frame.node.edges[\"*\"]\n } else {\n var substitutionNode = new lunr.TokenSet\n frame.node.edges[\"*\"] = substitutionNode\n }\n\n if (frame.str.length == 1) {\n substitutionNode.final = true\n }\n\n stack.push({\n node: substitutionNode,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str.slice(1)\n })\n }\n\n // transposition\n // can only do a transposition if there are edits remaining\n // and there are enough characters to transpose\n if (frame.str.length > 1) {\n var charA = frame.str.charAt(0),\n charB = frame.str.charAt(1),\n transposeNode\n\n if (charB in frame.node.edges) {\n transposeNode = frame.node.edges[charB]\n } else {\n transposeNode = new lunr.TokenSet\n frame.node.edges[charB] = transposeNode\n }\n\n if (frame.str.length == 1) {\n transposeNode.final = true\n }\n\n stack.push({\n node: transposeNode,\n editsRemaining: frame.editsRemaining - 1,\n str: charA + frame.str.slice(2)\n })\n }\n }\n\n return root\n}\n\n/**\n * Creates a TokenSet from a string.\n *\n * The string may contain one or more wildcard characters (*)\n * that will allow wildcard matching when intersecting with\n * another TokenSet.\n *\n * @param {string} str - The string to create a TokenSet from.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.fromString = function (str) {\n var node = new lunr.TokenSet,\n root = node\n\n /*\n * Iterates through all characters within the passed string\n * appending a node for each character.\n *\n * When a wildcard character is found then a self\n * referencing edge is introduced to continually match\n * any number of any characters.\n */\n for (var i = 0, len = str.length; i < len; i++) {\n var char = str[i],\n final = (i == len - 1)\n\n if (char == \"*\") {\n node.edges[char] = node\n node.final = final\n\n } else {\n var next = new lunr.TokenSet\n next.final = final\n\n node.edges[char] = next\n node = next\n }\n }\n\n return root\n}\n\n/**\n * Converts this TokenSet into an array of strings\n * contained within the TokenSet.\n *\n * This is not intended to be used on a TokenSet that\n * contains wildcards, in these cases the results are\n * undefined and are likely to cause an infinite loop.\n *\n * @returns {string[]}\n */\nlunr.TokenSet.prototype.toArray = function () {\n var words = []\n\n var stack = [{\n prefix: \"\",\n node: this\n }]\n\n while (stack.length) {\n var frame = stack.pop(),\n edges = Object.keys(frame.node.edges),\n len = edges.length\n\n if (frame.node.final) {\n /* In Safari, at this point the prefix is sometimes corrupted, see:\n * https://github.com/olivernn/lunr.js/issues/279 Calling any\n * String.prototype method forces Safari to \"cast\" this string to what\n * it's supposed to be, fixing the bug. */\n frame.prefix.charAt(0)\n words.push(frame.prefix)\n }\n\n for (var i = 0; i < len; i++) {\n var edge = edges[i]\n\n stack.push({\n prefix: frame.prefix.concat(edge),\n node: frame.node.edges[edge]\n })\n }\n }\n\n return words\n}\n\n/**\n * Generates a string representation of a TokenSet.\n *\n * This is intended to allow TokenSets to be used as keys\n * in objects, largely to aid the construction and minimisation\n * of a TokenSet. As such it is not designed to be a human\n * friendly representation of the TokenSet.\n *\n * @returns {string}\n */\nlunr.TokenSet.prototype.toString = function () {\n // NOTE: Using Object.keys here as this.edges is very likely\n // to enter 'hash-mode' with many keys being added\n //\n // avoiding a for-in loop here as it leads to the function\n // being de-optimised (at least in V8). From some simple\n // benchmarks the performance is comparable, but allowing\n // V8 to optimize may mean easy performance wins in the future.\n\n if (this._str) {\n return this._str\n }\n\n var str = this.final ? '1' : '0',\n labels = Object.keys(this.edges).sort(),\n len = labels.length\n\n for (var i = 0; i < len; i++) {\n var label = labels[i],\n node = this.edges[label]\n\n str = str + label + node.id\n }\n\n return str\n}\n\n/**\n * Returns a new TokenSet that is the intersection of\n * this TokenSet and the passed TokenSet.\n *\n * This intersection will take into account any wildcards\n * contained within the TokenSet.\n *\n * @param {lunr.TokenSet} b - An other TokenSet to intersect with.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.prototype.intersect = function (b) {\n var output = new lunr.TokenSet,\n frame = undefined\n\n var stack = [{\n qNode: b,\n output: output,\n node: this\n }]\n\n while (stack.length) {\n frame = stack.pop()\n\n // NOTE: As with the #toString method, we are using\n // Object.keys and a for loop instead of a for-in loop\n // as both of these objects enter 'hash' mode, causing\n // the function to be de-optimised in V8\n var qEdges = Object.keys(frame.qNode.edges),\n qLen = qEdges.length,\n nEdges = Object.keys(frame.node.edges),\n nLen = nEdges.length\n\n for (var q = 0; q < qLen; q++) {\n var qEdge = qEdges[q]\n\n for (var n = 0; n < nLen; n++) {\n var nEdge = nEdges[n]\n\n if (nEdge == qEdge || qEdge == '*') {\n var node = frame.node.edges[nEdge],\n qNode = frame.qNode.edges[qEdge],\n final = node.final && qNode.final,\n next = undefined\n\n if (nEdge in frame.output.edges) {\n // an edge already exists for this character\n // no need to create a new node, just set the finality\n // bit unless this node is already final\n next = frame.output.edges[nEdge]\n next.final = next.final || final\n\n } else {\n // no edge exists yet, must create one\n // set the finality bit and insert it\n // into the output\n next = new lunr.TokenSet\n next.final = final\n frame.output.edges[nEdge] = next\n }\n\n stack.push({\n qNode: qNode,\n output: next,\n node: node\n })\n }\n }\n }\n }\n\n return output\n}\nlunr.TokenSet.Builder = function () {\n this.previousWord = \"\"\n this.root = new lunr.TokenSet\n this.uncheckedNodes = []\n this.minimizedNodes = {}\n}\n\nlunr.TokenSet.Builder.prototype.insert = function (word) {\n var node,\n commonPrefix = 0\n\n if (word < this.previousWord) {\n throw new Error (\"Out of order word insertion\")\n }\n\n for (var i = 0; i < word.length && i < this.previousWord.length; i++) {\n if (word[i] != this.previousWord[i]) break\n commonPrefix++\n }\n\n this.minimize(commonPrefix)\n\n if (this.uncheckedNodes.length == 0) {\n node = this.root\n } else {\n node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child\n }\n\n for (var i = commonPrefix; i < word.length; i++) {\n var nextNode = new lunr.TokenSet,\n char = word[i]\n\n node.edges[char] = nextNode\n\n this.uncheckedNodes.push({\n parent: node,\n char: char,\n child: nextNode\n })\n\n node = nextNode\n }\n\n node.final = true\n this.previousWord = word\n}\n\nlunr.TokenSet.Builder.prototype.finish = function () {\n this.minimize(0)\n}\n\nlunr.TokenSet.Builder.prototype.minimize = function (downTo) {\n for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) {\n var node = this.uncheckedNodes[i],\n childKey = node.child.toString()\n\n if (childKey in this.minimizedNodes) {\n node.parent.edges[node.char] = this.minimizedNodes[childKey]\n } else {\n // Cache the key for this node since\n // we know it can't change anymore\n node.child._str = childKey\n\n this.minimizedNodes[childKey] = node.child\n }\n\n this.uncheckedNodes.pop()\n }\n}\n/*!\n * lunr.Index\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * An index contains the built index of all documents and provides a query interface\n * to the index.\n *\n * Usually instances of lunr.Index will not be created using this constructor, instead\n * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be\n * used to load previously built and serialized indexes.\n *\n * @constructor\n * @param {Object} attrs - The attributes of the built search index.\n * @param {Object} attrs.invertedIndex - An index of term/field to document reference.\n * @param {Object} attrs.fieldVectors - Field vectors\n * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens.\n * @param {string[]} attrs.fields - The names of indexed document fields.\n * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms.\n */\nlunr.Index = function (attrs) {\n this.invertedIndex = attrs.invertedIndex\n this.fieldVectors = attrs.fieldVectors\n this.tokenSet = attrs.tokenSet\n this.fields = attrs.fields\n this.pipeline = attrs.pipeline\n}\n\n/**\n * A result contains details of a document matching a search query.\n * @typedef {Object} lunr.Index~Result\n * @property {string} ref - The reference of the document this result represents.\n * @property {number} score - A number between 0 and 1 representing how similar this document is to the query.\n * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match.\n */\n\n/**\n * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple\n * query language which itself is parsed into an instance of lunr.Query.\n *\n * For programmatically building queries it is advised to directly use lunr.Query, the query language\n * is best used for human entered text rather than program generated text.\n *\n * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported\n * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello'\n * or 'world', though those that contain both will rank higher in the results.\n *\n * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can\n * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding\n * wildcards will increase the number of documents that will be found but can also have a negative\n * impact on query performance, especially with wildcards at the beginning of a term.\n *\n * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term\n * hello in the title field will match this query. Using a field not present in the index will lead\n * to an error being thrown.\n *\n * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term\n * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported\n * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2.\n * Avoid large values for edit distance to improve query performance.\n *\n * Each term also supports a presence modifier. By default a term's presence in document is optional, however\n * this can be changed to either required or prohibited. For a term's presence to be required in a document the\n * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and\n * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not\n * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'.\n *\n * To escape special characters the backslash character '\\' can be used, this allows searches to include\n * characters that would normally be considered modifiers, e.g. `foo\\~2` will search for a term \"foo~2\" instead\n * of attempting to apply a boost of 2 to the search term \"foo\".\n *\n * @typedef {string} lunr.Index~QueryString\n * @example Simple single term query\n * hello\n * @example Multiple term query\n * hello world\n * @example term scoped to a field\n * title:hello\n * @example term with a boost of 10\n * hello^10\n * @example term with an edit distance of 2\n * hello~2\n * @example terms with presence modifiers\n * -foo +bar baz\n */\n\n/**\n * Performs a search against the index using lunr query syntax.\n *\n * Results will be returned sorted by their score, the most relevant results\n * will be returned first. For details on how the score is calculated, please see\n * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}.\n *\n * For more programmatic querying use lunr.Index#query.\n *\n * @param {lunr.Index~QueryString} queryString - A string containing a lunr query.\n * @throws {lunr.QueryParseError} If the passed query string cannot be parsed.\n * @returns {lunr.Index~Result[]}\n */\nlunr.Index.prototype.search = function (queryString) {\n return this.query(function (query) {\n var parser = new lunr.QueryParser(queryString, query)\n parser.parse()\n })\n}\n\n/**\n * A query builder callback provides a query object to be used to express\n * the query to perform on the index.\n *\n * @callback lunr.Index~queryBuilder\n * @param {lunr.Query} query - The query object to build up.\n * @this lunr.Query\n */\n\n/**\n * Performs a query against the index using the yielded lunr.Query object.\n *\n * If performing programmatic queries against the index, this method is preferred\n * over lunr.Index#search so as to avoid the additional query parsing overhead.\n *\n * A query object is yielded to the supplied function which should be used to\n * express the query to be run against the index.\n *\n * Note that although this function takes a callback parameter it is _not_ an\n * asynchronous operation, the callback is just yielded a query object to be\n * customized.\n *\n * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query.\n * @returns {lunr.Index~Result[]}\n */\nlunr.Index.prototype.query = function (fn) {\n // for each query clause\n // * process terms\n // * expand terms from token set\n // * find matching documents and metadata\n // * get document vectors\n // * score documents\n\n var query = new lunr.Query(this.fields),\n matchingFields = Object.create(null),\n queryVectors = Object.create(null),\n termFieldCache = Object.create(null),\n requiredMatches = Object.create(null),\n prohibitedMatches = Object.create(null)\n\n /*\n * To support field level boosts a query vector is created per\n * field. An empty vector is eagerly created to support negated\n * queries.\n */\n for (var i = 0; i < this.fields.length; i++) {\n queryVectors[this.fields[i]] = new lunr.Vector\n }\n\n fn.call(query, query)\n\n for (var i = 0; i < query.clauses.length; i++) {\n /*\n * Unless the pipeline has been disabled for this term, which is\n * the case for terms with wildcards, we need to pass the clause\n * term through the search pipeline. A pipeline returns an array\n * of processed terms. Pipeline functions may expand the passed\n * term, which means we may end up performing multiple index lookups\n * for a single query term.\n */\n var clause = query.clauses[i],\n terms = null,\n clauseMatches = lunr.Set.empty\n\n if (clause.usePipeline) {\n terms = this.pipeline.runString(clause.term, {\n fields: clause.fields\n })\n } else {\n terms = [clause.term]\n }\n\n for (var m = 0; m < terms.length; m++) {\n var term = terms[m]\n\n /*\n * Each term returned from the pipeline needs to use the same query\n * clause object, e.g. the same boost and or edit distance. The\n * simplest way to do this is to re-use the clause object but mutate\n * its term property.\n */\n clause.term = term\n\n /*\n * From the term in the clause we create a token set which will then\n * be used to intersect the indexes token set to get a list of terms\n * to lookup in the inverted index\n */\n var termTokenSet = lunr.TokenSet.fromClause(clause),\n expandedTerms = this.tokenSet.intersect(termTokenSet).toArray()\n\n /*\n * If a term marked as required does not exist in the tokenSet it is\n * impossible for the search to return any matches. We set all the field\n * scoped required matches set to empty and stop examining any further\n * clauses.\n */\n if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) {\n for (var k = 0; k < clause.fields.length; k++) {\n var field = clause.fields[k]\n requiredMatches[field] = lunr.Set.empty\n }\n\n break\n }\n\n for (var j = 0; j < expandedTerms.length; j++) {\n /*\n * For each term get the posting and termIndex, this is required for\n * building the query vector.\n */\n var expandedTerm = expandedTerms[j],\n posting = this.invertedIndex[expandedTerm],\n termIndex = posting._index\n\n for (var k = 0; k < clause.fields.length; k++) {\n /*\n * For each field that this query term is scoped by (by default\n * all fields are in scope) we need to get all the document refs\n * that have this term in that field.\n *\n * The posting is the entry in the invertedIndex for the matching\n * term from above.\n */\n var field = clause.fields[k],\n fieldPosting = posting[field],\n matchingDocumentRefs = Object.keys(fieldPosting),\n termField = expandedTerm + \"/\" + field,\n matchingDocumentsSet = new lunr.Set(matchingDocumentRefs)\n\n /*\n * if the presence of this term is required ensure that the matching\n * documents are added to the set of required matches for this clause.\n *\n */\n if (clause.presence == lunr.Query.presence.REQUIRED) {\n clauseMatches = clauseMatches.union(matchingDocumentsSet)\n\n if (requiredMatches[field] === undefined) {\n requiredMatches[field] = lunr.Set.complete\n }\n }\n\n /*\n * if the presence of this term is prohibited ensure that the matching\n * documents are added to the set of prohibited matches for this field,\n * creating that set if it does not yet exist.\n */\n if (clause.presence == lunr.Query.presence.PROHIBITED) {\n if (prohibitedMatches[field] === undefined) {\n prohibitedMatches[field] = lunr.Set.empty\n }\n\n prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet)\n\n /*\n * Prohibited matches should not be part of the query vector used for\n * similarity scoring and no metadata should be extracted so we continue\n * to the next field\n */\n continue\n }\n\n /*\n * The query field vector is populated using the termIndex found for\n * the term and a unit value with the appropriate boost applied.\n * Using upsert because there could already be an entry in the vector\n * for the term we are working with. In that case we just add the scores\n * together.\n */\n queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b })\n\n /**\n * If we've already seen this term, field combo then we've already collected\n * the matching documents and metadata, no need to go through all that again\n */\n if (termFieldCache[termField]) {\n continue\n }\n\n for (var l = 0; l < matchingDocumentRefs.length; l++) {\n /*\n * All metadata for this term/field/document triple\n * are then extracted and collected into an instance\n * of lunr.MatchData ready to be returned in the query\n * results\n */\n var matchingDocumentRef = matchingDocumentRefs[l],\n matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field),\n metadata = fieldPosting[matchingDocumentRef],\n fieldMatch\n\n if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) {\n matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata)\n } else {\n fieldMatch.add(expandedTerm, field, metadata)\n }\n\n }\n\n termFieldCache[termField] = true\n }\n }\n }\n\n /**\n * If the presence was required we need to update the requiredMatches field sets.\n * We do this after all fields for the term have collected their matches because\n * the clause terms presence is required in _any_ of the fields not _all_ of the\n * fields.\n */\n if (clause.presence === lunr.Query.presence.REQUIRED) {\n for (var k = 0; k < clause.fields.length; k++) {\n var field = clause.fields[k]\n requiredMatches[field] = requiredMatches[field].intersect(clauseMatches)\n }\n }\n }\n\n /**\n * Need to combine the field scoped required and prohibited\n * matching documents into a global set of required and prohibited\n * matches\n */\n var allRequiredMatches = lunr.Set.complete,\n allProhibitedMatches = lunr.Set.empty\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i]\n\n if (requiredMatches[field]) {\n allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field])\n }\n\n if (prohibitedMatches[field]) {\n allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field])\n }\n }\n\n var matchingFieldRefs = Object.keys(matchingFields),\n results = [],\n matches = Object.create(null)\n\n /*\n * If the query is negated (contains only prohibited terms)\n * we need to get _all_ fieldRefs currently existing in the\n * index. This is only done when we know that the query is\n * entirely prohibited terms to avoid any cost of getting all\n * fieldRefs unnecessarily.\n *\n * Additionally, blank MatchData must be created to correctly\n * populate the results.\n */\n if (query.isNegated()) {\n matchingFieldRefs = Object.keys(this.fieldVectors)\n\n for (var i = 0; i < matchingFieldRefs.length; i++) {\n var matchingFieldRef = matchingFieldRefs[i]\n var fieldRef = lunr.FieldRef.fromString(matchingFieldRef)\n matchingFields[matchingFieldRef] = new lunr.MatchData\n }\n }\n\n for (var i = 0; i < matchingFieldRefs.length; i++) {\n /*\n * Currently we have document fields that match the query, but we\n * need to return documents. The matchData and scores are combined\n * from multiple fields belonging to the same document.\n *\n * Scores are calculated by field, using the query vectors created\n * above, and combined into a final document score using addition.\n */\n var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]),\n docRef = fieldRef.docRef\n\n if (!allRequiredMatches.contains(docRef)) {\n continue\n }\n\n if (allProhibitedMatches.contains(docRef)) {\n continue\n }\n\n var fieldVector = this.fieldVectors[fieldRef],\n score = queryVectors[fieldRef.fieldName].similarity(fieldVector),\n docMatch\n\n if ((docMatch = matches[docRef]) !== undefined) {\n docMatch.score += score\n docMatch.matchData.combine(matchingFields[fieldRef])\n } else {\n var match = {\n ref: docRef,\n score: score,\n matchData: matchingFields[fieldRef]\n }\n matches[docRef] = match\n results.push(match)\n }\n }\n\n /*\n * Sort the results objects by score, highest first.\n */\n return results.sort(function (a, b) {\n return b.score - a.score\n })\n}\n\n/**\n * Prepares the index for JSON serialization.\n *\n * The schema for this JSON blob will be described in a\n * separate JSON schema file.\n *\n * @returns {Object}\n */\nlunr.Index.prototype.toJSON = function () {\n var invertedIndex = Object.keys(this.invertedIndex)\n .sort()\n .map(function (term) {\n return [term, this.invertedIndex[term]]\n }, this)\n\n var fieldVectors = Object.keys(this.fieldVectors)\n .map(function (ref) {\n return [ref, this.fieldVectors[ref].toJSON()]\n }, this)\n\n return {\n version: lunr.version,\n fields: this.fields,\n fieldVectors: fieldVectors,\n invertedIndex: invertedIndex,\n pipeline: this.pipeline.toJSON()\n }\n}\n\n/**\n * Loads a previously serialized lunr.Index\n *\n * @param {Object} serializedIndex - A previously serialized lunr.Index\n * @returns {lunr.Index}\n */\nlunr.Index.load = function (serializedIndex) {\n var attrs = {},\n fieldVectors = {},\n serializedVectors = serializedIndex.fieldVectors,\n invertedIndex = Object.create(null),\n serializedInvertedIndex = serializedIndex.invertedIndex,\n tokenSetBuilder = new lunr.TokenSet.Builder,\n pipeline = lunr.Pipeline.load(serializedIndex.pipeline)\n\n if (serializedIndex.version != lunr.version) {\n lunr.utils.warn(\"Version mismatch when loading serialised index. Current version of lunr '\" + lunr.version + \"' does not match serialized index '\" + serializedIndex.version + \"'\")\n }\n\n for (var i = 0; i < serializedVectors.length; i++) {\n var tuple = serializedVectors[i],\n ref = tuple[0],\n elements = tuple[1]\n\n fieldVectors[ref] = new lunr.Vector(elements)\n }\n\n for (var i = 0; i < serializedInvertedIndex.length; i++) {\n var tuple = serializedInvertedIndex[i],\n term = tuple[0],\n posting = tuple[1]\n\n tokenSetBuilder.insert(term)\n invertedIndex[term] = posting\n }\n\n tokenSetBuilder.finish()\n\n attrs.fields = serializedIndex.fields\n\n attrs.fieldVectors = fieldVectors\n attrs.invertedIndex = invertedIndex\n attrs.tokenSet = tokenSetBuilder.root\n attrs.pipeline = pipeline\n\n return new lunr.Index(attrs)\n}\n/*!\n * lunr.Builder\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.Builder performs indexing on a set of documents and\n * returns instances of lunr.Index ready for querying.\n *\n * All configuration of the index is done via the builder, the\n * fields to index, the document reference, the text processing\n * pipeline and document scoring parameters are all set on the\n * builder before indexing.\n *\n * @constructor\n * @property {string} _ref - Internal reference to the document reference field.\n * @property {string[]} _fields - Internal reference to the document fields to index.\n * @property {object} invertedIndex - The inverted index maps terms to document fields.\n * @property {object} documentTermFrequencies - Keeps track of document term frequencies.\n * @property {object} documentLengths - Keeps track of the length of documents added to the index.\n * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing.\n * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing.\n * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index.\n * @property {number} documentCount - Keeps track of the total number of documents indexed.\n * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75.\n * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2.\n * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space.\n * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index.\n */\nlunr.Builder = function () {\n this._ref = \"id\"\n this._fields = Object.create(null)\n this._documents = Object.create(null)\n this.invertedIndex = Object.create(null)\n this.fieldTermFrequencies = {}\n this.fieldLengths = {}\n this.tokenizer = lunr.tokenizer\n this.pipeline = new lunr.Pipeline\n this.searchPipeline = new lunr.Pipeline\n this.documentCount = 0\n this._b = 0.75\n this._k1 = 1.2\n this.termIndex = 0\n this.metadataWhitelist = []\n}\n\n/**\n * Sets the document field used as the document reference. Every document must have this field.\n * The type of this field in the document should be a string, if it is not a string it will be\n * coerced into a string by calling toString.\n *\n * The default ref is 'id'.\n *\n * The ref should _not_ be changed during indexing, it should be set before any documents are\n * added to the index. Changing it during indexing can lead to inconsistent results.\n *\n * @param {string} ref - The name of the reference field in the document.\n */\nlunr.Builder.prototype.ref = function (ref) {\n this._ref = ref\n}\n\n/**\n * A function that is used to extract a field from a document.\n *\n * Lunr expects a field to be at the top level of a document, if however the field\n * is deeply nested within a document an extractor function can be used to extract\n * the right field for indexing.\n *\n * @callback fieldExtractor\n * @param {object} doc - The document being added to the index.\n * @returns {?(string|object|object[])} obj - The object that will be indexed for this field.\n * @example Extracting a nested field\n * function (doc) { return doc.nested.field }\n */\n\n/**\n * Adds a field to the list of document fields that will be indexed. Every document being\n * indexed should have this field. Null values for this field in indexed documents will\n * not cause errors but will limit the chance of that document being retrieved by searches.\n *\n * All fields should be added before adding documents to the index. Adding fields after\n * a document has been indexed will have no effect on already indexed documents.\n *\n * Fields can be boosted at build time. This allows terms within that field to have more\n * importance when ranking search results. Use a field boost to specify that matches within\n * one field are more important than other fields.\n *\n * @param {string} fieldName - The name of a field to index in all documents.\n * @param {object} attributes - Optional attributes associated with this field.\n * @param {number} [attributes.boost=1] - Boost applied to all terms within this field.\n * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document.\n * @throws {RangeError} fieldName cannot contain unsupported characters '/'\n */\nlunr.Builder.prototype.field = function (fieldName, attributes) {\n if (/\\//.test(fieldName)) {\n throw new RangeError (\"Field '\" + fieldName + \"' contains illegal character '/'\")\n }\n\n this._fields[fieldName] = attributes || {}\n}\n\n/**\n * A parameter to tune the amount of field length normalisation that is applied when\n * calculating relevance scores. A value of 0 will completely disable any normalisation\n * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b\n * will be clamped to the range 0 - 1.\n *\n * @param {number} number - The value to set for this tuning parameter.\n */\nlunr.Builder.prototype.b = function (number) {\n if (number < 0) {\n this._b = 0\n } else if (number > 1) {\n this._b = 1\n } else {\n this._b = number\n }\n}\n\n/**\n * A parameter that controls the speed at which a rise in term frequency results in term\n * frequency saturation. The default value is 1.2. Setting this to a higher value will give\n * slower saturation levels, a lower value will result in quicker saturation.\n *\n * @param {number} number - The value to set for this tuning parameter.\n */\nlunr.Builder.prototype.k1 = function (number) {\n this._k1 = number\n}\n\n/**\n * Adds a document to the index.\n *\n * Before adding fields to the index the index should have been fully setup, with the document\n * ref and all fields to index already having been specified.\n *\n * The document must have a field name as specified by the ref (by default this is 'id') and\n * it should have all fields defined for indexing, though null or undefined values will not\n * cause errors.\n *\n * Entire documents can be boosted at build time. Applying a boost to a document indicates that\n * this document should rank higher in search results than other documents.\n *\n * @param {object} doc - The document to add to the index.\n * @param {object} attributes - Optional attributes associated with this document.\n * @param {number} [attributes.boost=1] - Boost applied to all terms within this document.\n */\nlunr.Builder.prototype.add = function (doc, attributes) {\n var docRef = doc[this._ref],\n fields = Object.keys(this._fields)\n\n this._documents[docRef] = attributes || {}\n this.documentCount += 1\n\n for (var i = 0; i < fields.length; i++) {\n var fieldName = fields[i],\n extractor = this._fields[fieldName].extractor,\n field = extractor ? extractor(doc) : doc[fieldName],\n tokens = this.tokenizer(field, {\n fields: [fieldName]\n }),\n terms = this.pipeline.run(tokens),\n fieldRef = new lunr.FieldRef (docRef, fieldName),\n fieldTerms = Object.create(null)\n\n this.fieldTermFrequencies[fieldRef] = fieldTerms\n this.fieldLengths[fieldRef] = 0\n\n // store the length of this field for this document\n this.fieldLengths[fieldRef] += terms.length\n\n // calculate term frequencies for this field\n for (var j = 0; j < terms.length; j++) {\n var term = terms[j]\n\n if (fieldTerms[term] == undefined) {\n fieldTerms[term] = 0\n }\n\n fieldTerms[term] += 1\n\n // add to inverted index\n // create an initial posting if one doesn't exist\n if (this.invertedIndex[term] == undefined) {\n var posting = Object.create(null)\n posting[\"_index\"] = this.termIndex\n this.termIndex += 1\n\n for (var k = 0; k < fields.length; k++) {\n posting[fields[k]] = Object.create(null)\n }\n\n this.invertedIndex[term] = posting\n }\n\n // add an entry for this term/fieldName/docRef to the invertedIndex\n if (this.invertedIndex[term][fieldName][docRef] == undefined) {\n this.invertedIndex[term][fieldName][docRef] = Object.create(null)\n }\n\n // store all whitelisted metadata about this token in the\n // inverted index\n for (var l = 0; l < this.metadataWhitelist.length; l++) {\n var metadataKey = this.metadataWhitelist[l],\n metadata = term.metadata[metadataKey]\n\n if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) {\n this.invertedIndex[term][fieldName][docRef][metadataKey] = []\n }\n\n this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata)\n }\n }\n\n }\n}\n\n/**\n * Calculates the average document length for this index\n *\n * @private\n */\nlunr.Builder.prototype.calculateAverageFieldLengths = function () {\n\n var fieldRefs = Object.keys(this.fieldLengths),\n numberOfFields = fieldRefs.length,\n accumulator = {},\n documentsWithField = {}\n\n for (var i = 0; i < numberOfFields; i++) {\n var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),\n field = fieldRef.fieldName\n\n documentsWithField[field] || (documentsWithField[field] = 0)\n documentsWithField[field] += 1\n\n accumulator[field] || (accumulator[field] = 0)\n accumulator[field] += this.fieldLengths[fieldRef]\n }\n\n var fields = Object.keys(this._fields)\n\n for (var i = 0; i < fields.length; i++) {\n var fieldName = fields[i]\n accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName]\n }\n\n this.averageFieldLength = accumulator\n}\n\n/**\n * Builds a vector space model of every document using lunr.Vector\n *\n * @private\n */\nlunr.Builder.prototype.createFieldVectors = function () {\n var fieldVectors = {},\n fieldRefs = Object.keys(this.fieldTermFrequencies),\n fieldRefsLength = fieldRefs.length,\n termIdfCache = Object.create(null)\n\n for (var i = 0; i < fieldRefsLength; i++) {\n var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),\n fieldName = fieldRef.fieldName,\n fieldLength = this.fieldLengths[fieldRef],\n fieldVector = new lunr.Vector,\n termFrequencies = this.fieldTermFrequencies[fieldRef],\n terms = Object.keys(termFrequencies),\n termsLength = terms.length\n\n\n var fieldBoost = this._fields[fieldName].boost || 1,\n docBoost = this._documents[fieldRef.docRef].boost || 1\n\n for (var j = 0; j < termsLength; j++) {\n var term = terms[j],\n tf = termFrequencies[term],\n termIndex = this.invertedIndex[term]._index,\n idf, score, scoreWithPrecision\n\n if (termIdfCache[term] === undefined) {\n idf = lunr.idf(this.invertedIndex[term], this.documentCount)\n termIdfCache[term] = idf\n } else {\n idf = termIdfCache[term]\n }\n\n score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf)\n score *= fieldBoost\n score *= docBoost\n scoreWithPrecision = Math.round(score * 1000) / 1000\n // Converts 1.23456789 to 1.234.\n // Reducing the precision so that the vectors take up less\n // space when serialised. Doing it now so that they behave\n // the same before and after serialisation. Also, this is\n // the fastest approach to reducing a number's precision in\n // JavaScript.\n\n fieldVector.insert(termIndex, scoreWithPrecision)\n }\n\n fieldVectors[fieldRef] = fieldVector\n }\n\n this.fieldVectors = fieldVectors\n}\n\n/**\n * Creates a token set of all tokens in the index using lunr.TokenSet\n *\n * @private\n */\nlunr.Builder.prototype.createTokenSet = function () {\n this.tokenSet = lunr.TokenSet.fromArray(\n Object.keys(this.invertedIndex).sort()\n )\n}\n\n/**\n * Builds the index, creating an instance of lunr.Index.\n *\n * This completes the indexing process and should only be called\n * once all documents have been added to the index.\n *\n * @returns {lunr.Index}\n */\nlunr.Builder.prototype.build = function () {\n this.calculateAverageFieldLengths()\n this.createFieldVectors()\n this.createTokenSet()\n\n return new lunr.Index({\n invertedIndex: this.invertedIndex,\n fieldVectors: this.fieldVectors,\n tokenSet: this.tokenSet,\n fields: Object.keys(this._fields),\n pipeline: this.searchPipeline\n })\n}\n\n/**\n * Applies a plugin to the index builder.\n *\n * A plugin is a function that is called with the index builder as its context.\n * Plugins can be used to customise or extend the behaviour of the index\n * in some way. A plugin is just a function, that encapsulated the custom\n * behaviour that should be applied when building the index.\n *\n * The plugin function will be called with the index builder as its argument, additional\n * arguments can also be passed when calling use. The function will be called\n * with the index builder as its context.\n *\n * @param {Function} plugin The plugin to apply.\n */\nlunr.Builder.prototype.use = function (fn) {\n var args = Array.prototype.slice.call(arguments, 1)\n args.unshift(this)\n fn.apply(this, args)\n}\n/**\n * Contains and collects metadata about a matching document.\n * A single instance of lunr.MatchData is returned as part of every\n * lunr.Index~Result.\n *\n * @constructor\n * @param {string} term - The term this match data is associated with\n * @param {string} field - The field in which the term was found\n * @param {object} metadata - The metadata recorded about this term in this field\n * @property {object} metadata - A cloned collection of metadata associated with this document.\n * @see {@link lunr.Index~Result}\n */\nlunr.MatchData = function (term, field, metadata) {\n var clonedMetadata = Object.create(null),\n metadataKeys = Object.keys(metadata || {})\n\n // Cloning the metadata to prevent the original\n // being mutated during match data combination.\n // Metadata is kept in an array within the inverted\n // index so cloning the data can be done with\n // Array#slice\n for (var i = 0; i < metadataKeys.length; i++) {\n var key = metadataKeys[i]\n clonedMetadata[key] = metadata[key].slice()\n }\n\n this.metadata = Object.create(null)\n\n if (term !== undefined) {\n this.metadata[term] = Object.create(null)\n this.metadata[term][field] = clonedMetadata\n }\n}\n\n/**\n * An instance of lunr.MatchData will be created for every term that matches a\n * document. However only one instance is required in a lunr.Index~Result. This\n * method combines metadata from another instance of lunr.MatchData with this\n * objects metadata.\n *\n * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one.\n * @see {@link lunr.Index~Result}\n */\nlunr.MatchData.prototype.combine = function (otherMatchData) {\n var terms = Object.keys(otherMatchData.metadata)\n\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i],\n fields = Object.keys(otherMatchData.metadata[term])\n\n if (this.metadata[term] == undefined) {\n this.metadata[term] = Object.create(null)\n }\n\n for (var j = 0; j < fields.length; j++) {\n var field = fields[j],\n keys = Object.keys(otherMatchData.metadata[term][field])\n\n if (this.metadata[term][field] == undefined) {\n this.metadata[term][field] = Object.create(null)\n }\n\n for (var k = 0; k < keys.length; k++) {\n var key = keys[k]\n\n if (this.metadata[term][field][key] == undefined) {\n this.metadata[term][field][key] = otherMatchData.metadata[term][field][key]\n } else {\n this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key])\n }\n\n }\n }\n }\n}\n\n/**\n * Add metadata for a term/field pair to this instance of match data.\n *\n * @param {string} term - The term this match data is associated with\n * @param {string} field - The field in which the term was found\n * @param {object} metadata - The metadata recorded about this term in this field\n */\nlunr.MatchData.prototype.add = function (term, field, metadata) {\n if (!(term in this.metadata)) {\n this.metadata[term] = Object.create(null)\n this.metadata[term][field] = metadata\n return\n }\n\n if (!(field in this.metadata[term])) {\n this.metadata[term][field] = metadata\n return\n }\n\n var metadataKeys = Object.keys(metadata)\n\n for (var i = 0; i < metadataKeys.length; i++) {\n var key = metadataKeys[i]\n\n if (key in this.metadata[term][field]) {\n this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key])\n } else {\n this.metadata[term][field][key] = metadata[key]\n }\n }\n}\n/**\n * A lunr.Query provides a programmatic way of defining queries to be performed\n * against a {@link lunr.Index}.\n *\n * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method\n * so the query object is pre-initialized with the right index fields.\n *\n * @constructor\n * @property {lunr.Query~Clause[]} clauses - An array of query clauses.\n * @property {string[]} allFields - An array of all available fields in a lunr.Index.\n */\nlunr.Query = function (allFields) {\n this.clauses = []\n this.allFields = allFields\n}\n\n/**\n * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause.\n *\n * This allows wildcards to be added to the beginning and end of a term without having to manually do any string\n * concatenation.\n *\n * The wildcard constants can be bitwise combined to select both leading and trailing wildcards.\n *\n * @constant\n * @default\n * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour\n * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists\n * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists\n * @see lunr.Query~Clause\n * @see lunr.Query#clause\n * @see lunr.Query#term\n * @example query term with trailing wildcard\n * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING })\n * @example query term with leading and trailing wildcard\n * query.term('foo', {\n * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING\n * })\n */\n\nlunr.Query.wildcard = new String (\"*\")\nlunr.Query.wildcard.NONE = 0\nlunr.Query.wildcard.LEADING = 1\nlunr.Query.wildcard.TRAILING = 2\n\n/**\n * Constants for indicating what kind of presence a term must have in matching documents.\n *\n * @constant\n * @enum {number}\n * @see lunr.Query~Clause\n * @see lunr.Query#clause\n * @see lunr.Query#term\n * @example query term with required presence\n * query.term('foo', { presence: lunr.Query.presence.REQUIRED })\n */\nlunr.Query.presence = {\n /**\n * Term's presence in a document is optional, this is the default value.\n */\n OPTIONAL: 1,\n\n /**\n * Term's presence in a document is required, documents that do not contain\n * this term will not be returned.\n */\n REQUIRED: 2,\n\n /**\n * Term's presence in a document is prohibited, documents that do contain\n * this term will not be returned.\n */\n PROHIBITED: 3\n}\n\n/**\n * A single clause in a {@link lunr.Query} contains a term and details on how to\n * match that term against a {@link lunr.Index}.\n *\n * @typedef {Object} lunr.Query~Clause\n * @property {string[]} fields - The fields in an index this clause should be matched against.\n * @property {number} [boost=1] - Any boost that should be applied when matching this clause.\n * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be.\n * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline.\n * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended.\n * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents.\n */\n\n/**\n * Adds a {@link lunr.Query~Clause} to this query.\n *\n * Unless the clause contains the fields to be matched all fields will be matched. In addition\n * a default boost of 1 is applied to the clause.\n *\n * @param {lunr.Query~Clause} clause - The clause to add to this query.\n * @see lunr.Query~Clause\n * @returns {lunr.Query}\n */\nlunr.Query.prototype.clause = function (clause) {\n if (!('fields' in clause)) {\n clause.fields = this.allFields\n }\n\n if (!('boost' in clause)) {\n clause.boost = 1\n }\n\n if (!('usePipeline' in clause)) {\n clause.usePipeline = true\n }\n\n if (!('wildcard' in clause)) {\n clause.wildcard = lunr.Query.wildcard.NONE\n }\n\n if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) {\n clause.term = \"*\" + clause.term\n }\n\n if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) {\n clause.term = \"\" + clause.term + \"*\"\n }\n\n if (!('presence' in clause)) {\n clause.presence = lunr.Query.presence.OPTIONAL\n }\n\n this.clauses.push(clause)\n\n return this\n}\n\n/**\n * A negated query is one in which every clause has a presence of\n * prohibited. These queries require some special processing to return\n * the expected results.\n *\n * @returns boolean\n */\nlunr.Query.prototype.isNegated = function () {\n for (var i = 0; i < this.clauses.length; i++) {\n if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause}\n * to the list of clauses that make up this query.\n *\n * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion\n * to a token or token-like string should be done before calling this method.\n *\n * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an\n * array, each term in the array will share the same options.\n *\n * @param {object|object[]} term - The term(s) to add to the query.\n * @param {object} [options] - Any additional properties to add to the query clause.\n * @returns {lunr.Query}\n * @see lunr.Query#clause\n * @see lunr.Query~Clause\n * @example adding a single term to a query\n * query.term(\"foo\")\n * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard\n * query.term(\"foo\", {\n * fields: [\"title\"],\n * boost: 10,\n * wildcard: lunr.Query.wildcard.TRAILING\n * })\n * @example using lunr.tokenizer to convert a string to tokens before using them as terms\n * query.term(lunr.tokenizer(\"foo bar\"))\n */\nlunr.Query.prototype.term = function (term, options) {\n if (Array.isArray(term)) {\n term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this)\n return this\n }\n\n var clause = options || {}\n clause.term = term.toString()\n\n this.clause(clause)\n\n return this\n}\nlunr.QueryParseError = function (message, start, end) {\n this.name = \"QueryParseError\"\n this.message = message\n this.start = start\n this.end = end\n}\n\nlunr.QueryParseError.prototype = new Error\nlunr.QueryLexer = function (str) {\n this.lexemes = []\n this.str = str\n this.length = str.length\n this.pos = 0\n this.start = 0\n this.escapeCharPositions = []\n}\n\nlunr.QueryLexer.prototype.run = function () {\n var state = lunr.QueryLexer.lexText\n\n while (state) {\n state = state(this)\n }\n}\n\nlunr.QueryLexer.prototype.sliceString = function () {\n var subSlices = [],\n sliceStart = this.start,\n sliceEnd = this.pos\n\n for (var i = 0; i < this.escapeCharPositions.length; i++) {\n sliceEnd = this.escapeCharPositions[i]\n subSlices.push(this.str.slice(sliceStart, sliceEnd))\n sliceStart = sliceEnd + 1\n }\n\n subSlices.push(this.str.slice(sliceStart, this.pos))\n this.escapeCharPositions.length = 0\n\n return subSlices.join('')\n}\n\nlunr.QueryLexer.prototype.emit = function (type) {\n this.lexemes.push({\n type: type,\n str: this.sliceString(),\n start: this.start,\n end: this.pos\n })\n\n this.start = this.pos\n}\n\nlunr.QueryLexer.prototype.escapeCharacter = function () {\n this.escapeCharPositions.push(this.pos - 1)\n this.pos += 1\n}\n\nlunr.QueryLexer.prototype.next = function () {\n if (this.pos >= this.length) {\n return lunr.QueryLexer.EOS\n }\n\n var char = this.str.charAt(this.pos)\n this.pos += 1\n return char\n}\n\nlunr.QueryLexer.prototype.width = function () {\n return this.pos - this.start\n}\n\nlunr.QueryLexer.prototype.ignore = function () {\n if (this.start == this.pos) {\n this.pos += 1\n }\n\n this.start = this.pos\n}\n\nlunr.QueryLexer.prototype.backup = function () {\n this.pos -= 1\n}\n\nlunr.QueryLexer.prototype.acceptDigitRun = function () {\n var char, charCode\n\n do {\n char = this.next()\n charCode = char.charCodeAt(0)\n } while (charCode > 47 && charCode < 58)\n\n if (char != lunr.QueryLexer.EOS) {\n this.backup()\n }\n}\n\nlunr.QueryLexer.prototype.more = function () {\n return this.pos < this.length\n}\n\nlunr.QueryLexer.EOS = 'EOS'\nlunr.QueryLexer.FIELD = 'FIELD'\nlunr.QueryLexer.TERM = 'TERM'\nlunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE'\nlunr.QueryLexer.BOOST = 'BOOST'\nlunr.QueryLexer.PRESENCE = 'PRESENCE'\n\nlunr.QueryLexer.lexField = function (lexer) {\n lexer.backup()\n lexer.emit(lunr.QueryLexer.FIELD)\n lexer.ignore()\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexTerm = function (lexer) {\n if (lexer.width() > 1) {\n lexer.backup()\n lexer.emit(lunr.QueryLexer.TERM)\n }\n\n lexer.ignore()\n\n if (lexer.more()) {\n return lunr.QueryLexer.lexText\n }\n}\n\nlunr.QueryLexer.lexEditDistance = function (lexer) {\n lexer.ignore()\n lexer.acceptDigitRun()\n lexer.emit(lunr.QueryLexer.EDIT_DISTANCE)\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexBoost = function (lexer) {\n lexer.ignore()\n lexer.acceptDigitRun()\n lexer.emit(lunr.QueryLexer.BOOST)\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexEOS = function (lexer) {\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n}\n\n// This matches the separator used when tokenising fields\n// within a document. These should match otherwise it is\n// not possible to search for some tokens within a document.\n//\n// It is possible for the user to change the separator on the\n// tokenizer so it _might_ clash with any other of the special\n// characters already used within the search string, e.g. :.\n//\n// This means that it is possible to change the separator in\n// such a way that makes some words unsearchable using a search\n// string.\nlunr.QueryLexer.termSeparator = lunr.tokenizer.separator\n\nlunr.QueryLexer.lexText = function (lexer) {\n while (true) {\n var char = lexer.next()\n\n if (char == lunr.QueryLexer.EOS) {\n return lunr.QueryLexer.lexEOS\n }\n\n // Escape character is '\\'\n if (char.charCodeAt(0) == 92) {\n lexer.escapeCharacter()\n continue\n }\n\n if (char == \":\") {\n return lunr.QueryLexer.lexField\n }\n\n if (char == \"~\") {\n lexer.backup()\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n return lunr.QueryLexer.lexEditDistance\n }\n\n if (char == \"^\") {\n lexer.backup()\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n return lunr.QueryLexer.lexBoost\n }\n\n // \"+\" indicates term presence is required\n // checking for length to ensure that only\n // leading \"+\" are considered\n if (char == \"+\" && lexer.width() === 1) {\n lexer.emit(lunr.QueryLexer.PRESENCE)\n return lunr.QueryLexer.lexText\n }\n\n // \"-\" indicates term presence is prohibited\n // checking for length to ensure that only\n // leading \"-\" are considered\n if (char == \"-\" && lexer.width() === 1) {\n lexer.emit(lunr.QueryLexer.PRESENCE)\n return lunr.QueryLexer.lexText\n }\n\n if (char.match(lunr.QueryLexer.termSeparator)) {\n return lunr.QueryLexer.lexTerm\n }\n }\n}\n\nlunr.QueryParser = function (str, query) {\n this.lexer = new lunr.QueryLexer (str)\n this.query = query\n this.currentClause = {}\n this.lexemeIdx = 0\n}\n\nlunr.QueryParser.prototype.parse = function () {\n this.lexer.run()\n this.lexemes = this.lexer.lexemes\n\n var state = lunr.QueryParser.parseClause\n\n while (state) {\n state = state(this)\n }\n\n return this.query\n}\n\nlunr.QueryParser.prototype.peekLexeme = function () {\n return this.lexemes[this.lexemeIdx]\n}\n\nlunr.QueryParser.prototype.consumeLexeme = function () {\n var lexeme = this.peekLexeme()\n this.lexemeIdx += 1\n return lexeme\n}\n\nlunr.QueryParser.prototype.nextClause = function () {\n var completedClause = this.currentClause\n this.query.clause(completedClause)\n this.currentClause = {}\n}\n\nlunr.QueryParser.parseClause = function (parser) {\n var lexeme = parser.peekLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n switch (lexeme.type) {\n case lunr.QueryLexer.PRESENCE:\n return lunr.QueryParser.parsePresence\n case lunr.QueryLexer.FIELD:\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expected either a field or a term, found \" + lexeme.type\n\n if (lexeme.str.length >= 1) {\n errorMessage += \" with value '\" + lexeme.str + \"'\"\n }\n\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n}\n\nlunr.QueryParser.parsePresence = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n switch (lexeme.str) {\n case \"-\":\n parser.currentClause.presence = lunr.Query.presence.PROHIBITED\n break\n case \"+\":\n parser.currentClause.presence = lunr.Query.presence.REQUIRED\n break\n default:\n var errorMessage = \"unrecognised presence operator'\" + lexeme.str + \"'\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n var errorMessage = \"expecting term or field, found nothing\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.FIELD:\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expecting term or field, found '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseField = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n if (parser.query.allFields.indexOf(lexeme.str) == -1) {\n var possibleFields = parser.query.allFields.map(function (f) { return \"'\" + f + \"'\" }).join(', '),\n errorMessage = \"unrecognised field '\" + lexeme.str + \"', possible fields: \" + possibleFields\n\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.fields = [lexeme.str]\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n var errorMessage = \"expecting term, found nothing\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expecting term, found '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseTerm = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n parser.currentClause.term = lexeme.str.toLowerCase()\n\n if (lexeme.str.indexOf(\"*\") != -1) {\n parser.currentClause.usePipeline = false\n }\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseEditDistance = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n var editDistance = parseInt(lexeme.str, 10)\n\n if (isNaN(editDistance)) {\n var errorMessage = \"edit distance must be numeric\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.editDistance = editDistance\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseBoost = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n var boost = parseInt(lexeme.str, 10)\n\n if (isNaN(boost)) {\n var errorMessage = \"boost must be numeric\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.boost = boost\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\n /**\n * export the module via AMD, CommonJS or as a browser global\n * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js\n */\n ;(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory)\n } else if (typeof exports === 'object') {\n /**\n * Node. Does not work with strict CommonJS, but\n * only CommonJS-like enviroments that support module.exports,\n * like Node.\n */\n module.exports = factory()\n } else {\n // Browser globals (root is window)\n root.lunr = factory()\n }\n }(this, function () {\n /**\n * Just return a value to define the module export.\n * This example returns an object, but the module\n * can return a function as the exported value.\n */\n return lunr\n }))\n})();\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport lunr from \"lunr\"\n\nimport \"~/polyfills\"\n\nimport { Search, SearchIndexConfig } from \"../../_\"\nimport {\n SearchMessage,\n SearchMessageType\n} from \"../message\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Add support for usage with `iframe-worker` polyfill\n *\n * While `importScripts` is synchronous when executed inside of a web worker,\n * it's not possible to provide a synchronous polyfilled implementation. The\n * cool thing is that awaiting a non-Promise is a noop, so extending the type\n * definition to return a `Promise` shouldn't break anything.\n *\n * @see https://bit.ly/2PjDnXi - GitHub comment\n */\ndeclare global {\n function importScripts(...urls: string[]): Promise | void\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Search index\n */\nlet index: Search\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch (= import) multi-language support through `lunr-languages`\n *\n * This function automatically imports the stemmers necessary to process the\n * languages, which are defined through the search index configuration.\n *\n * If the worker runs inside of an `iframe` (when using `iframe-worker` as\n * a shim), the base URL for the stemmers to be loaded must be determined by\n * searching for the first `script` element with a `src` attribute, which will\n * contain the contents of this script.\n *\n * @param config - Search index configuration\n *\n * @returns Promise resolving with no result\n */\nasync function setupSearchLanguages(\n config: SearchIndexConfig\n): Promise {\n let base = \"../lunr\"\n\n /* Detect `iframe-worker` and fix base URL */\n if (typeof parent !== \"undefined\" && \"IFrameWorker\" in parent) {\n const worker = document.querySelector(\"script[src]\")!\n const [path] = worker.src.split(\"/worker\")\n\n /* Prefix base with path */\n base = base.replace(\"..\", path)\n }\n\n /* Add scripts for languages */\n const scripts = []\n for (const lang of config.lang) {\n switch (lang) {\n\n /* Add segmenter for Japanese */\n case \"ja\":\n scripts.push(`${base}/tinyseg.js`)\n break\n\n /* Add segmenter for Hindi and Thai */\n case \"hi\":\n case \"th\":\n scripts.push(`${base}/wordcut.js`)\n break\n }\n\n /* Add language support */\n if (lang !== \"en\")\n scripts.push(`${base}/min/lunr.${lang}.min.js`)\n }\n\n /* Add multi-language support */\n if (config.lang.length > 1)\n scripts.push(`${base}/min/lunr.multi.min.js`)\n\n /* Load scripts synchronously */\n if (scripts.length)\n await importScripts(\n `${base}/min/lunr.stemmer.support.min.js`,\n ...scripts\n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Message handler\n *\n * @param message - Source message\n *\n * @returns Target message\n */\nexport async function handler(\n message: SearchMessage\n): Promise {\n switch (message.type) {\n\n /* Search setup message */\n case SearchMessageType.SETUP:\n await setupSearchLanguages(message.data.config)\n index = new Search(message.data)\n return {\n type: SearchMessageType.READY\n }\n\n /* Search query message */\n case SearchMessageType.QUERY:\n return {\n type: SearchMessageType.RESULT,\n data: index ? index.search(message.data) : { items: [] }\n }\n\n /* All other messages */\n default:\n throw new TypeError(\"Invalid message type\")\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Worker\n * ------------------------------------------------------------------------- */\n\n/* @ts-expect-error - expose Lunr.js in global scope, or stemmers won't work */\nself.lunr = lunr\n\n/* Handle messages */\naddEventListener(\"message\", async ev => {\n postMessage(await handler(ev.data))\n})\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Polyfills\n * ------------------------------------------------------------------------- */\n\n/* Polyfill `Object.entries` */\nif (!Object.entries)\n Object.entries = function (obj: object) {\n const data: [string, string][] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push([key, obj[key]])\n\n /* Return entries */\n return data\n }\n\n/* Polyfill `Object.values` */\nif (!Object.values)\n Object.values = function (obj: object) {\n const data: string[] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push(obj[key])\n\n /* Return values */\n return data\n }\n\n/* ------------------------------------------------------------------------- */\n\n/* Polyfills for `Element` */\nif (typeof Element !== \"undefined\") {\n\n /* Polyfill `Element.scrollTo` */\n if (!Element.prototype.scrollTo)\n Element.prototype.scrollTo = function (\n x?: ScrollToOptions | number, y?: number\n ): void {\n if (typeof x === \"object\") {\n this.scrollLeft = x.left!\n this.scrollTop = x.top!\n } else {\n this.scrollLeft = x!\n this.scrollTop = y!\n }\n }\n\n /* Polyfill `Element.replaceWith` */\n if (!Element.prototype.replaceWith)\n Element.prototype.replaceWith = function (\n ...nodes: Array\n ): void {\n const parent = this.parentNode\n if (parent) {\n if (nodes.length === 0)\n parent.removeChild(this)\n\n /* Replace children and create text nodes */\n for (let i = nodes.length - 1; i >= 0; i--) {\n let node = nodes[i]\n if (typeof node === \"string\")\n node = document.createTextNode(node)\n else if (node.parentNode)\n node.parentNode.removeChild(node)\n\n /* Replace child or insert before previous sibling */\n if (!i)\n parent.replaceChild(node, this)\n else\n parent.insertBefore(this.previousSibling!, node)\n }\n }\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexDocument } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search document\n */\nexport interface SearchDocument extends SearchIndexDocument {\n parent?: SearchIndexDocument /* Parent article */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search document mapping\n */\nexport type SearchDocumentMap = Map\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search document mapping\n *\n * @param docs - Search index documents\n *\n * @returns Search document map\n */\nexport function setupSearchDocumentMap(\n docs: SearchIndexDocument[]\n): SearchDocumentMap {\n const documents = new Map()\n const parents = new Set()\n for (const doc of docs) {\n const [path, hash] = doc.location.split(\"#\")\n\n /* Extract location, title and tags */\n const location = doc.location\n const title = doc.title\n const tags = doc.tags\n\n /* Escape and cleanup text */\n const text = escapeHTML(doc.text)\n .replace(/\\s+(?=[,.:;!?])/g, \"\")\n .replace(/\\s+/g, \" \")\n\n /* Handle section */\n if (hash) {\n const parent = documents.get(path)!\n\n /* Ignore first section, override article */\n if (!parents.has(parent)) {\n parent.title = doc.title\n parent.text = text\n\n /* Remember that we processed the article */\n parents.add(parent)\n\n /* Add subsequent section */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n parent\n })\n }\n\n /* Add article */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n ...tags && { tags }\n })\n }\n }\n return documents\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexConfig } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search highlight function\n *\n * @param value - Value\n *\n * @returns Highlighted value\n */\nexport type SearchHighlightFn = (value: string) => string\n\n/**\n * Search highlight factory function\n *\n * @param query - Query value\n *\n * @returns Search highlight function\n */\nexport type SearchHighlightFactoryFn = (query: string) => SearchHighlightFn\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search highlighter\n *\n * @param config - Search index configuration\n * @param escape - Whether to escape HTML\n *\n * @returns Search highlight factory function\n */\nexport function setupSearchHighlighter(\n config: SearchIndexConfig, escape: boolean\n): SearchHighlightFactoryFn {\n const separator = new RegExp(config.separator, \"img\")\n const highlight = (_: unknown, data: string, term: string) => {\n return `${data}${term}`\n }\n\n /* Return factory function */\n return (query: string) => {\n query = query\n .replace(/[\\s*+\\-:~^]+/g, \" \")\n .trim()\n\n /* Create search term match expression */\n const match = new RegExp(`(^|${config.separator})(${\n query\n .replace(/[|\\\\{}()[\\]^$+*?.-]/g, \"\\\\$&\")\n .replace(separator, \"|\")\n })`, \"img\")\n\n /* Highlight string value */\n return value => (\n escape\n ? escapeHTML(value)\n : value\n )\n .replace(match, highlight)\n .replace(/<\\/mark>(\\s+)]*>/img, \"$1\")\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search query clause\n */\nexport interface SearchQueryClause {\n presence: lunr.Query.presence /* Clause presence */\n term: string /* Clause term */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search query terms\n */\nexport type SearchQueryTerms = Record\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Parse a search query for analysis\n *\n * @param value - Query value\n *\n * @returns Search query clauses\n */\nexport function parseSearchQuery(\n value: string\n): SearchQueryClause[] {\n const query = new (lunr as any).Query([\"title\", \"text\"])\n const parser = new (lunr as any).QueryParser(value, query)\n\n /* Parse and return query clauses */\n parser.parse()\n return query.clauses\n}\n\n/**\n * Analyze the search query clauses in regard to the search terms found\n *\n * @param query - Search query clauses\n * @param terms - Search terms\n *\n * @returns Search query terms\n */\nexport function getSearchQueryTerms(\n query: SearchQueryClause[], terms: string[]\n): SearchQueryTerms {\n const clauses = new Set(query)\n\n /* Match query clauses against terms */\n const result: SearchQueryTerms = {}\n for (let t = 0; t < terms.length; t++)\n for (const clause of clauses)\n if (terms[t].startsWith(clause.term)) {\n result[clause.term] = true\n clauses.delete(clause)\n }\n\n /* Annotate unmatched non-stopword query clauses */\n for (const clause of clauses)\n if (lunr.stopWordFilter?.(clause.term as any))\n result[clause.term] = false\n\n /* Return query terms */\n return result\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n SearchDocument,\n SearchDocumentMap,\n setupSearchDocumentMap\n} from \"../document\"\nimport {\n SearchHighlightFactoryFn,\n setupSearchHighlighter\n} from \"../highlighter\"\nimport { SearchOptions } from \"../options\"\nimport {\n SearchQueryTerms,\n getSearchQueryTerms,\n parseSearchQuery\n} from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search index configuration\n */\nexport interface SearchIndexConfig {\n lang: string[] /* Search languages */\n separator: string /* Search separator */\n}\n\n/**\n * Search index document\n */\nexport interface SearchIndexDocument {\n location: string /* Document location */\n title: string /* Document title */\n text: string /* Document text */\n tags?: string[] /* Document tags */\n boost?: number /* Document boost */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search index\n *\n * This interfaces describes the format of the `search_index.json` file which\n * is automatically built by the MkDocs search plugin.\n */\nexport interface SearchIndex {\n config: SearchIndexConfig /* Search index configuration */\n docs: SearchIndexDocument[] /* Search index documents */\n options: SearchOptions /* Search options */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search metadata\n */\nexport interface SearchMetadata {\n score: number /* Score (relevance) */\n terms: SearchQueryTerms /* Search query terms */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search result document\n */\nexport type SearchResultDocument = SearchDocument & SearchMetadata\n\n/**\n * Search result item\n */\nexport type SearchResultItem = SearchResultDocument[]\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search result\n */\nexport interface SearchResult {\n items: SearchResultItem[] /* Search result items */\n suggestions?: string[] /* Search suggestions */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Compute the difference of two lists of strings\n *\n * @param a - 1st list of strings\n * @param b - 2nd list of strings\n *\n * @returns Difference\n */\nfunction difference(a: string[], b: string[]): string[] {\n const [x, y] = [new Set(a), new Set(b)]\n return [\n ...new Set([...x].filter(value => !y.has(value)))\n ]\n}\n\n/* ----------------------------------------------------------------------------\n * Class\n * ------------------------------------------------------------------------- */\n\n/**\n * Search index\n */\nexport class Search {\n\n /**\n * Search document mapping\n *\n * A mapping of URLs (including hash fragments) to the actual articles and\n * sections of the documentation. The search document mapping must be created\n * regardless of whether the index was prebuilt or not, as Lunr.js itself\n * only stores the actual index.\n */\n protected documents: SearchDocumentMap\n\n /**\n * Search highlight factory function\n */\n protected highlight: SearchHighlightFactoryFn\n\n /**\n * The underlying Lunr.js search index\n */\n protected index: lunr.Index\n\n /**\n * Search options\n */\n protected options: SearchOptions\n\n /**\n * Create the search integration\n *\n * @param data - Search index\n */\n public constructor({ config, docs, options }: SearchIndex) {\n this.options = options\n\n /* Set up document map and highlighter factory */\n this.documents = setupSearchDocumentMap(docs)\n this.highlight = setupSearchHighlighter(config, false)\n\n /* Set separator for tokenizer */\n lunr.tokenizer.separator = new RegExp(config.separator)\n\n /* Create search index */\n this.index = lunr(function () {\n\n /* Set up multi-language support */\n if (config.lang.length === 1 && config.lang[0] !== \"en\") {\n this.use((lunr as any)[config.lang[0]])\n } else if (config.lang.length > 1) {\n this.use((lunr as any).multiLanguage(...config.lang))\n }\n\n /* Compute functions to be removed from the pipeline */\n const fns = difference([\n \"trimmer\", \"stopWordFilter\", \"stemmer\"\n ], options.pipeline)\n\n /* Remove functions from the pipeline for registered languages */\n for (const lang of config.lang.map(language => (\n language === \"en\" ? lunr : (lunr as any)[language]\n ))) {\n for (const fn of fns) {\n this.pipeline.remove(lang[fn])\n this.searchPipeline.remove(lang[fn])\n }\n }\n\n /* Set up reference */\n this.ref(\"location\")\n\n /* Set up fields */\n this.field(\"title\", { boost: 1e3 })\n this.field(\"text\")\n this.field(\"tags\", { boost: 1e6, extractor: doc => {\n const { tags = [] } = doc as SearchDocument\n return tags.reduce((list, tag) => [\n ...list,\n ...lunr.tokenizer(tag)\n ], [] as lunr.Token[])\n } })\n\n /* Index documents */\n for (const doc of docs)\n this.add(doc, { boost: doc.boost })\n })\n }\n\n /**\n * Search for matching documents\n *\n * The search index which MkDocs provides is divided up into articles, which\n * contain the whole content of the individual pages, and sections, which only\n * contain the contents of the subsections obtained by breaking the individual\n * pages up at `h1` ... `h6`. As there may be many sections on different pages\n * with identical titles (for example within this very project, e.g. \"Usage\"\n * or \"Installation\"), they need to be put into the context of the containing\n * page. For this reason, section results are grouped within their respective\n * articles which are the top-level results that are returned.\n *\n * @param query - Query value\n *\n * @returns Search results\n */\n public search(query: string): SearchResult {\n if (query) {\n try {\n const highlight = this.highlight(query)\n\n /* Parse query to extract clauses for analysis */\n const clauses = parseSearchQuery(query)\n .filter(clause => (\n clause.presence !== lunr.Query.presence.PROHIBITED\n ))\n\n /* Perform search and post-process results */\n const groups = this.index.search(`${query}*`)\n\n /* Apply post-query boosts based on title and search query terms */\n .reduce((item, { ref, score, matchData }) => {\n const document = this.documents.get(ref)\n if (typeof document !== \"undefined\") {\n const { location, title, text, tags, parent } = document\n\n /* Compute and analyze search query terms */\n const terms = getSearchQueryTerms(\n clauses,\n Object.keys(matchData.metadata)\n )\n\n /* Highlight title and text and apply post-query boosts */\n const boost = +!parent + +Object.values(terms).every(t => t)\n item.push({\n location,\n title: highlight(title),\n text: highlight(text),\n ...tags && { tags: tags.map(highlight) },\n score: score * (1 + boost),\n terms\n })\n }\n return item\n }, [])\n\n /* Sort search results again after applying boosts */\n .sort((a, b) => b.score - a.score)\n\n /* Group search results by page */\n .reduce((items, result) => {\n const document = this.documents.get(result.location)\n if (typeof document !== \"undefined\") {\n const ref = \"parent\" in document\n ? document.parent!.location\n : document.location\n items.set(ref, [...items.get(ref) || [], result])\n }\n return items\n }, new Map())\n\n /* Generate search suggestions, if desired */\n let suggestions: string[] | undefined\n if (this.options.suggestions) {\n const titles = this.index.query(builder => {\n for (const clause of clauses)\n builder.term(clause.term, {\n fields: [\"title\"],\n presence: lunr.Query.presence.REQUIRED,\n wildcard: lunr.Query.wildcard.TRAILING\n })\n })\n\n /* Retrieve suggestions for best match */\n suggestions = titles.length\n ? Object.keys(titles[0].matchData.metadata)\n : []\n }\n\n /* Return items and suggestions */\n return {\n items: [...groups.values()],\n ...typeof suggestions !== \"undefined\" && { suggestions }\n }\n\n /* Log errors to console (for now) */\n } catch {\n console.warn(`Invalid query: ${query} \u2013 see https://bit.ly/2s3ChXG`)\n }\n }\n\n /* Return nothing in case of error or empty query */\n return { items: [] }\n }\n}\n"], + "mappings": "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L,CAAI,KACrDD,EAAIC,EAER,CAEA,OAAAG,EAAKP,EACLQ,EAAMzB,EACFwB,EAAG,KAAKJ,CAAC,GAAKK,EAAI,KAAKL,CAAC,IAC1BI,EAAKjB,EACLa,EAAIA,EAAE,QAAQI,EAAG,EAAE,GAKjBD,GAAW,MACbH,EAAIG,EAAQ,YAAY,EAAIH,EAAE,OAAO,CAAC,GAGjCA,CACT,EAEA,OAAO,SAAUhD,EAAO,CACtB,OAAOA,EAAM,OAAO+C,CAAa,CACnC,CACF,EAAG,EAEHpG,EAAK,SAAS,iBAAiBA,EAAK,QAAS,SAAS,EACtD;AAAA;AAAA;AAAA,GAkBAA,EAAK,uBAAyB,SAAU8G,EAAW,CACjD,IAAIC,EAAQD,EAAU,OAAO,SAAU7D,EAAM+D,EAAU,CACrD,OAAA/D,EAAK+D,GAAYA,EACV/D,CACT,EAAG,CAAC,CAAC,EAEL,OAAO,SAAUI,EAAO,CACtB,GAAIA,GAAS0D,EAAM1D,EAAM,SAAS,KAAOA,EAAM,SAAS,EAAG,OAAOA,CACpE,CACF,EAeArD,EAAK,eAAiBA,EAAK,uBAAuB,CAChD,IACA,OACA,QACA,SACA,QACA,MACA,SACA,OACA,KACA,QACA,KACA,MACA,MACA,MACA,KACA,KACA,KACA,UACA,OACA,MACA,KACA,MACA,SACA,QACA,OACA,MACA,KACA,OACA,SACA,OACA,OACA,QACA,MACA,OACA,MACA,MACA,MACA,MACA,OACA,KACA,MACA,OACA,MACA,MACA,MACA,UACA,IACA,KACA,KACA,OACA,KACA,KACA,MACA,OACA,QACA,MACA,OACA,SACA,MACA,KACA,QACA,OACA,OACA,KACA,UACA,KACA,MACA,MACA,KACA,MACA,QACA,KACA,OACA,KACA,QACA,MACA,MACA,SACA,OACA,MACA,OACA,MACA,SACA,QACA,KACA,OACA,OACA,OACA,MACA,QACA,OACA,OACA,QACA,QACA,OACA,OACA,MACA,KACA,MACA,OACA,KACA,QACA,MACA,KACA,OACA,OACA,OACA,QACA,QACA,QACA,MACA,OACA,MACA,OACA,OACA,QACA,MACA,MACA,MACF,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", + "names": ["require_lunr", "__commonJSMin", "exports", "module", "lunr", "config", "builder", "global", "message", "obj", "clone", "keys", "key", "val", "docRef", "fieldName", "stringValue", "s", "n", "fieldRef", "elements", "i", "other", "object", "a", "b", "intersection", "element", "posting", "documentCount", "documentsWithTerm", "x", "str", "metadata", "fn", "t", "len", "tokens", "sliceEnd", "sliceStart", "char", "sliceLength", "tokenMetadata", "label", "isRegistered", "serialised", "pipeline", "fnName", "fns", "existingFn", "newFn", "pos", "stackLength", "memo", "j", "result", "k", "token", "index", "start", "end", "pivotPoint", "pivotIndex", "insertIdx", "position", "sumOfSquares", "elementsLength", "otherVector", "dotProduct", "aLen", "bLen", "aVal", "bVal", "output", "step2list", "step3list", "c", "v", "C", "V", "mgr0", "meq1", "mgr1", "s_v", "re_mgr0", "re_mgr1", "re_meq1", "re_s_v", "re_1a", "re2_1a", "re_1b", "re2_1b", "re_1b_2", "re2_1b_2", "re3_1b_2", "re4_1b_2", "re_1c", "re_2", "re_3", "re_4", "re2_4", "re_5", "re_5_1", "re3_5", "porterStemmer", "w", "stem", "suffix", "firstch", "re", "re2", "re3", "re4", "fp", "stopWords", "words", "stopWord", "arr", "clause", "editDistance", "root", "stack", "frame", "noEditNode", "insertionNode", "substitutionNode", "charA", "charB", "transposeNode", "node", "final", "next", "edges", "edge", "labels", "qEdges", "qLen", "nEdges", "nLen", "q", "qEdge", "nEdge", "qNode", "word", "commonPrefix", "nextNode", "downTo", "childKey", "attrs", "queryString", "query", "parser", "matchingFields", "queryVectors", "termFieldCache", "requiredMatches", "prohibitedMatches", "terms", "clauseMatches", "m", "term", "termTokenSet", "expandedTerms", "field", "expandedTerm", "termIndex", "fieldPosting", "matchingDocumentRefs", "termField", "matchingDocumentsSet", "l", "matchingDocumentRef", "matchingFieldRef", "fieldMatch", "allRequiredMatches", "allProhibitedMatches", "matchingFieldRefs", "results", "matches", "fieldVector", "score", "docMatch", "match", "invertedIndex", "fieldVectors", "ref", "serializedIndex", "serializedVectors", "serializedInvertedIndex", "tokenSetBuilder", "tuple", "attributes", "number", "doc", "fields", "extractor", "fieldTerms", "metadataKey", "fieldRefs", "numberOfFields", "accumulator", "documentsWithField", "fieldRefsLength", "termIdfCache", "fieldLength", "termFrequencies", "termsLength", "fieldBoost", "docBoost", "tf", "idf", "scoreWithPrecision", "args", "clonedMetadata", "metadataKeys", "otherMatchData", "allFields", "options", "state", "subSlices", "type", "charCode", "lexer", "lexeme", "completedClause", "errorMessage", "nextLexeme", "possibleFields", "f", "boost", "factory", "require_escape_html", "__commonJSMin", "exports", "module", "matchHtmlRegExp", "escapeHtml", "string", "str", "match", "escape", "html", "index", "lastIndex", "import_lunr", "obj", "data", "key", "x", "y", "nodes", "parent", "i", "node", "import_escape_html", "setupSearchDocumentMap", "docs", "documents", "parents", "doc", "path", "hash", "location", "title", "tags", "text", "escapeHTML", "parent", "__spreadValues", "import_escape_html", "setupSearchHighlighter", "config", "escape", "separator", "highlight", "_", "data", "term", "query", "match", "value", "escapeHTML", "parseSearchQuery", "value", "query", "getSearchQueryTerms", "terms", "_a", "clauses", "result", "t", "clause", "difference", "a", "b", "x", "y", "value", "Search", "config", "docs", "options", "setupSearchDocumentMap", "setupSearchHighlighter", "fns", "lang", "language", "fn", "doc", "tags", "list", "tag", "query", "highlight", "clauses", "parseSearchQuery", "clause", "groups", "item", "ref", "score", "matchData", "document", "location", "title", "text", "parent", "terms", "getSearchQueryTerms", "boost", "t", "__spreadProps", "__spreadValues", "items", "result", "suggestions", "titles", "builder", "e", "index", "setupSearchLanguages", "config", "__async", "base", "worker", "path", "scripts", "lang", "handler", "message", "Search", "lunr", "ev"] +} diff --git a/assets/stylesheets/main.20d9efc8.min.css b/assets/stylesheets/main.20d9efc8.min.css new file mode 100644 index 00000000000..d1d3d5ec744 --- /dev/null +++ b/assets/stylesheets/main.20d9efc8.min.css @@ -0,0 +1 @@ +@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;-ms-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:transparent;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root,[data-md-color-scheme=default]{--md-default-fg-color:rgba(0,0,0,.87);--md-default-fg-color--light:rgba(0,0,0,.54);--md-default-fg-color--lighter:rgba(0,0,0,.32);--md-default-fg-color--lightest:rgba(0,0,0,.07);--md-default-bg-color:#fff;--md-default-bg-color--light:hsla(0,0%,100%,.7);--md-default-bg-color--lighter:hsla(0,0%,100%,.3);--md-default-bg-color--lightest:hsla(0,0%,100%,.12);--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:rgba(82,108,254,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7);--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-hl-color:rgba(255,255,0,.5);--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-mark-color:rgba(255,255,0,.5);--md-typeset-del-color:rgba(245,80,61,.15);--md-typeset-ins-color:rgba(11,213,112,.15);--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-table-color:rgba(0,0,0,.12);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-fg-color:#fff;--md-footer-fg-color--light:hsla(0,0%,100%,.7);--md-footer-fg-color--lighter:hsla(0,0%,100%,.3);--md-footer-bg-color:rgba(0,0,0,.87);--md-footer-bg-color--dark:rgba(0,0,0,.32);--md-shadow-z1:0 0.2rem 0.5rem rgba(0,0,0,.05),0 0 0.05rem rgba(0,0,0,.1);--md-shadow-z2:0 0.2rem 0.5rem rgba(0,0,0,.1),0 0 0.05rem rgba(0,0,0,.25);--md-shadow-z3:0 0.2rem 0.5rem rgba(0,0,0,.2),0 0 0.05rem rgba(0,0,0,.35)}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}body,input{font-feature-settings:"kern","liga";font-family:var(--md-text-font-family)}body,code,input,kbd,pre{color:var(--md-typeset-color)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}@media (hover:none){.md-typeset abbr{position:relative}.md-typeset abbr[title]:-webkit-any(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-webkit-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}.md-typeset abbr[title]:-moz-any(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-moz-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}[dir=ltr] .md-typeset abbr[title]:-webkit-any(:focus,:hover):after{left:0}[dir=ltr] .md-typeset abbr[title]:-moz-any(:focus,:hover):after{left:0}[dir=ltr] .md-typeset abbr[title]:is(:focus,:hover):after{left:0}[dir=rtl] .md-typeset abbr[title]:-webkit-any(:focus,:hover):after{right:0}[dir=rtl] .md-typeset abbr[title]:-moz-any(:focus,:hover):after{right:0}[dir=rtl] .md-typeset abbr[title]:is(:focus,:hover):after{right:0}.md-typeset abbr[title]:is(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li :-webkit-any(ul,ol),.md-typeset ul li :-webkit-any(ul,ol){margin-bottom:.5em;margin-top:.5em}.md-typeset ol li :-moz-any(ul,ol),.md-typeset ul li :-moz-any(ul,ol){margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset ol li :-webkit-any(ul,ol),[dir=ltr] .md-typeset ul li :-webkit-any(ul,ol){margin-left:.625em}[dir=ltr] .md-typeset ol li :-moz-any(ul,ol),[dir=ltr] .md-typeset ul li :-moz-any(ul,ol){margin-left:.625em}[dir=ltr] .md-typeset ol li :is(ul,ol),[dir=ltr] .md-typeset ul li :is(ul,ol){margin-left:.625em}[dir=rtl] .md-typeset ol li :-webkit-any(ul,ol),[dir=rtl] .md-typeset ul li :-webkit-any(ul,ol){margin-right:.625em}[dir=rtl] .md-typeset ol li :-moz-any(ul,ol),[dir=rtl] .md-typeset ul li :-moz-any(ul,ol){margin-right:.625em}[dir=rtl] .md-typeset ol li :is(ul,ol),[dir=rtl] .md-typeset ul li :is(ul,ol){margin-right:.625em}.md-typeset ol li :is(ul,ol),.md-typeset ul li :is(ul,ol){margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset img[src$="#gh-dark-mode-only"],.md-typeset img[src$="#only-dark"]{display:none}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) :-webkit-any(th,td)>:first-child{margin-top:0}.md-typeset table:not([class]) :-moz-any(th,td)>:first-child{margin-top:0}.md-typeset table:not([class]) :is(th,td)>:first-child{margin-top:0}.md-typeset table:not([class]) :-webkit-any(th,td)>:last-child{margin-bottom:0}.md-typeset table:not([class]) :-moz-any(th,td)>:last-child{margin-bottom:0}.md-typeset table:not([class]) :is(th,td)>:last-child{margin-bottom:0}.md-typeset table:not([class]) :-webkit-any(th,td):not([align]){text-align:left}.md-typeset table:not([class]) :-moz-any(th,td):not([align]){text-align:left}.md-typeset table:not([class]) :is(th,td):not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) :-webkit-any(th,td):not([align]){text-align:right}[dir=rtl] .md-typeset table:not([class]) :-moz-any(th,td):not([align]){text-align:right}[dir=rtl] .md-typeset table:not([class]) :is(th,td):not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:rgba(0,0,0,.035);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.9375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background:var(--md-typeset-mark-color);color:var(--md-default-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.9375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:-webkit-any(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-clipboard--inline:-moz-any(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-clipboard--inline:is(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:rgba(0,0,0,.54);height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2);max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.9375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{align-content:baseline;display:flex;flex-wrap:wrap;justify-content:center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{display:flex;flex-grow:0.01;outline-color:var(--md-accent-fg-color);overflow:hidden;padding-bottom:.4rem;padding-top:1.4rem;transition:opacity .25s}.md-footer__link:-webkit-any(:focus,:hover){opacity:.7}.md-footer__link:-moz-any(:focus,:hover){opacity:.7}.md-footer__link:is(:focus,:hover){opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.9375em){.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;line-height:2.4rem;max-width:calc(100% - 2.4rem);padding:0 1rem;position:relative;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;left:0;margin-top:-1rem;opacity:.7;padding:0 1rem;position:absolute;right:0}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:-webkit-any(:focus,:hover){color:var(--md-footer-fg-color)}html .md-footer-meta.md-typeset a:-moz-any(:focus,:hover){color:var(--md-footer-fg-color)}html .md-footer-meta.md-typeset a:is(:focus,:hover){color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-typeset .md-button:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-typeset .md-button:is(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:-webkit-any(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input:-moz-any(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input:is(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem transparent,0 .2rem .4rem transparent;color:var(--md-primary-bg-color);display:block;left:0;position:-webkit-sticky;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2);transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.1875em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo :-webkit-any(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}.md-header__button.md-logo :-moz-any(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}.md-header__button.md-logo :is(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem}[dir=ltr] .md-header__title{margin-left:1rem}[dir=rtl] .md-header__title{margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo :-webkit-any(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__title .md-nav__button.md-logo :-moz-any(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__title .md-nav__button.md-logo :is(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__item{padding:0 .6rem}[dir=ltr] .md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-left:0}.md-nav__link{align-items:center;cursor:pointer;display:flex;justify-content:space-between;margin-top:.625em;overflow:hidden;scroll-snap-align:start;text-overflow:ellipsis;transition:color 125ms}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active{color:var(--md-typeset-a-color)}.md-nav__item .md-nav__link--index [href]{width:100%}.md-nav__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__link>*{cursor:pointer;display:flex}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.1875em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary :-webkit-any(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary :-moz-any(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary :is(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest);padding:0}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.9375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:-webkit-sticky;position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}}@media screen and (min-width:76.25em){.md-nav{transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:-webkit-sticky;position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon,.md-nav__toggle~.md-nav{display:none}.md-nav__toggle:-webkit-any(:checked,:indeterminate)~.md-nav{display:block}.md-nav__toggle:-moz-any(:checked,:indeterminate)~.md-nav{display:block}.md-nav__toggle:is(:checked,:indeterminate)~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700;pointer-events:none}.md-nav__item--section>.md-nav__link--index [href]{pointer-events:auto}.md-nav__item--section>.md-nav__link .md-nav__icon{display:none}.md-nav__item--section>.md-nav{display:block}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s,transform .25s;width:.9rem}[dir=rtl] .md-nav__icon{transform:rotate(180deg)}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:-.1rem;width:100%}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__list>.md-nav__item--nested,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block;padding:0}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);font-weight:700;margin-top:0;padding:0 .6rem;position:-webkit-sticky;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__link--index){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link .md-nav__icon{display:none}.md-nav--lifted .md-nav[data-md-level="1"]{display:block}[dir=ltr] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-right:.6rem}[dir=rtl] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:.6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:rgba(0,0,0,.54);cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem transparent;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:rgba(0,0,0,.26);border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:hsla(0,0%,100%,.12)}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem rgba(0,0,0,.07);color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:transparent;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::-ms-input-placeholder{-ms-transition:color .25s;transition:color .25s}.md-search__input::placeholder{transition:color .25s}.md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.9375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::-ms-input-placeholder{color:var(--md-primary-bg-color--light)}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input::-ms-input-placeholder{color:var(--md-default-fg-color--light)}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:var(--md-default-fg-color--light)}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>*{margin-left:.2rem}[dir=rtl] .md-search__options>*{margin-right:.2rem}.md-search__options>*{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>*{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.9375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:is(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more summary{color:var(--md-typeset-a-color);cursor:pointer;display:block;font-size:.64rem;outline:none;padding:.75em .8rem;scroll-snap-align:start;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more summary{padding-left:2.2rem}[dir=rtl] .md-search-result__more summary{padding-right:2.2rem}}.md-search-result__more summary:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary:is(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary::marker{display:none}.md-search-result__more summary::-webkit-details-marker{display:none}.md-search-result__more summary~*>*{opacity:.65}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}.md-search-result__article--document .md-search-result__title{font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.9375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result__title{font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result__teaser{-webkit-box-orient:vertical;-webkit-line-clamp:2;color:var(--md-default-fg-color--light);display:-webkit-box;font-size:.64rem;line-height:1.6;margin:.5em 0;max-height:2rem;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width:44.9375em){.md-search-result__teaser{-webkit-line-clamp:3;max-height:3rem}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-search-result__teaser{-webkit-line-clamp:3;max-height:3rem}}.md-search-result__teaser mark{background-color:initial;text-decoration:underline}.md-search-result__terms{font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color)}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:-webkit-any(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);-webkit-transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms;transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select:-moz-any(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);-moz-transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms;transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select:is(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid transparent;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid transparent;border-right:.2rem solid transparent;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:-webkit-sticky;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.1875em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;-ms-scroll-snap-type:none;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) transparent;scrollbar-width:thin}.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) transparent}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.1875em){.md-overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.1875em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;list-style:none;margin:0;padding:0;white-space:nowrap}.md-tabs__item{display:inline-block;height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link--active,.md-tabs__link:-webkit-any(:focus,:hover){color:inherit;opacity:1}.md-tabs__link--active,.md-tabs__link:-moz-any(:focus,:hover){color:inherit;opacity:1}.md-tabs__link--active,.md-tabs__link:is(:focus,:hover){color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags{margin-bottom:.75em;margin-top:-.125em}[dir=ltr] .md-typeset .md-tag{margin-right:.5em}[dir=rtl] .md-typeset .md-tag{margin-left:.5em}.md-typeset .md-tag{background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-block;font-size:.64rem;font-weight:700;letter-spacing:normal;line-height:1.6;margin-bottom:.5em;padding:.3125em .9375em;vertical-align:middle}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;margin-right:.4em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon:-webkit-any(a:focus,a:hover):before{background-color:var(--md-accent-bg-color)}.md-typeset .md-tag-icon:-moz-any(a:focus,a:hover):before{background-color:var(--md-accent-bg-color)}.md-typeset .md-tag-icon:is(a:focus,a:hover):before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--md-default-fg-color--lightest);transform:scale(.95)}75%{box-shadow:0 0 0 .625em transparent;transform:scale(1)}to{box-shadow:0 0 0 0 transparent;transform:scale(.95)}}:root{--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}:-webkit-any(.focus-visible>.md-tooltip,.md-tooltip:target){outline:var(--md-accent-fg-color) auto}:-moz-any(.focus-visible>.md-tooltip,.md-tooltip:target){outline:var(--md-accent-fg-color) auto}:is(.focus-visible>.md-tooltip,.md-tooltip:target){outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}.md-annotation:not([hidden]){display:inline-block;line-height:1.325}.md-annotation__index{cursor:pointer;font-family:var(--md-code-font-family);font-size:.85em;margin:0 1ch;outline:none;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:0}.md-annotation .md-annotation__index{color:#fff;transition:z-index .25s}.md-annotation .md-annotation__index:-webkit-any(:focus,:hover){color:#fff}.md-annotation .md-annotation__index:-moz-any(:focus,:hover){color:#fff}.md-annotation .md-annotation__index:is(:focus,:hover){color:#fff}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);border-radius:2ch;content:"";height:2.2ch;left:-.125em;margin:0 -.4ch;padding:0 .4ch;position:absolute;top:0;transition:color .25s,background-color .25s;width:calc(100% + 1.2ch);width:max(2.2ch,100% + 1.2ch);z-index:-1}@media not all and (prefers-reduced-motion){[data-md-visible]>.md-annotation__index:after{animation:pulse 2s infinite}}.md-tooltip--active+.md-annotation__index:after{animation:none;transition:color .25s,background-color .25s}code .md-annotation__index{font-family:var(--md-code-font-family);font-size:inherit}:-webkit-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index){color:var(--md-accent-bg-color)}:-moz-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index){color:var(--md-accent-bg-color)}:is(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index){color:var(--md-accent-bg-color)}:-webkit-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index):after{background-color:var(--md-accent-fg-color)}:-moz-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index):after{background-color:var(--md-accent-fg-color)}:is(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index):after{background-color:var(--md-accent-fg-color)}.md-tooltip--active+.md-annotation__index{animation:none;transition:none;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block;line-height:90%}.md-annotation__index [data-md-annotation-id]:before{content:attr(data-md-annotation-id);display:inline-block;padding-bottom:.1em;transform:scale(1.15);transition:transform .4s cubic-bezier(.1,.7,.1,1);vertical-align:.065em}@media not print{.md-annotation__index [data-md-annotation-id]:before{content:"+"}:focus-within>.md-annotation__index [data-md-annotation-id]:before{transform:scale(1.25) rotate(45deg)}}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top:is(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;-ms-scroll-snap-type:y mandatory;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:-webkit-any(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;-webkit-transition:max-height 0ms,opacity .25s;transition:max-height 0ms,opacity .25s}.md-version:-moz-any(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;-moz-transition:max-height 0ms,opacity .25s;transition:max-height 0ms,opacity .25s}.md-version:is(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.05rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition :-webkit-any(.admonition,details),.md-typeset details :-webkit-any(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset .admonition :-moz-any(.admonition,details),.md-typeset details :-moz-any(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset .admonition :is(.admonition,details),.md-typeset details :is(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:rgba(68,138,255,.1);border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.note){border-color:#448aff}.md-typeset :-moz-any(.admonition,details):-moz-any(.note){border-color:#448aff}.md-typeset :is(.admonition,details):is(.note){border-color:#448aff}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary){background-color:rgba(68,138,255,.1)}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary){background-color:rgba(68,138,255,.1)}.md-typeset :is(.note)>:is(.admonition-title,summary){background-color:rgba(68,138,255,.1)}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary):before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary):before{background-color:#448aff;mask-image:var(--md-admonition-icon--note)}.md-typeset :is(.note)>:is(.admonition-title,summary):before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary):after{color:#448aff}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary):after{color:#448aff}.md-typeset :is(.note)>:is(.admonition-title,summary):after{color:#448aff}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :-moz-any(.admonition,details):-moz-any(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :is(.admonition,details):is(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,176,255,.1)}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary){background-color:rgba(0,176,255,.1)}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary){background-color:rgba(0,176,255,.1)}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary):before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary):before{background-color:#00b0ff;mask-image:var(--md-admonition-icon--abstract)}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary):before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary):after{color:#00b0ff}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary):after{color:#00b0ff}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary):after{color:#00b0ff}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.info,.todo){border-color:#00b8d4}.md-typeset :-moz-any(.admonition,details):-moz-any(.info,.todo){border-color:#00b8d4}.md-typeset :is(.admonition,details):is(.info,.todo){border-color:#00b8d4}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,184,212,.1)}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary){background-color:rgba(0,184,212,.1)}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary){background-color:rgba(0,184,212,.1)}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary):before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary):before{background-color:#00b8d4;mask-image:var(--md-admonition-icon--info)}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary):before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary):after{color:#00b8d4}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary):after{color:#00b8d4}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary):after{color:#00b8d4}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :-moz-any(.admonition,details):-moz-any(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :is(.admonition,details):is(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,191,165,.1)}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary){background-color:rgba(0,191,165,.1)}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary){background-color:rgba(0,191,165,.1)}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary):before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary):before{background-color:#00bfa5;mask-image:var(--md-admonition-icon--tip)}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary):before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary):after{color:#00bfa5}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary):after{color:#00bfa5}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary):after{color:#00bfa5}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.success,.check,.done){border-color:#00c853}.md-typeset :-moz-any(.admonition,details):-moz-any(.success,.check,.done){border-color:#00c853}.md-typeset :is(.admonition,details):is(.success,.check,.done){border-color:#00c853}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary){background-color:rgba(0,200,83,.1)}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary){background-color:rgba(0,200,83,.1)}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary){background-color:rgba(0,200,83,.1)}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary):before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary):before{background-color:#00c853;mask-image:var(--md-admonition-icon--success)}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary):before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary):after{color:#00c853}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary):after{color:#00c853}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary):after{color:#00c853}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.question,.help,.faq){border-color:#64dd17}.md-typeset :-moz-any(.admonition,details):-moz-any(.question,.help,.faq){border-color:#64dd17}.md-typeset :is(.admonition,details):is(.question,.help,.faq){border-color:#64dd17}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary){background-color:rgba(100,221,23,.1)}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary){background-color:rgba(100,221,23,.1)}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary){background-color:rgba(100,221,23,.1)}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary):before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary):before{background-color:#64dd17;mask-image:var(--md-admonition-icon--question)}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary):before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary):after{color:#64dd17}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary):after{color:#64dd17}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary):after{color:#64dd17}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :-moz-any(.admonition,details):-moz-any(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :is(.admonition,details):is(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary){background-color:rgba(255,145,0,.1)}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary){background-color:rgba(255,145,0,.1)}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary){background-color:rgba(255,145,0,.1)}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary):before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary):before{background-color:#ff9100;mask-image:var(--md-admonition-icon--warning)}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary):before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary):after{color:#ff9100}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary):after{color:#ff9100}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary):after{color:#ff9100}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :-moz-any(.admonition,details):-moz-any(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :is(.admonition,details):is(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary){background-color:rgba(255,82,82,.1)}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary){background-color:rgba(255,82,82,.1)}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary){background-color:rgba(255,82,82,.1)}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary):before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary):before{background-color:#ff5252;mask-image:var(--md-admonition-icon--failure)}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary):before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary):after{color:#ff5252}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary):after{color:#ff5252}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary):after{color:#ff5252}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.danger,.error){border-color:#ff1744}.md-typeset :-moz-any(.admonition,details):-moz-any(.danger,.error){border-color:#ff1744}.md-typeset :is(.admonition,details):is(.danger,.error){border-color:#ff1744}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary){background-color:rgba(255,23,68,.1)}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary){background-color:rgba(255,23,68,.1)}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary){background-color:rgba(255,23,68,.1)}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary):before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary):before{background-color:#ff1744;mask-image:var(--md-admonition-icon--danger)}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary):before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary):after{color:#ff1744}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary):after{color:#ff1744}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary):after{color:#ff1744}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.bug){border-color:#f50057}.md-typeset :-moz-any(.admonition,details):-moz-any(.bug){border-color:#f50057}.md-typeset :is(.admonition,details):is(.bug){border-color:#f50057}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary){background-color:rgba(245,0,87,.1)}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary){background-color:rgba(245,0,87,.1)}.md-typeset :is(.bug)>:is(.admonition-title,summary){background-color:rgba(245,0,87,.1)}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary):before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary):before{background-color:#f50057;mask-image:var(--md-admonition-icon--bug)}.md-typeset :is(.bug)>:is(.admonition-title,summary):before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary):after{color:#f50057}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary):after{color:#f50057}.md-typeset :is(.bug)>:is(.admonition-title,summary):after{color:#f50057}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.example){border-color:#7c4dff}.md-typeset :-moz-any(.admonition,details):-moz-any(.example){border-color:#7c4dff}.md-typeset :is(.admonition,details):is(.example){border-color:#7c4dff}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary){background-color:rgba(124,77,255,.1)}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary){background-color:rgba(124,77,255,.1)}.md-typeset :is(.example)>:is(.admonition-title,summary){background-color:rgba(124,77,255,.1)}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary):before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary):before{background-color:#7c4dff;mask-image:var(--md-admonition-icon--example)}.md-typeset :is(.example)>:is(.admonition-title,summary):before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary):after{color:#7c4dff}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary):after{color:#7c4dff}.md-typeset :is(.example)>:is(.admonition-title,summary):after{color:#7c4dff}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.quote,.cite){border-color:#9e9e9e}.md-typeset :-moz-any(.admonition,details):-moz-any(.quote,.cite){border-color:#9e9e9e}.md-typeset :is(.admonition,details):is(.quote,.cite){border-color:#9e9e9e}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary){background-color:hsla(0,0%,62%,.1)}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary){background-color:hsla(0,0%,62%,.1)}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary){background-color:hsla(0,0%,62%,.1)}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary):before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary):before{background-color:#9e9e9e;mask-image:var(--md-admonition-icon--quote)}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary):before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary):after{color:#9e9e9e}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary):after{color:#9e9e9e}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary):after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:-webkit-any(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li:-moz-any(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li:is(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :-webkit-any(:hover,:target)>.headerlink{opacity:1;-webkit-transition:color .25s,opacity 125ms;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset :-moz-any(:hover,:target)>.headerlink{opacity:1;-moz-transition:color .25s,opacity 125ms;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset :is(:hover,:target)>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:-webkit-any(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset .headerlink:-moz-any(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset .headerlink:is(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset :-webkit-any(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset :-moz-any(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset :is(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.9375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-webkit-min-content;width:-moz-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset :-webkit-any(del,ins,.comment).critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset :-moz-any(del,ins,.comment).critic{box-decoration-break:clone}.md-typeset :is(del,ins,.comment).critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset :-webkit-any(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :-moz-any(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :is(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :-webkit-any(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.md-typeset :-moz-any(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.md-typeset :is(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.highlight :-webkit-any(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight :-moz-any(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight :is(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight :-webkit-any(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :-moz-any(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :is(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :-webkit-any(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :-moz-any(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :is(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :-webkit-any(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :-moz-any(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :is(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :-webkit-any(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :-moz-any(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :is(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :-webkit-any(.kc,.n){color:var(--md-code-hl-name-color)}.highlight :-moz-any(.kc,.n){color:var(--md-code-hl-name-color)}.highlight :is(.kc,.n){color:var(--md-code-hl-name-color)}.highlight :-webkit-any(.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :-moz-any(.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :is(.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :-webkit-any(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :-moz-any(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :is(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :-webkit-any(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :-moz-any(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :is(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :-webkit-any(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :-moz-any(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :is(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :-webkit-any(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :-moz-any(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :is(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :-webkit-any(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :-moz-any(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :is(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :-webkit-any(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight :-moz-any(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight :is(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color);display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:-webkit-sticky;position:sticky;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable :-webkit-any(tbody,td){display:block;padding:0}.highlighttable :-moz-any(tbody,td){display:block;padding:0}.highlighttable :is(tbody,td){display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.9375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:-webkit-any(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys kbd:-moz-any(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys kbd:is(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"⎇";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"⌘";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"⌃";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"◆";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"⌥";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"⇧";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"❖";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"⊞";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"↓";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"←";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"→";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"↑";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"⌫";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"⇤";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"⇪";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"⌧";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"☰";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"⌦";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"⏏";padding-right:.4em}.md-typeset .keys .key-end:before{content:"⤓";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"⎋";padding-right:.4em}.md-typeset .keys .key-home:before{content:"⤒";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"⎀";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"⇟";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"⇞";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"⎙";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"⇥";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"⌤";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"⏎";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-accent-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid transparent;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-accent-fg-color)}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,transparent);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,transparent);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.9375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-accent-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){background-color:var(--md-accent-fg-color--transparent)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color)}.mermaid{line-height:normal;margin:1em 0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/main.20d9efc8.min.css.map b/assets/stylesheets/main.20d9efc8.min.css.map new file mode 100644 index 00000000000..5247bacd06f --- /dev/null +++ b/assets/stylesheets/main.20d9efc8.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/assets/stylesheets/main/extensions/pymdownx/_keys.scss","../../../src/assets/stylesheets/main.scss","src/assets/stylesheets/main/_resets.scss","src/assets/stylesheets/main/_colors.scss","src/assets/stylesheets/main/_icons.scss","src/assets/stylesheets/main/_typeset.scss","src/assets/stylesheets/utilities/_break.scss","src/assets/stylesheets/main/layout/_banner.scss","src/assets/stylesheets/main/layout/_base.scss","src/assets/stylesheets/main/layout/_clipboard.scss","src/assets/stylesheets/main/layout/_consent.scss","src/assets/stylesheets/main/layout/_content.scss","src/assets/stylesheets/main/layout/_dialog.scss","src/assets/stylesheets/main/layout/_feedback.scss","src/assets/stylesheets/main/layout/_footer.scss","src/assets/stylesheets/main/layout/_form.scss","src/assets/stylesheets/main/layout/_header.scss","src/assets/stylesheets/main/layout/_nav.scss","src/assets/stylesheets/main/layout/_search.scss","src/assets/stylesheets/main/layout/_select.scss","src/assets/stylesheets/main/layout/_sidebar.scss","src/assets/stylesheets/main/layout/_source.scss","src/assets/stylesheets/main/layout/_tabs.scss","src/assets/stylesheets/main/layout/_tag.scss","src/assets/stylesheets/main/layout/_tooltip.scss","src/assets/stylesheets/main/layout/_top.scss","src/assets/stylesheets/main/layout/_version.scss","src/assets/stylesheets/main/extensions/markdown/_admonition.scss","node_modules/material-design-color/material-color.scss","src/assets/stylesheets/main/extensions/markdown/_footnotes.scss","src/assets/stylesheets/main/extensions/markdown/_toc.scss","src/assets/stylesheets/main/extensions/pymdownx/_arithmatex.scss","src/assets/stylesheets/main/extensions/pymdownx/_critic.scss","src/assets/stylesheets/main/extensions/pymdownx/_details.scss","src/assets/stylesheets/main/extensions/pymdownx/_emoji.scss","src/assets/stylesheets/main/extensions/pymdownx/_highlight.scss","src/assets/stylesheets/main/extensions/pymdownx/_tabbed.scss","src/assets/stylesheets/main/extensions/pymdownx/_tasklist.scss","src/assets/stylesheets/main/integrations/_mermaid.scss","src/assets/stylesheets/main/_modifiers.scss"],"names":[],"mappings":"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FJ,C0B10FE,iEACE,oB1By0FJ,C0B10FE,qDACE,oB1By0FJ,C0Br0FE,8EACE,mC1Bw0FJ,C0Bz0FE,wEACE,mC1Bw0FJ,C0Bz0FE,4DACE,mC1Bw0FJ,C0Br0FI,qFACE,wBAnBG,CAoBH,kDAAA,CAAA,0C1Bu0FN,C0Bz0FI,+EACE,wBAnBG,CAoBH,0C1Bu0FN,C0Bz0FI,mEACE,wBAnBG,CAoBH,kDAAA,CAAA,0C1Bu0FN,C0Bn0FI,oFACE,a1Bq0FN,C0Bt0FI,8EACE,a1Bq0FN,C0Bt0FI,kEACE,a1Bq0FN,C0Br1FE,iFACE,oB1Bw1FJ,C0Bz1FE,2EACE,oB1Bw1FJ,C0Bz1FE,+DACE,oB1Bw1FJ,C0Bp1FE,wFACE,mC1Bu1FJ,C0Bx1FE,kFACE,mC1Bu1FJ,C0Bx1FE,sEACE,mC1Bu1FJ,C0Bp1FI,+FACE,wBAnBG,CAoBH,iDAAA,CAAA,yC1Bs1FN,C0Bx1FI,yFACE,wBAnBG,CAoBH,yC1Bs1FN,C0Bx1FI,6EACE,wBAnBG,CAoBH,iDAAA,CAAA,yC1Bs1FN,C0Bl1FI,8FACE,a1Bo1FN,C0Br1FI,wFACE,a1Bo1FN,C0Br1FI,4EACE,a1Bo1FN,C0Bp2FE,iFACE,oB1Bu2FJ,C0Bx2FE,2EACE,oB1Bu2FJ,C0Bx2FE,+DACE,oB1Bu2FJ,C0Bn2FE,wFACE,kC1Bs2FJ,C0Bv2FE,kFACE,kC1Bs2FJ,C0Bv2FE,sEACE,kC1Bs2FJ,C0Bn2FI,+FACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bq2FN,C0Bv2FI,yFACE,wBAnBG,CAoBH,6C1Bq2FN,C0Bv2FI,6EACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bq2FN,C0Bj2FI,8FACE,a1Bm2FN,C0Bp2FI,wFACE,a1Bm2FN,C0Bp2FI,4EACE,a1Bm2FN,C0Bn3FE,gFACE,oB1Bs3FJ,C0Bv3FE,0EACE,oB1Bs3FJ,C0Bv3FE,8DACE,oB1Bs3FJ,C0Bl3FE,uFACE,oC1Bq3FJ,C0Bt3FE,iFACE,oC1Bq3FJ,C0Bt3FE,qEACE,oC1Bq3FJ,C0Bl3FI,8FACE,wBAnBG,CAoBH,sDAAA,CAAA,8C1Bo3FN,C0Bt3FI,wFACE,wBAnBG,CAoBH,8C1Bo3FN,C0Bt3FI,4EACE,wBAnBG,CAoBH,sDAAA,CAAA,8C1Bo3FN,C0Bh3FI,6FACE,a1Bk3FN,C0Bn3FI,uFACE,a1Bk3FN,C0Bn3FI,2EACE,a1Bk3FN,C0Bl4FE,wFACE,oB1Bq4FJ,C0Bt4FE,kFACE,oB1Bq4FJ,C0Bt4FE,sEACE,oB1Bq4FJ,C0Bj4FE,+FACE,mC1Bo4FJ,C0Br4FE,yFACE,mC1Bo4FJ,C0Br4FE,6EACE,mC1Bo4FJ,C0Bj4FI,sGACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bm4FN,C0Br4FI,gGACE,wBAnBG,CAoBH,6C1Bm4FN,C0Br4FI,oFACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bm4FN,C0B/3FI,qGACE,a1Bi4FN,C0Bl4FI,+FACE,a1Bi4FN,C0Bl4FI,mFACE,a1Bi4FN,C0Bj5FE,mFACE,oB1Bo5FJ,C0Br5FE,6EACE,oB1Bo5FJ,C0Br5FE,iEACE,oB1Bo5FJ,C0Bh5FE,0FACE,mC1Bm5FJ,C0Bp5FE,oFACE,mC1Bm5FJ,C0Bp5FE,wEACE,mC1Bm5FJ,C0Bh5FI,iGACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bk5FN,C0Bp5FI,2FACE,wBAnBG,CAoBH,6C1Bk5FN,C0Bp5FI,+EACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bk5FN,C0B94FI,gGACE,a1Bg5FN,C0Bj5FI,0FACE,a1Bg5FN,C0Bj5FI,8EACE,a1Bg5FN,C0Bh6FE,0EACE,oB1Bm6FJ,C0Bp6FE,oEACE,oB1Bm6FJ,C0Bp6FE,wDACE,oB1Bm6FJ,C0B/5FE,iFACE,mC1Bk6FJ,C0Bn6FE,2EACE,mC1Bk6FJ,C0Bn6FE,+DACE,mC1Bk6FJ,C0B/5FI,wFACE,wBAnBG,CAoBH,oDAAA,CAAA,4C1Bi6FN,C0Bn6FI,kFACE,wBAnBG,CAoBH,4C1Bi6FN,C0Bn6FI,sEACE,wBAnBG,CAoBH,oDAAA,CAAA,4C1Bi6FN,C0B75FI,uFACE,a1B+5FN,C0Bh6FI,iFACE,a1B+5FN,C0Bh6FI,qEACE,a1B+5FN,C0B/6FE,gEACE,oB1Bk7FJ,C0Bn7FE,0DACE,oB1Bk7FJ,C0Bn7FE,8CACE,oB1Bk7FJ,C0B96FE,uEACE,kC1Bi7FJ,C0Bl7FE,iEACE,kC1Bi7FJ,C0Bl7FE,qDACE,kC1Bi7FJ,C0B96FI,8EACE,wBAnBG,CAoBH,iDAAA,CAAA,yC1Bg7FN,C0Bl7FI,wEACE,wBAnBG,CAoBH,yC1Bg7FN,C0Bl7FI,4DACE,wBAnBG,CAoBH,iDAAA,CAAA,yC1Bg7FN,C0B56FI,6EACE,a1B86FN,C0B/6FI,uEACE,a1B86FN,C0B/6FI,2DACE,a1B86FN,C0B97FE,oEACE,oB1Bi8FJ,C0Bl8FE,8DACE,oB1Bi8FJ,C0Bl8FE,kDACE,oB1Bi8FJ,C0B77FE,2EACE,oC1Bg8FJ,C0Bj8FE,qEACE,oC1Bg8FJ,C0Bj8FE,yDACE,oC1Bg8FJ,C0B77FI,kFACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1B+7FN,C0Bj8FI,4EACE,wBAnBG,CAoBH,6C1B+7FN,C0Bj8FI,gEACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1B+7FN,C0B37FI,iFACE,a1B67FN,C0B97FI,2EACE,a1B67FN,C0B97FI,+DACE,a1B67FN,C0B78FE,wEACE,oB1Bg9FJ,C0Bj9FE,kEACE,oB1Bg9FJ,C0Bj9FE,sDACE,oB1Bg9FJ,C0B58FE,+EACE,kC1B+8FJ,C0Bh9FE,yEACE,kC1B+8FJ,C0Bh9FE,6DACE,kC1B+8FJ,C0B58FI,sFACE,wBAnBG,CAoBH,mDAAA,CAAA,2C1B88FN,C0Bh9FI,gFACE,wBAnBG,CAoBH,2C1B88FN,C0Bh9FI,oEACE,wBAnBG,CAoBH,mDAAA,CAAA,2C1B88FN,C0B18FI,qFACE,a1B48FN,C0B78FI,+EACE,a1B48FN,C0B78FI,mEACE,a1B48FN,C4B9mGA,MACE,wM5BinGF,C4BxmGE,sBACE,uCAAA,CACA,gB5B2mGJ,C4BxmGI,mCACE,a5B0mGN,C4B3mGI,mCACE,c5B0mGN,C4BtmGM,4BACE,sB5BwmGR,C4BrmGQ,mCACE,gC5BumGV,C4BnmGQ,2DAEE,SAAA,CADA,uBAAA,CAEA,e5BqmGV,C4BjmGQ,0EAEE,SAAA,CADA,uB5BomGV,C4BrmGQ,uEAEE,SAAA,CADA,uB5BomGV,C4BrmGQ,iEAEE,SAAA,CADA,u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J,CkCz1GE,6BACE,sClCw1GJ,CkCz1GE,uBACE,sClCw1GJ,CkCr1GE,cACE,yClCu1GJ,CkC30GE,4DACE,oClC60GJ,CkC90GE,yDACE,oClC60GJ,CkC90GE,mDACE,oClC60GJ,CkCr0GE,6CACE,qClCu0GJ,CkCx0GE,0CACE,qClCu0GJ,CkCx0GE,oCACE,qClCu0GJ,CkC7zGE,oDACE,oClC+zGJ,CkCh0GE,iDACE,oClC+zGJ,CkCh0GE,2CACE,oClC+zGJ,CkCtzGE,gDACE,qClCwzGJ,CkCzzGE,6CACE,qClCwzGJ,CkCzzGE,uCACE,qClCwzGJ,CkCnzGE,gCACE,kClCqzGJ,CkCtzGE,6BACE,kClCqzGJ,CkCtzGE,uBACE,kClCqzGJ,CkC/yGE,qCACE,sClCizGJ,CkClzGE,kCACE,sClCizGJ,CkClzGE,4BACE,sClCizGJ,CkC1yGE,yCACE,sClC4yGJ,CkC7yGE,sCACE,sClC4yGJ,CkC7yGE,gCACE,sClC4yGJ,CkCryGE,yCACE,qClCuyGJ,CkCxyGE,sCACE,qClCuyGJ,CkCxyGE,gCACE,qClCuyGJ,CkC9xGE,gDACE,qClCgyGJ,CkCjyGE,6CACE,qClCgyGJ,CkCjyGE,uCACE,qClCgyGJ,CkCxxGE,6CACE,sClC0xGJ,CkC3xGE,0CACE,sClC0xGJ,CkC3xGE,oCACE,sClC0xGJ,CkC/wGE,yDACE,qClCixGJ,CkClxGE,sDACE,qClCixGJ,CkClxGE,gDACE,qClCixGJ,CkC5wGE,iCAGE,mBAAA,CAFA,gBAAA,CACA,gBlC+wGJ,CkCjxGE,8BAGE,mBAAA,CAFA,gBAAA,CACA,gBlC+wGJ,CkCjxGE,wBAGE,mBAAA,CAFA,gBAAA,CACA,gBlC+wGJ,CkC3wGE,eACE,4ClC6wGJ,CkC1wGE,eACE,4ClC4wGJ,CkCxwGE,gBAIE,wCAAA,CAHA,aAAA,CACA,wBAAA,CACA,wBlC2wGJ,CkCtwGE,yBAOE,wCAAA,CACA,+DAAA,CACA,4BAAA,CACA,6BAAA,CARA,iBAAA,CAIA,eAAA,CADA,eAAA,CAFA,cAAA,CACA,oCAAA,CAHA,iBlCixGJ,CkCrwGI,6BACE,YlCu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","file":"main.css"} \ No newline at end of file diff --git a/assets/stylesheets/palette.cbb835fc.min.css b/assets/stylesheets/palette.cbb835fc.min.css new file mode 100644 index 00000000000..30f9264c3e7 --- /dev/null +++ b/assets/stylesheets/palette.cbb835fc.min.css @@ -0,0 +1 @@ +@media screen{[data-md-color-scheme=slate]{--md-hue:232;--md-default-fg-color:hsla(var(--md-hue),75%,95%,1);--md-default-fg-color--light:hsla(var(--md-hue),75%,90%,0.62);--md-default-fg-color--lighter:hsla(var(--md-hue),75%,90%,0.32);--md-default-fg-color--lightest:hsla(var(--md-hue),75%,90%,0.12);--md-default-bg-color:hsla(var(--md-hue),15%,21%,1);--md-default-bg-color--light:hsla(var(--md-hue),15%,21%,0.54);--md-default-bg-color--lighter:hsla(var(--md-hue),15%,21%,0.26);--md-default-bg-color--lightest:hsla(var(--md-hue),15%,21%,0.07);--md-code-fg-color:hsla(var(--md-hue),18%,86%,1);--md-code-bg-color:hsla(var(--md-hue),15%,15%,1);--md-code-hl-color:rgba(66,135,255,.15);--md-code-hl-number-color:#e6695b;--md-code-hl-special-color:#f06090;--md-code-hl-function-color:#c973d9;--md-code-hl-constant-color:#9383e2;--md-code-hl-keyword-color:#6791e0;--md-code-hl-string-color:#2fb170;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-mark-color:rgba(66,135,255,.3);--md-typeset-kbd-color:hsla(var(--md-hue),15%,94%,0.12);--md-typeset-kbd-accent-color:hsla(var(--md-hue),15%,94%,0.2);--md-typeset-kbd-border-color:hsla(var(--md-hue),15%,14%,1);--md-typeset-table-color:hsla(var(--md-hue),75%,95%,0.12);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-bg-color:hsla(var(--md-hue),15%,12%,0.87);--md-footer-bg-color--dark:hsla(var(--md-hue),15%,10%,1);--md-shadow-z1:0 0.2rem 0.5rem rgba(0,0,0,.2),0 0 0.05rem rgba(0,0,0,.1);--md-shadow-z2:0 0.2rem 0.5rem rgba(0,0,0,.3),0 0 0.05rem rgba(0,0,0,.25);--md-shadow-z3:0 0.2rem 0.5rem rgba(0,0,0,.4),0 0 0.05rem rgba(0,0,0,.35)}[data-md-color-scheme=slate] img[src$="#gh-light-mode-only"],[data-md-color-scheme=slate] img[src$="#only-light"]{display:none}[data-md-color-scheme=slate] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=slate] img[src$="#only-dark"]{display:initial}[data-md-color-scheme=slate][data-md-color-primary=pink]{--md-typeset-a-color:#ed5487}[data-md-color-scheme=slate][data-md-color-primary=purple]{--md-typeset-a-color:#bd78c9}[data-md-color-scheme=slate][data-md-color-primary=deep-purple]{--md-typeset-a-color:#a682e3}[data-md-color-scheme=slate][data-md-color-primary=indigo]{--md-typeset-a-color:#6c91d5}[data-md-color-scheme=slate][data-md-color-primary=teal]{--md-typeset-a-color:#00ccb8}[data-md-color-scheme=slate][data-md-color-primary=green]{--md-typeset-a-color:#71c174}[data-md-color-scheme=slate][data-md-color-primary=deep-orange]{--md-typeset-a-color:#ff9575}[data-md-color-scheme=slate][data-md-color-primary=brown]{--md-typeset-a-color:#c7846b}[data-md-color-scheme=slate][data-md-color-primary=black],[data-md-color-scheme=slate][data-md-color-primary=blue-grey],[data-md-color-scheme=slate][data-md-color-primary=grey],[data-md-color-scheme=slate][data-md-color-primary=white]{--md-typeset-a-color:#6c91d5}[data-md-color-switching] *,[data-md-color-switching] :after,[data-md-color-switching] :before{transition-duration:0ms!important}}[data-md-color-accent=red]{--md-accent-fg-color:#ff1947;--md-accent-fg-color--transparent:rgba(255,25,71,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=pink]{--md-accent-fg-color:#f50056;--md-accent-fg-color--transparent:rgba(245,0,86,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=purple]{--md-accent-fg-color:#df41fb;--md-accent-fg-color--transparent:rgba(223,65,251,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=deep-purple]{--md-accent-fg-color:#7c4dff;--md-accent-fg-color--transparent:rgba(124,77,255,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=indigo]{--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:rgba(82,108,254,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=blue]{--md-accent-fg-color:#4287ff;--md-accent-fg-color--transparent:rgba(66,135,255,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=light-blue]{--md-accent-fg-color:#0091eb;--md-accent-fg-color--transparent:rgba(0,145,235,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=cyan]{--md-accent-fg-color:#00bad6;--md-accent-fg-color--transparent:rgba(0,186,214,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=teal]{--md-accent-fg-color:#00bda4;--md-accent-fg-color--transparent:rgba(0,189,164,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=green]{--md-accent-fg-color:#00c753;--md-accent-fg-color--transparent:rgba(0,199,83,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=light-green]{--md-accent-fg-color:#63de17;--md-accent-fg-color--transparent:rgba(99,222,23,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-accent=lime]{--md-accent-fg-color:#b0eb00;--md-accent-fg-color--transparent:rgba(176,235,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=yellow]{--md-accent-fg-color:#ffd500;--md-accent-fg-color--transparent:rgba(255,213,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=amber]{--md-accent-fg-color:#fa0;--md-accent-fg-color--transparent:rgba(255,170,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=orange]{--md-accent-fg-color:#ff9100;--md-accent-fg-color--transparent:rgba(255,145,0,.1);--md-accent-bg-color:rgba(0,0,0,.87);--md-accent-bg-color--light:rgba(0,0,0,.54)}[data-md-color-accent=deep-orange]{--md-accent-fg-color:#ff6e42;--md-accent-fg-color--transparent:rgba(255,110,66,.1);--md-accent-bg-color:#fff;--md-accent-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=red]{--md-primary-fg-color:#ef5552;--md-primary-fg-color--light:#e57171;--md-primary-fg-color--dark:#e53734;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=pink]{--md-primary-fg-color:#e92063;--md-primary-fg-color--light:#ec417a;--md-primary-fg-color--dark:#c3185d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=purple]{--md-primary-fg-color:#ab47bd;--md-primary-fg-color--light:#bb69c9;--md-primary-fg-color--dark:#8c24a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=deep-purple]{--md-primary-fg-color:#7e56c2;--md-primary-fg-color--light:#9574cd;--md-primary-fg-color--dark:#673ab6;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=indigo]{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=blue]{--md-primary-fg-color:#2094f3;--md-primary-fg-color--light:#42a5f5;--md-primary-fg-color--dark:#1975d2;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=light-blue]{--md-primary-fg-color:#02a6f2;--md-primary-fg-color--light:#28b5f6;--md-primary-fg-color--dark:#0287cf;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=cyan]{--md-primary-fg-color:#00bdd6;--md-primary-fg-color--light:#25c5da;--md-primary-fg-color--dark:#0097a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=teal]{--md-primary-fg-color:#009485;--md-primary-fg-color--light:#26a699;--md-primary-fg-color--dark:#007a6c;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=green]{--md-primary-fg-color:#4cae4f;--md-primary-fg-color--light:#68bb6c;--md-primary-fg-color--dark:#398e3d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=light-green]{--md-primary-fg-color:#8bc34b;--md-primary-fg-color--light:#9ccc66;--md-primary-fg-color--dark:#689f38;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=lime]{--md-primary-fg-color:#cbdc38;--md-primary-fg-color--light:#d3e156;--md-primary-fg-color--dark:#b0b52c;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=yellow]{--md-primary-fg-color:#ffec3d;--md-primary-fg-color--light:#ffee57;--md-primary-fg-color--dark:#fbc02d;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=amber]{--md-primary-fg-color:#ffc105;--md-primary-fg-color--light:#ffc929;--md-primary-fg-color--dark:#ffa200;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=orange]{--md-primary-fg-color:#ffa724;--md-primary-fg-color--light:#ffa724;--md-primary-fg-color--dark:#fa8900;--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54)}[data-md-color-primary=deep-orange]{--md-primary-fg-color:#ff6e42;--md-primary-fg-color--light:#ff8a66;--md-primary-fg-color--dark:#f4511f;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=brown]{--md-primary-fg-color:#795649;--md-primary-fg-color--light:#8d6e62;--md-primary-fg-color--dark:#5d4037;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7)}[data-md-color-primary=grey]{--md-primary-fg-color:#757575;--md-primary-fg-color--light:#9e9e9e;--md-primary-fg-color--dark:#616161;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=blue-grey]{--md-primary-fg-color:#546d78;--md-primary-fg-color--light:#607c8a;--md-primary-fg-color--dark:#455a63;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=light-green]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#72ad2e}[data-md-color-primary=lime]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#8b990a}[data-md-color-primary=yellow]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#b8a500}[data-md-color-primary=amber]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#d19d00}[data-md-color-primary=orange]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#e68a00}[data-md-color-primary=white]{--md-primary-fg-color:#fff;--md-primary-fg-color--light:hsla(0,0%,100%,.7);--md-primary-fg-color--dark:rgba(0,0,0,.07);--md-primary-bg-color:rgba(0,0,0,.87);--md-primary-bg-color--light:rgba(0,0,0,.54);--md-typeset-a-color:#4051b5}@media screen and (min-width:60em){[data-md-color-primary=white] .md-search__form{background-color:rgba(0,0,0,.07)}[data-md-color-primary=white] .md-search__form:hover{background-color:rgba(0,0,0,.32)}[data-md-color-primary=white] .md-search__input+.md-search__icon{color:rgba(0,0,0,.87)}}@media screen and (min-width:76.25em){[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid rgba(0,0,0,.07)}}[data-md-color-primary=black]{--md-primary-fg-color:#000;--md-primary-fg-color--light:rgba(0,0,0,.54);--md-primary-fg-color--dark:#000;--md-primary-bg-color:#fff;--md-primary-bg-color--light:hsla(0,0%,100%,.7);--md-typeset-a-color:#4051b5}[data-md-color-primary=black] .md-header{background-color:#000}@media screen and (max-width:59.9375em){[data-md-color-primary=black] .md-nav__source{background-color:rgba(0,0,0,.87)}}@media screen and (min-width:60em){[data-md-color-primary=black] .md-search__form{background-color:hsla(0,0%,100%,.12)}[data-md-color-primary=black] .md-search__form:hover{background-color:hsla(0,0%,100%,.3)}}@media screen and (max-width:76.1875em){html [data-md-color-primary=black] .md-nav--primary .md-nav__title[for=__drawer]{background-color:#000}}@media screen and (min-width:76.25em){[data-md-color-primary=black] .md-tabs{background-color:#000}} \ No newline at end of file diff --git a/assets/stylesheets/palette.cbb835fc.min.css.map b/assets/stylesheets/palette.cbb835fc.min.css.map new file mode 100644 index 00000000000..96e380c878a --- /dev/null +++ b/assets/stylesheets/palette.cbb835fc.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/assets/stylesheets/palette/_scheme.scss","../../../src/assets/stylesheets/palette.scss","src/assets/stylesheets/palette/_accent.scss","src/assets/stylesheets/palette/_primary.scss","src/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"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","file":"palette.css"} \ No newline at end of file diff --git a/common-coreboot-docs/checkbox/index.html b/common-coreboot-docs/checkbox/index.html new file mode 100644 index 00000000000..d20ce2d36e0 --- /dev/null +++ b/common-coreboot-docs/checkbox/index.html @@ -0,0 +1,6137 @@ + + + + + + + + + + + + + + + + + + Checkbox certification software usage - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + + + + + + + + + +

    Checkbox certification software usage (Ubuntu 22.04)

    +

    Introduction

    +

    Checkbox is a flexible test +automation software. It’s the main tool used in Ubuntu Certification program. +This document describes the usage of Checkbox on Ubuntu 22.04, but it can work +on older versions of Ubuntu as well.

    +

    Prerequisites

    +

    To run the maximum number of tests, it is advised to connect as many peripheral +devices as possible. Before running the checkbox, connect peripherals to +available connectors, such as:

    +

    External:

    +
      +
    • card reader
    • +
    • USB ports
    • +
    • display ports
    • +
    • Ethernet ports
    • +
    • headphone and microphone jacks
    • +
    • Thunderbolt ports
    • +
    • power supply and battery
    • +
    • PCMCIA or ExpressCard slot
    • +
    +

    Internal:

    +
      +
    • DIMM/RAM slots
    • +
    • SATA ports
    • +
    • PCI/PCIe slots
    • +
    • M.2 slots
    • +
    • TPM header
    • +
    • other slots
    • +
    +

    Set up the testing environment

    +

    For the tests that don't require any interference after their startup, +perform the following steps:

    +
      +
    1. +

      To stop the screen from being locked on suspend, open the terminal and + run the following command:

      +
      gsettings set org.gnome.desktop.lockdown disable-lock-screen 'true'
      +
      +
    2. +
    3. +

      To execute all sudo commands without a password, open the terminal and + run the following command for a user:

      +
      echo "user ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/user
      +
      +
    4. +
    5. +

      To set up automatic login so that a password is not required during testing + reboot, power off etc.:

      +
        +
      • Press the SUPER_KEY, type in Users and click Enter. A window with + options to change should appear.
      • +
      • Click the user name you want to enable automatic login for.
      • +
      • On the top right side of the window, click Unlock...` button.
      • +
      • You will be asked to enter your user password to continue.
      • +
      • You should now be able to toggle the Automatic Login button to enable + it.
      • +
      • Restart your system for changes to take effect.
      • +
      +
    6. +
    +

    +

    Download and install Checkbox

    +
      +
    1. +

      Disable Secure Boot. To do this you can follow the steps described in + Secure Boot test.

      +
      +

      Disable Secure boot is required to properly download packages.

      +
      +
    2. +
    3. +

      Open the terminal and type in the below commands to install Checkbox and all + its dependencies:

      +
      sudo add-apt-repository ppa:hardware-certification/public
      +sudo apt-get update
      +sudo apt-get install checkbox-ng plainbox-provider-resource-generic \
      +plainbox-provider-certification-client plainbox-provider-checkbox \
      +canonical-certification-client
      +
      +
    4. +
    +

    Run automatic validation

    +
      +
    1. +

      Start checkbox. To do this, open the terminal and run the following command:

      +
      sudo checkbox-cli
      +
      +

      After using the above-mentioned command, the following menu should appear:

      +
      ┌──────────────────────────────────────────────────────────────────────────────┐
      +│    (X) (Deprecated) Fully Automatic Client Certification Tests               │
      +│    ( ) After suspend Dock Cert blocker tests                                 │
      +│    ( ) After suspend Dock Cert tests                                         │
      +│    ( ) After suspend Dock Hot-plug Cert tests                                │
      +│    ( ) After suspend Dock Hot-plug tests                                     │
      +│    ( ) After suspend LED and oops tests (using special sleep key)            │
      +│    ( ) After suspend LED and oops tests (using special sleep key, cert.      │
      +│        blockers only)                                                        │
      +│    ( ) After suspend automated USB 3 write/read/compare tests on storage     │
      +│        devices                                                               │
      +│    ( ) After suspend automated USB write/read/compare tests on storage       │
      +│        devices                                                               │
      +│    ( ) After suspend reference tests                                         │
      +│    ( ) After suspend reference tests (automated)                             │
      +│    ( ) After suspend reference tests (certification blockers only)           │
      +│    ( ) After suspend tests (discrete GPU automated)                          │
      +│    ( ) After suspend tests (discrete GPU manual)                             │
      +│    ( ) After suspend tests (discrete GPU)                                    │
      +│    ( ) After suspend tests (discrete GPU, certification blockers only)       |
      +        .
      +        .
      +        . etc.
      +└──────────────────────────────────────────────────────────────────────────────┘
      +
      +
    2. +
    3. +

      Select test suites (SPACE - select, ARROWS - navigation, Enter - +go to the next test suite), which you want to run. Marking the first option +starts the full automated check. After selecting the first option, all modules +should be displayed and you can manually uncheck some modules, which you don't +want to test.

      +
      ┌──────────────────────────────────────────────────────────────────────────────┐
      +│[X] + Audio tests                                                             │
      +│[X] + Benchmarks tests                                                        │
      +│[X] + Bluetooth tests                                                         │
      +│[X] + CPU tests                                                               │
      +│[X] + Camera tests                                                            │
      +│[X] + Disk tests                                                              │
      +│[X] + Ethernet Device tests                                                   │
      +│[X] + Firmware tests                                                          │
      +│[X] + Graphics tests                                                          │
      +│[X] + Informational tests                                                     │
      +│[X] + Input Devices tests                                                     │
      +│[X] + Memory tests                                                            │
      +│[X] + Miscellaneous tests                                                     │
      +│[X] + Mobile broadband tests                                                  │
      +│[X] + Non-device specific networking tests                                    │
      +│[X] + Optical Drive tests                                                     │
      +│[X] + Power Management tests                                                  │
      +│[X] + Suspend tests                                                           │
      +│[X] + TPM 2.0 (Trusted Platform Module)                                       │
      +│[X] + Touchpad tests                                                          │
      +        .
      +        .
      +        . etc.
      +└──────────────────────────────────────────────────────────────────────────────┘
      +
      +
    4. +
    5. +

      Press T to start the testing procedure.

      +
    6. +
    7. +

      You might be asked about the hardware in your machine. Just tick it + truthfully and press T again.

      +
      ┌──────────────────────────────────────────────────────────────────────────────┐
      +│Does this machine have this piece of hardware?                                │
      +│    An Ethernet Port                              (X) YES  ( ) NO             │
      +│    Camera/Capture Device                         (X) YES  ( ) NO             │
      +│    USB Storage Device Connected                  (X) YES  ( ) NO             │
      +└──────────────────────────────────────────────────────────────────────────────┘
      +
      +
    8. +
    9. +

      When testing ends, a menu with test results should appear. Press R to rerun +test cases, or F to finish.

      +
    10. +
    11. +

      After all, paths to the test results should be displayed in the terminal. +By default, they are placed in /home/user/.local/share/checkbox-ng.

      +
    12. +
    +

    Additional options

    +
      +
    1. +

      run lets you run a particular test plan or a set of jobs, but it does save +any results. Example of running one test plan:

      +
      sudo checkbox-cli run com.canonical.certification::smoke
      +
      +
    2. +
    3. +

      launcher command lets you customize the checkbox experience. To use it, + you need to create config_file.ini and start running the checkbox like + below:

      +
      checkbox-cli launcher config_file.ini
      +
      +
    4. +
    +

    For more details about these (and others) commands visit +checkbox-cli.

    +

    Troubleshooting

    +

    When somehow the checkbox stop working you can resume the previous session. +To do this, open the terminal and run the following command:

    +
    sudo checkbox-cli
    +
    +

    If at least one incomplete session is present on the machine, you should see:

    +
     Do you want to resume session 'session_title-2022-07-06T13.09.22'?
    +  r => resume this session
    +  n => next session
    +  c => create new session
    +  d => delete old sessions
    +[rncd]:
    +
    +

    Type in r to resume the stopped session. You can also create a new session or +delete an old session by typing the appropriate letter.

    +
    What do you want to do with that job?
    +  s => skip that job
    +  p => mark it as passed and continue
    +  f => mark it as failed and continue
    +  r => run it
    +[spfr]:
    +
    +

    Decide what you want to do with the last test and type the appropriate letter. +After this, your checkbox session will be resumed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/common-coreboot-docs/dasharo_tools_suite/index.html b/common-coreboot-docs/dasharo_tools_suite/index.html new file mode 100644 index 00000000000..158cb3397a6 --- /dev/null +++ b/common-coreboot-docs/dasharo_tools_suite/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/common-coreboot-docs/dumping_logs/index.html b/common-coreboot-docs/dumping_logs/index.html new file mode 100644 index 00000000000..b3fac8873a7 --- /dev/null +++ b/common-coreboot-docs/dumping_logs/index.html @@ -0,0 +1,5928 @@ + + + + + + + + + + + + + + + + + + Dumping logs - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dumping logs

    +

    When facing an issue on a unique hardware configuration on the end user side it +may prove useful to submit system logs to Dasharo team for diagnosis and +possibly problem solution. This section describes how to dump various logs from +a running system.

    +

    System information

    +

    One may use Dasharo Tools Suite HCL report +or fwdump-docker image to +gather all the hardware configuration information from a running system. The +usage of the tools should result in an archive containing various logs from the +running system. Submit them via email to contact@dasharo.com +or use Dasharo pastebin.

    +

    cbmem utility

    +

    When already migrated to Dasharo, it is possible to retrieve firmware logs from +coreboot on a running system. A utility called cbmem can be used for that +purpose. By obtaining the logs Dasharo team will be able to locate any issues +with the firmware. This method requires Secure Boot to be disabled.

    +

    Options to get cbmem utility:

    +
      +
    1. Download precompiled utility from 3mdeb cloud
    2. +
    3. Use Dasharo Tools Suite v1.1.0 or + newer which has cbmem utility built in.
    4. +
    5. Compile cbmem utility. See procedure below.
    6. +
    +

    Short instruction how to compile and use cbmem on Ubuntu 22.04 live CD:

    +
      +
    1. Launch Ubuntu 22.04 live CD and choose to Try Ubuntu.
    2. +
    3. Right click on the desktop and choose Open in Terminal.
    4. +
    5. +

      Install required packages:

      +
      sudo apt-get install -y build-essential libpci-dev
      +
      +
    6. +
    7. +

      Navigate to tmpfs: cd /tmp.

      +
    8. +
    9. +

      Download and extract coreboot source:

      +
      wget https://coreboot.org/releases/coreboot-4.17.tar.xz
      +tar xvf coreboot-4.17.tar.xz
      +
      +
    10. +
    11. +

      Compile cbmem utility:

      +
      cd coreboot-4.17/util/cbmem
      +make
      +
      +
    12. +
    +

    Obtaining Dasharo firmware log

    +

    One can obtain the firmware logs with:

    +
    ```bash
    +sudo ./cbmem -1 > cbmem.log
    +```
    +
    +

    Execute the above command on the target platform. Newer Dasharo distributions +will also contain complete logs from UEFI Payload to help debug issues outside +of coreboot.

    +

    NOTE: UEFI Payload logs are not available on platforms with serial console +redirection enabled in the firmware.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dasharo-menu-docs/boot-maintenance-mgr/index.html b/dasharo-menu-docs/boot-maintenance-mgr/index.html new file mode 100644 index 00000000000..e7080bb64cf --- /dev/null +++ b/dasharo-menu-docs/boot-maintenance-mgr/index.html @@ -0,0 +1,6007 @@ + + + + + + + + + + + + + + + + + + Boot Maintenance Manager - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Boot Maintenance Manager

    +

    Boot Maintenance Manager is mainly used to manage boot options, boot timeout, +next boot variable, console inputs and outputs. It also provides a way to add +driver options, but it is rather rarely used.

    +

    +
      +
    • Boot Next Value is used to set which boot options should be booted after a + reboot. This setting is not permanent and works only after the first reboot, + then it defaults back to None.
    • +
    • Auto Boot Time-out is used to specify the timeout in seconds how long the + firmware should wait for hotkey to enter setup menu or Boot Manager Menu + before booting the first priority according to boot order or + Boot Next Value (if it was set before reset)
    • +
    +

    Boot Options

    +

    This submenu allows to manipulate the boot order and boot options in general:

    +

    +

    Add Boot Option

    +

    When selecting to add a boot option, file explorer appears where one has to +navigate to the desired disk, partition and file which shall be executed if the +boot options is selected:

    +

    +

    NOTE: only EFI files may be used. If the file is already selected a window to +set the boot option name appears:

    +

    +

    To set the name press ENTER to activate the prompt:

    +

    +

    Confirm the name (it must not be too short) with ENTER and then +Commit Changes and Exit. From now on the boot options should appear on the +boot options list in the Boot Manager Menu +and One Time Boot menu.

    +

    Delete Boot Option

    +

    To delete boot options, enter Delete Boot Option submenu.

    +

    +

    Select the checkboxes which options should be removed and then +Commit Changes and Exit. From now on the deleted boot options should not +appear on the boot options list in the Boot Manager Menu +and One Time Boot menu. Note that some boot +options are auto-registered during boot, e.g. UEFI Shell, iPXE, or +disks that contains /EFI/BOOT/BOOTX64.EFI file on their FAT32 partitions. +To disable iPXE auto-registering, disable Network Boot +in Dasharo System Features menu.

    +

    Change Boot Order

    +

    Boot Maintenance Manage also allows to change the boot order of the devices. +PLease note that the boot order may be changed only for currently detected and +registered boot options and devices. Dasharo does not yet provide fixed boot +order options per interface, e.g. prioritize USB over NVMe or SATA, etc.

    +

    +

    To move the boot options priority, press ENTER when selecting the boot +options list. A popup windows with the entries should show up. Use + and - +on the hovered item to move it up and down, use arrows to change hovered item.

    +

    +

    If you are satisfied with the order you set, press ENTER to confirm it and +then Commit Changes and Exit. The boot order should be immediately applied, +it can be checked on the boot options list in the Boot Manager Menu +and One Time Boot menu.

    +

    Driver Options

    +

    This menu is used to load additional drivers. It is used very rarely so it is +not described in detail.

    +

    +

    Console Options

    +

    This menu is used to manipulate EFI console variable. Typically there is no need +to use it.

    +

    +

    Here one may enable/disable input and output devices. Please note that most +output and input devices devices are registered automatically during boot. +Changes made here will only last till next reboot. To permanently disable +certain inputs one may use different setup options:

    + +

    WARNING: Dasharo does not yet implement any check if at least one keyboard +is plugged and working. If you disable both USB stack and PS/2 controller you +will not be able to control firmware boot flow (so unable to enter setup or +choose boot option via Boot Manager or even enable back the keyboard inputs).

    +

    Boot From File

    +

    This submenu allows one to boot an arbitrary EFI file from one of the disk +partitions. Selecting the entry will open the File Explorer (similarly like +when adding a boot option) and one has to navigate to the file desired to be +executed and press ENTER.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dasharo-menu-docs/dasharo-system-features/index.html b/dasharo-menu-docs/dasharo-system-features/index.html new file mode 100644 index 00000000000..06daba24b7d --- /dev/null +++ b/dasharo-menu-docs/dasharo-system-features/index.html @@ -0,0 +1,6040 @@ + + + + + + + + + + + + + + + + + + Dasharo System Features - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo System Features

    +

    When entering the Dasharo System Features menu, one may see the following +submenus to appear:

    +

    +

    Dasharo Security Options

    +

    +

    This menu offers security-sensitive options like:

    +
      +
    • BIOS boot medium lock - enables/disables flash protection on the vboot + recovery firmware partition. Disable it if you need access to whole flash + with flashrom.
    • +
    • Enable SMM BIOS write protection - when enabled, allows only SMM code (the + privileged code installed by the firmware in the system memory) to write to + BIOS flash. Recommended to be enabled if Firmware setup password + is set. Disable the protection if you need access to flash with flashrom.
    • +
    • +

      Boot menu enabled - enables/disables ability to enter boot manager menu. + Enabled by default. Can be disabled, to prevent from booting from non-default + boot media.

      +
    • +
    • +

      Early boot DMA Protection - Enables IOMMU DMA protection early during POST. + DMA protection is a feature that utilizes the IOMMU early in the boot process + to prevent rogue DMA-capable devices such as PCIe add-in cards, + USB4/thunderbolt devices from access to memory. This prevents a class of DMA + attacks that allow for exfiltration of secrets and installation of malware + early in the boot process.

      +
    • +
    • +

      Keep IOMMU enabled when transfer control to OS - (only available when + Early boot DMA Protection is selected) Keeps IOMMU DMA protection enabled + during ExitBootServices when control is passed to the OS. If unsure or see any + problems with DMA/IOMMU during OS boot, keep it disabled. + NOTE: Windows may not boot if the option is enabled.

      +
    • +
    +

    Networking Options

    +

    +
      +
    • Enable network boot - the option controls if the network boot should be + enabled or not. This option is disabled by default on most Dasharo supported + devices. When disabled, it prevents loading network controller drivers and + unregisters iPXE as boot option (iPXE disappears from + Boot Manager and + One Time Boot menus)
    • +
    +

    USB Configuration

    +

    +
      +
    • Enable USB stack - controls loading of UEFI USB drivers, when enabled all + USB drivers are loaded making USB keyboards and mass storage drives + functional in the firmware (to browse setup, press hotkeys or move around + bootloaders like GRUB). If disabled no USB device will work before OS is + loaded (firmware will not communicate with USB devices).
    • +
    • Enable USB Mass Storage driver - this option is blocked if USB stack is + disabled. If disabled, UEFI USB Mass Storage driver is not loaded and one + cannot boot from USB drives. Essentially this option controls the USB boot + capability. It does not affect other devices, like USB keyboards.
    • +
    +

    Intel Management Engine Options

    +

    This submenu is used to access Intel Management Engine related options. +Currently the only option available is Intel ME mode which allows to enable +or disable Management Engine:

    +

    +

    On the right side of the window there is a help section describing the option +meaning. If the window is too small, the help section may be divided and not +fully shown on the screen. To scroll the help section use D or d keys to +scroll down and U or u to scroll up.

    +

    Intel ME can be disabled in two ways:

    +
      +
    • Disabled (Soft) - when set, causes the Dasharo firmware to send + ME_DISABLE command via MEI/HECI. MEI/HECI interface is being hidden from OS + when ME is disabled.
    • +
    • Disabled (HAP) - when set, causes the Dasharo firmware to set HAP bit in + the flash descriptor. MEI/HECI interface is being hidden from OS when ME is + disabled. HAP method is much more efficient as it halts the ME firmware + execution even earlier than Soft Disable described above
    • +
    +

    +

    When the mode is set to Enabled, Dasharo enables the Intel Management engine +by either sending ME_ENABLE command via MEI/HECI or clearing the HAP bit in +flash descriptor, depending on the previously active ME mode. MEI/HECI device +should be functional in OS when ME is enabled.

    +

    Any change in the Dasharo firmware setup requires saving the changes and a +platform reset (unless specified otherwise).

    +

    For more information about neutering and disabling ME see also +me_cleaner.

    +

    NOTE: me_cleaner is not supported on all +platforms! If a platform supports me_cleaner +(i.e. ME version is lower or equal 11.x) it is recommended to set HAP bit and +clean the ME region with me_cleaner script permanently.

    +

    Chipset Configuration

    +

    +

    The submenu contains general chipset options. Currently available options:

    +
      +
    • Enable PS/2 controller - enables/disables PS/2 controller on the platform. + When disabled PS/2 keyboards and mice will stop working in firmware and OS. + PS/2 controller will not be functional in OS. This option is not available on + laptops where PS/2 is used for the integrated keyboard and possibly touchpad.
    • +
    • Enable watchdog - controls the chipset watchdog functionality. If enabled, + watchdog will be counting with the timeout specified below. The firmware + automatically kicks the watchdog periodically so even without OS support, the + platform will not reset itself when watchdog expires.
    • +
    • Watchdog timeout value - watchdog timeout in seconds. Allowed range is + 60-1024 seconds. The Option is only visible if watchdog is set to enabled.
    • +
    +

    Power Management Options

    +

    The submenu contains general power management options.

    +

    +

    Currently available options:

    +
      +
    • Fan profile - Sets of the fan operation modes (defaults to Silent):
        +
      • Silent - the fan will operate at lower speeds to reduce noise,
      • +
      • Performance - the fan will operate at higher speeds, to allow for + increased performance.
      • +
      +
    • +
    • Platform sleep type - sets the active sleep mode to be available for OS
        +
      • Suspend to Idle (S0ix) (default) - also known as modern standby. Select + this option if using Windows. S3 sleep mode may not be working well with + Windows for machines newer than 11th generation Intel Core processors. + S0ix will not work properly if ME is disabled.
      • +
      • Suspend to RAM (S3) - standard sleep mode that suspends the machine + state to RAM, supported on most operating systems (except Windows on 11th + generation Intel Core processors or newer).
      • +
      +
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dasharo-menu-docs/device-manager/index.html b/dasharo-menu-docs/device-manager/index.html new file mode 100644 index 00000000000..11fd6867e3e --- /dev/null +++ b/dasharo-menu-docs/device-manager/index.html @@ -0,0 +1,6061 @@ + + + + + + + + + + + + + + + + + + Device Manager - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Device Manager

    +

    The Device Manager is a EDKII standard submenu which collects various device +setups like TPM, UEFI Secure Boot, TCG OPAL Drive Password, SATA Password and +others.

    +

    +

    TCG Drive Management

    +

    This menu allows one to set up TCG OPAL disk password and manage other TCG OPAL +feature settings. The main view of the submenu looks as follows:

    +

    +

    The submenu will list all the TCG OPAL capable disks. Selecting one of them +with ENTER will cause entering the disk specific submenu:

    +

    +

    Here one can enable the TCG OPAL security feature or restore factory default +with the PSID (Physical Security ID). Physical Security ID is a drive specific +key which is used to revert to factory default mode. The PSID can be typically +found on the sticker present on the disk.

    +

    Besides the feature enablement and factory restore options there is an action +interactive entry on the main TCG Drive Management page:

    +

    +

    It is used to perform TCG OPAL specific operations when the security feature is +enabled. Enable/disable BlockSID will set/unset "freeze locking" of the drive +features as requested by OS. One may also enable or disable physical presence +(firmware popup confirmation of actions requested by OS) when switching +BlockSID.

    +

    To set up the password enter the desired disk submenu and enable the feature by +selecting the checkbox. Note that not all disks support the security feature of +TCG OPAL. Reset is required to apply changes. After reset you will be prompted +to set admin password. When the admin password is set, more options become +available for the disk:

    +

    +

    All below options require reset to apply changes.

    +
      +
    • Update Drive Admin Password - to update current admin password. Prompt + window appears after reset to enter current and new password
    • +
    • Set Drive User Password - is used to set an optional user password.
    • +
    • Secure Erase User Data - performs secure erase of the data after reset.
    • +
    • Admin Revert to factory default and Disable - disables the admin password + (prompt will no longer appear during boot o unlock the drive) and the + security feature after reset. Optionally one may select to keep or discard + user data.
    • +
    • PSID Revert to factory default and Disable - in case admin password has + been forgotten PSID can be used to disable the security feature and admin + password after reset. This will also erase user data.
    • +
    • Disable User - disables the user functionality (and so the user password) + after reset.
    • +
    +

    For more details about TCG OPAL please refer to +TCG Storage Specifications and Key Management.

    +

    Driver Health Manager

    +

    This submenu is informational only and displays the status of drivers that +install UEFI driver health protocol. Typically it is installed by 3rdparty +applications such as OptionROMs on graphics devices or network controllers for +example.

    +

    +

    Secure Boot Configuration

    +

    This submenu allows configuring UEFI Secure Boot functionality.

    +

    +

    Enabling Secure Boot

    +

    By default, Dasharo firmware doesn't have UEFI Secure Boot enabled. +Additionally, keys for UEFI Secure Boot are not enrolled, as we do not make +assumptions about which CA the user trusts. To enable Secure Boot for booting +common OSes signed with Microsoft keys (Windows and Linux distros using the +shim bootloader), select the Reset Secure Boot keys option. The Attempt +Secure Boot option will now be available and selected, and Secure Boot will be +used on next boot.

    +

    Custom mode and key management

    +

    The following keys are enrolled by default when resetting Secure Boot keys:

    + +
    +

    To learn more, please visit +Windows Secure Boot Key Creation and Management Guidance.

    +
    +

    To use your own keys, choose Custom Mode in Secure Boot Mode:

    +

    +

    An additional entry appears below for configuring keys and certificates:

    +

    +

    Here one may delete and enroll particular keys, certificates and database +signatures.

    +

    TCG2 Configuration

    +

    TCG2 Configuration submenu is responsible for displaying TPM 2.0 information +and managing the module.

    +

    +

    The basic information displayed are the TPM device family, interface, but also +information about supported hashing algorithms.

    +

    +

    +

    It is also possible to perform various TPM2 physical presence operations +(TPM2 Operation) and enable or disable PCR banks.

    +

    +

    The supported TPM2 operations are:

    +
      +
    • Disabling or enabling Owner and Endorsement hierarchies
    • +
    • TPM ClearControl(NO) + Clear - performs TPM clear
    • +
    • PCR Allocation - used to enable additional PCR banks
    • +
    • LogAllDigests - on next reboot (and only on next reboot), add digests for + all supported hashing algorithms to log file
    • +
    • ChangeEPS - clears the TPM and changes its identity
    • +
    +

    For more details about the TPM operations see +TCG Physical Presence Interface Specification

    +

    HDD Security Configuration

    +

    HDD Security Configuration allows one to set SATA disk password. Note that +all SATA disks will be displayed, even these that don't support the feature.

    +

    +

    To check if the disk supports password feature, enter the specific disk submenu +to see if Security Supported displays Yes:

    +

    +

    If one scrolls down a bit, more information is displayed about current state of +the disk password feature:

    +

    +

    +

    At the bottom of the page there are two checkboxes:

    +
      +
    • Request to set User Password - this is the option to set the password on + the disk. Requires reset, after which the prompt windows will appear to set + the password. From now on the prompt will appear on each boot.
    • +
    • Request to set Master Password - this options changes the disk master + password. Master password is used to recover from forgotten User Password.
    • +
    +

    Typically Master Password is provisioned during disk manufacturing and it will +not be possible to change it without knowing what the master password is.

    +

    To disable the User Password simply request to set the User Password again via +the menu. After reset you will be asked to unlock the driver with current +password and then type new password. To disable the password simply leave the +field empty and confirm it twice by pressing ENTER. After that the password +prompt will not appear again.

    +

    Network Device List

    +

    This submenu is displayed when Network Boot +is enabled and the network controller driver installs the necessary UEFI +protocols. The menu lists the network devices with the UEFI protocol installed. +One may check out the network controller information, like MAC address, +driver used and link status. Example view with MAC address blurred:

    +

    +

    +

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dasharo-menu-docs/overview/index.html b/dasharo-menu-docs/overview/index.html new file mode 100644 index 00000000000..0e6a7531809 --- /dev/null +++ b/dasharo-menu-docs/overview/index.html @@ -0,0 +1,5969 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo menu overview

    +

    This section describes the overview of the Dasharo firmware setup menu. In the +subsections you will get to know:

    +
      +
    • What options are available?
    • +
    • How to use submenus and options?
    • +
    • How the options and submenus work?
    • +
    +

    Here you may watch a Dasharo menu walkthrough +with commentary presenting Dasharo features.

    +

    Dasharo menu guides

    +

    The main menu is entered by selecting the Setup application in the +Boot Manager Menu or by pressing the Setup hotkey +while booting. The hotkey is shown in the top-left corner of the screen when +the boot logo is displayed, for example DEL:

    +
    DEL   to enter Setup
    +F11   to enter Boot Manager Menu
    +ENTER to boot directly
    +
    +

    On certain devices like Novacustom laptops one will also be greeted with a +firmware version printed on the screen (main firmware version and EC firmware +version if applicable), for example:

    +
    Firmware version: Dasharo (coreboot+UEFI) v1.6.0
    +EC firmware version: 2023-03-20_c398446
    +F2    to enter Setup
    +F7    to enter Boot Manager Menu
    +ENTER to boot directly
    +
    +

    If any error happens (firmware version is unknown, could not be read or any +other error) you will get an red error string:

    +

    +

    OR

    +

    +

    In such case please follow the EC firmware update instructions for a specific +board variant.

    + +

    Main Page

    +

    +

    The page is the main view of the firmware setup application. It contains the +board model (MS-7D25), installed CPU and firmware version in the top-left +corner. In the top-right corner the CPU frequency and system RAM amount are +shown.

    +

    From the main page one may access all menus and submenus available in the +firmware setup. Besides the menus there is also an option to:

    +
      +
    1. Change the language (currently only English is supported)
    2. +
    3. Continue - execute the top first boot order priority
    4. +
    5. Reset - resets the platform.
    6. +
    +

    The currently available menus/submenus are as follows:

    +
      +
    • User Password Management - allows to set + firmware setup password
    • +
    • Device Manager - allows configuring various devices and + features like: UEFI Secure Boot, TPM device, SATA and TCG OPAL password, etc. + It may also contain informational menus like Driver Health Manager, Network + Device List and others.
    • +
    • Dasharo System Features - contains submenus for + features specific to Dasharo products and Dasharo supported platforms
    • +
    • One Time Boot - allows to choose which boot entry to + execute. It simply lists all available boot options and allows to select one + the same way as Boot Manager Menu
    • +
    • Boot Maintenance Manager - allows to manipulate + various UEFI standard variables responsible for console and boot options. One + may choose which devices should be used for input and output, choose to boot + an arbitrary file or modify the boot options and boot order.
    • +
    +

    NOTE: not all submenus may be available on your platform. +Contact Dasharo Team for more information and +possible feature extension of your platform.

    +

    User Password Management

    +

    User Password Management menu allows one to set firmware setup admin password:

    +

    +

    The password must be a strong one. The requirements are described on the help +section on the right side of the menu page. If the password is too weak it will +not be accepted. Also the new password must be different from the last 5 +passwords that were used before. The page shows the current status of +Admin Password if it is provisioned or not.

    +

    To disable the password, enter the User Password Management menu again and +request to set new password. You will be asked to enter current password. When +a window to provide new password pops up, leave the field empty and confirm it +twice with ENTER. The password installation status on the menu page should +change to Not Installed.

    +

    One Time Boot

    +

    When setup application is entered, one of the menus is called One Time Boot. +As the name suggests it allows to override the boot just one time (not +permanently). The usage principles are the same as for Boot Manager Menu.

    +

    Example view of One Time Boot submenu:

    +

    +

    On the right side of the menu window, there is a DevicePath which is a +UEFI-compliant path to the device or file being executed. Depending on the +file/device type, these paths may be different:

    +

    +

    +

    DevicePaths are defined in UEFI Specification. +If you are interested in decoding those, read through the specification +carefully.

    +

    Boot Manager Menu

    +

    Boot Manager Menu is an application that lists all bootable options and allows +one to override the boot path.

    +

    Boot Manager Menu is entered with a different key than setup application. It +may be customized on your platform. The right key to use is always printed on +the screen in the top-left corner, for example F11:

    +
    DEL   to enter Setup
    +F11   to enter Boot Manager Menu
    +ENTER to boot directly
    +
    +

    After pressing the right hotkey for Boot Manager Menu, a window should pop up:

    +

    +

    On the bottom of the window there are instructions for moving and selecting +entries.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dasharo-tools-suite/documentation/index.html b/dasharo-tools-suite/documentation/index.html new file mode 100644 index 00000000000..82a30cfc642 --- /dev/null +++ b/dasharo-tools-suite/documentation/index.html @@ -0,0 +1,6422 @@ + + + + + + + + + + + + + + + + + + Documentation - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Documentation

    +

    Supported hardware

    +

    Dasharo Tools Suite was prepared to run on x86 platforms, but we can confirm +that it boots on the following platforms:

    + +

    Running

    +

    The Dasharo Tools Suite can be started in various ways. Currently, there are +two options:

    +
      +
    • bootable over a network (iPXE),
    • +
    • bootable USB stick image.
    • +
    +

    The first one should always be preferred if possible, as it is the easiest one +to use.

    +

    Bootable over a network

    +

    This section describes how to boot DTS using iPXE.

    +

    Requirements

    +

    Below are the requirements that must be met to run DTS over a network on the +platform:

    +
      +
    • Dasharo device with DTS functionality integrated,
    • +
    • wired network connection,
    • +
    • Secure Boot disabled,
    • +
    • disabled BIOS lock feature (if device is already flashed with Dasharo).
    • +
    +

    Launching DTS

    +

    To access Dasharo Tools Suite:

    +
      +
    • attach a wired network cable to the device's Ethernet port,
    • +
    • power on the device, holding down the Boot Menu entry key,
    • +
    • in the Boot Menu, select the iPXE Network Boot option,
    • +
    • in the Network Boot menu, select the Dasharo Tools Suite option,
    • +
    • the DTS menu will now appear.
    • +
    +

    Bootable USB stick

    +

    This section describes how to boot DTS using a USB stick.

    +

    Requirements

    +

    Below are the requirements that must be met to run DTS from a USB device on the +platform:

    +
      +
    • USB stick (at least 2GB),
    • +
    • wired network connection,
    • +
    • Secure Boot disabled,
    • +
    • disabled BIOS lock feature (if device is already flashed with Dasharo),
    • +
    • latest image from releases section.
    • +
    +

    Launching DTS

    +

    To access Dasharo Tools Suite:

    +
      +
    • flash the downloaded image onto USB stick,
        +
      • you can use a cross-platform GUI installer - Etcher
      • +
      • you can also use dd to flash from the command line
      • +
      +
    • +
    +
    gzip -cdk dts-base-image-v1.1.0.wic.gz | \
    +sudo dd of=/dev/sdX bs=16M status=progress conv=fdatasync
    +
    +
    +

    Note: this is an example done on the v1.1.0 image.

    +
    +
      +
    • insert the USB stick into a USB in your device,
    • +
    • boot from the USB stick,
    • +
    • the DTS menu will now appear.
    • +
    +

    Building

    +

    We choose Yocto Project to prepare Dasharo +Tools Suite system. DTS image can be built using publicly available sources. +Thanks to publishing the build cache on +cache.dasharo.com the time needed to +finish the process should be significantly decreased.

    +

    Prerequisites

    +

    The following must be met to build DTS:

    + +
    wget -O ~/bin/kas-container https://raw.githubusercontent.com/siemens/kas/3.0.2/kas-container
    +
    +
    chmod +x ~/bin/kas-container
    +
    +
      +
    • meta-dts repository cloned.
    • +
    +
    mkdir yocto && cd yocto
    +
    +
    git clone https://github.com/Dasharo/meta-dts.git
    +
    +

    Build

    +

    From yocto directory, run:

    +
    SHELL=/bin/bash kas-container build meta-dts/kas.yml
    +
    +

    Image build takes time, so be patient, and the build's finished, you should see +something similar to (tasks number may differ):

    +
    Initialising tasks: 100% |###########################################################################################| Time: 0:00:01
    +Sstate summary: Wanted 2 Found 0 Missed 2 Current 931 (0% match, 99% complete)
    +NOTE: Executing Tasks
    +NOTE: Tasks Summary: Attempted 2532 tasks of which 2524 didn't need to be rerun and all succeeded.
    +
    +

    Using the cache is enabled in kas/cache.yml file and can be disabled by +removing content of that file.

    +
    cat kas/cache.yml
    +
    +

    output:

    +
    header:
    +  version: 11
    +
    +local_conf_header:
    +  yocto-cache: |
    +    SSTATE_MIRRORS ?= "file://.* http://${LOCAL_PREMIRROR_SERVER}/${PROJECT_NAME}/sstate-cache/PATH"
    +    SOURCE_MIRROR_URL ?= "http://${LOCAL_PREMIRROR_SERVER}/${PROJECT_NAME}/downloads"
    +    INHERIT += "own-mirrors"
    +    LOCAL_PREMIRROR_SERVER ?= "cache.dasharo.com"
    +    PROJECT_NAME ?= "yocto/dts"
    +
    +

    Build image with UEFI Secure Boot support

    +

    From yocto directory run:

    +
    SHELL=/bin/bash kas-container build meta-dts/kas-uefi-sb.yml
    +
    +

    Image build takes time, so be patient and after build's finish you should see +something similar to (the exact tasks numbers may differ):

    +
    Initialising tasks: 100% |###########################################################################################| Time: 0:00:04
    +Checking sstate mirror object availability: 100% |###################################################################| Time: 0:00:03
    +Sstate summary: Wanted 892 Local 672 Mirrors 212 Missed 8 Current 1560 (99% match, 99% complete)
    +NOTE: Executing Tasks
    +NOTE: Tasks Summary: Attempted 5860 tasks of which 5841 didn't need to be rerun and all succeeded.
    +
    +

    Image created with kas-uefi-sb.yml configuration file enable integration of +UEFI Secure Boot into DTS using +meta-secure-core. Building the +image allow to prepare a PoC version with uses sample +keys +which by no mean should used in production. For user keys the script +[create-user-key-store.sh](https://github.com/jiazhang0/meta-secure-core/blob/master/meta-signing-key/scripts/create-user-key-store.sh +can be used but it was not tested yet. Quick start with instructions on how to +use image are described in +meta-efi-secure-boot.

    +

    Flash

    +
      +
    • Find out your device name.
    • +
    +
    fdisk -l
    +
    +

    output:

    +
    (...)
    +Device     Boot  Start    End Sectors  Size Id Type
    +/dev/sdx1  *      8192 131433  123242 60,2M  c W95 FAT32 (LBA)
    +/dev/sdx2       139264 186667   47404 23,2M 83 Linux
    +
    +

    In this case the device name is /dev/sdx, but be aware, in the next steps, +replace /dev/sdx with the right device name on your platform, or else you can +damage your system!

    +
      +
    • From where you ran image build type.
    • +
    +
    sudo umount /dev/sdx*
    +
    +
    cd build/tmp/deploy/images/genericx86-64
    +
    +

    Here the file dts-base-image-genericx86-64.wic.gz should be available, which +is the image of DTS. To flash image, you can use the same command shown in +running section. Just change the file name.

    +
      +
    • Boot the platform.
    • +
    +

    Disabling Secure Boot

    +

    Any procedure affecting the firmware flashing should be preceded by controlling +the Secure Boot status and if it is turned on, turning it off. The enabled +Secure Boot will not only prevent you from operating on the firmware, but you +will also not be able to launch DTS.

    +

    To check the Secure Boot state:

    +
      +
    1. Turn off the station on which you want to test the Dasharo firmware.
    2. +
    3. Turn the station on and go to the next step immediately.
    4. +
    5. Hold the BIOS SETUP KEY to enter the BIOS MENU.
    6. +
    7. Localize and enter the Secure Boot menu using the arrow keys and Enter.
    8. +
    9. Verify that the Secure Boot Status field says Disabled - if not, + deselect the Enforce Secure Boot option using the arrow keys and Enter.
    10. +
    11. Change the setting of Secure Boot to Disabled and press Enter.
    12. +
    13. Press the F10 key to open the dialog box.
    14. +
    15. Press Enter to confirm changes and exit from the menu.
    16. +
    +

    After completing the steps described above, Secure Boot should be disabled. +You could confirm that by repeating steps 3 - 5.

    +

    Features

    +

    This section describes the functionality of the Dasharo Tools Suite. These are:

    + +

    Dasharo zero-touch initial deployment

    +

    DTS can be used to flash Dasharo firmware on your hardware. To achieve this, +boot DTS, choose option number 2. After creating +report with +firmware dump as backup, type p to confirm the installation of Dasharo +firmware.

    +

    Next you will be asked two questions to confirm flashing. The first will be +displayed with the detected information about the device you are using DTS on. +The second will also provide the hash of Dasharo components which will then be +used for flashing. You can compare them with the values listed in the supported +hardware section on docs.dasharo.com. Both these questions can be accepted by +typing Y.

    +

    Procedure execution ends automatically on the reboot of the platform (unless it +requires otherwise). After restarting the device, you can enjoy the basic +version of Dasharo, which we provide for given hardware.

    +

    This feature is supported on the following platforms:

    +
      +
    • ASUS KGPE-D16,
    • +
    • Dell OptiPlex 7010/9010,
    • +
    • MSI PRO Z690-A DDR4,
    • +
    • MSI PRO Z690-A DDR5,
    • +
    • NovaCustom NV4x,
    • +
    • NovaCustom NS5x/7x.
    • +
    +

    HCL Report

    +

    DTS allows the generation of a package with logs containing hardware +information. To create one, choose option number 1 and check out the disclaimer. +If you would like to send the report to our servers, please remember about +connecting the ethernet cable. More information can be found in +glossary.

    +

    +

    HCL Report correctness

    +

    Please note DTS HCL Report assumes that your chipset is already supported by +flashrom. There are also other false negative errors and unknowns, which we +trying to fix to improve user experience.

    +

    Always check results file to confirm the quality of your HCL report. Sample +content of such file may look as follows:

    +
    [OK]    PCI configuration space and topology
    +[UNKNOWN] USB devices and topology
    +[OK]    Super I/O configuration
    +[UNKNOWN] EC configuration
    +[ERROR]   MSRs
    +[OK]    SMBIOS tables
    +[OK]    BIOS information
    +[OK]    CMOS NVRAM
    +[UNKNOWN] Intel configuration registers
    +[OK]    GPIO configuration C header files
    +[OK]    kernel dmesg
    +[OK]    ACPI tables
    +[UNKNOWN] Audio devices configuration
    +[OK]    CPU info
    +[OK]    I/O ports
    +[OK]    Input bus types
    +[OK]    Firmware image
    +[OK]    I2C bus
    +[UNKNOWN] ACPI tables
    +[OK]    Touchpad information
    +[OK]    DIMMs information
    +[ERROR]   CBMEM table information
    +[ERROR]   TPM information
    +[ERROR]   AMT information
    +[OK]    ME information
    +Results of getting data:
    +
    +Legend:
    +[OK]     Data get successfully
    +[UNKNOWN]  Result is unknown
    +[ERROR]    Error during getting data
    +
    +

    Please report all errors experienced while performing a dump to +dasharo-issues repository.

    +

    BIOS backup

    +

    One of the key components of HCL Report is your BIOS backup. To prepare BIOS +backup of your platform, simply run HCL Report and decide if you would like to +contribute information about your hardware configuration.

    +

    Please consider the following options depending on your situation:

    +
      +
    • YES - If you decide to contribute, you can always get back to + us and ask about BIOS backup, which + we will provide after simple verification that you are the owner of the + hardware.
    • +
    • NO (default) - If you decide to not contribute, your situation depends on + the boot method you used to execute DTS:
        +
      • Network Boot - please note that Dasharo booted over iPXE assumes no + storage available, so the report, and your BIOS backup are stored in + temporary memory and will not be available after reboot. Please make sure + to move HCL Report to not volatile storage. This can be done using option + 9) Shell,
      • +
      • USB Boot - HCL Report and BIOS backup are saved to USB storage root + directory.
      • +
      +
    • +
    +

    Firmware update

    +

    DTS can be used to update Dasharo firmware. To achieve this, boot it on platform +with flashed Dasharo and choose option number 5.

    +

    Next you will be asked two questions to confirm flashing. The first will be +displayed with the detected information about the device you are using DTS on. +The second will also provide the hash of Dasharo components which will then be +used for flashing. You can compare them with the values listed in the supported +hardware section on docs.dasharo.com. Both these questions can be accepted by +typing Y.

    +

    If you see the following warning during the process, you do not need to worry +about it:

    +
    Warning: Setting BIOS Control at 0xdc from 0x8b to 0x89 failed.
    +New value is 0x8b.
    +
    +

    Procedure execution ends automatically on the reboot of the platform (unless it +requires otherwise). After restarting the device, you can enjoy the updated +version of Dasharo, which we provide for given hardware.

    +

    Below we provide an example of updating Dasharo firmware from version v1.0.0 to +v1.1.1 on MSI PRO Z690-A DDR4.

    +
      DTS version v1.2.0
    +
    +  1) Dasharo HCL report - dump hardware information from this device
    +  3) Restore firmware from Dasharo HCL report
    +  4) Load SE keys
    +  5) Update Dasharo firmware
    +  9) Shell
    +  10) Power off system
    +  11) Reboot system
    +
    +Enter an option: 5
    +
    +Gathering flash chip and chipset information...
    +Flash information: vendor="Programmer" name="Opaque flash chip"
    +Flash size: 32M
    +Checking for the latest Dasharo update available...
    +Current Dasharo version: 1.0.0
    +Latest available Dasharo version: 1.1.1
    +
    +Please verify detected hardware!
    +
    +Board vendor: Micro-Star International Co., Ltd.
    +System model: MS-7D25
    +Board model: PRO Z690-A WIFI DDR4(MS-7D25)
    +
    +Does it match your actual specification? (Y|n)y
    +
    +Following firmware will be used to install Dasharo
    +Dasharo BIOS firmware:
    +  - link: https://3mdeb.com/(...)/msi_ms7d25_v1.1.1_ddr4.rom
    +  - hash: 3b438422338cf4c13abdb25823a9b2a2ad6e82fabbe0d9ed41a16a6eae1f15ff
    +
    +You can learn more about this release on: https://docs.dasharo.com/
    +
    +Do you want to update Dasharo firmware on your hardware? (Y|n) y
    +
    +Downloading Dasharo firmware update...
    +########################################################################### 100.0%
    +Checking sha256sum...
    +/tmp/biosupdate.rom: OK
    +Updating Dasharo firmware...
    +This will take around 3 minutes. Please be patient and do not reset your
    +computer, or touch keyboard!
    +Successfully updated Dasharo firmware
    +Syncing disks... Done.
    +The computer will reboot automatically in 5 seconds
    +Rebooting in 5s:
    +5...
    +4...
    +3...
    +2...
    +1...
    +Rebooting
    +
    +

    Local firmware update

    +

    To flash a local BIOS image (e.g. mounted from a USB stick), you can drop to the +shell (option 9) and use the flashrom binary provided inside DTS directly.

    +

    DANGER: Failure to use flashrom correctly may result in an unbootable +device. For example, never flash an image that does not contain an Intel +Firmware Descriptor (IFD) region and/or Management Engine (ME) region to the +whole chip.

    +

    You can use flashrom -p internal without additional parameters to double check +if flashrom detects your chipset. This will not write anything.

    +

    The following flashrom command will only rewrite the BIOS region:

    +
    sudo flashrom -p internal --ifd -i bios -w [path/to/your/coreboot.rom]
    +
    +

    If flashrom outputs the following, you do not need to worry about it:

    +
    Enabling flash write... Warning: Setting BIOS Control at 0xdc from 0x8b to 0x89 failed.
    +New value is 0x8b.
    +SPI Configuration is locked down
    +
    +

    EC transition

    +

    DTS allows performing full Embedded Controller firmware transition from the +proprietary vendor EC firmware to the Dasharo EC firmware. Currently, this +functionality is supported on the NovaCustom +NS5x/NS7x) and NovaCustom +NV4x only.

    +

    Starting from DTS v1.2.0 to perform EC transition please run +firmware update on the platform with proprietary vendor EC +firmware.

    +

    EC update

    +

    DTS allows to update open-source Embedded Controller firmware to the newer +version. This is how we can achieve that.

    +
      +
    • Retrieve information about your current EC.
    • +
    +
    system76_ectool info
    +
    +

    The output of the above-described command should contain information about + the version of flashed firmware:

    +
    board: clevo/ns50mu
    +version: 2022-08-16_c12ff1a
    +
    +
      +
    • Download the newest version of Embedded Controller firmware.
    • +
    • Plug in power supply, without it, flashing EC is not possible as losing power + may cause in damaged firmware.
    • +
    • Flash Embedded Controller firmware internally.
    • +
    +
    system76_ectool flash ec_file.rom
    +
    +

    The output of the above-described command should look as follows:

    +
    file board: Ok("clevo/ns50mu")
    +file version: Ok("2022-08-16_c12ff1a")
    +ec board: Ok("clevo/ns50mu")
    +ec version: Ok("2022-08-31_cbff21b")
    +Waiting 5 seconds for all keys to be released
    +Sync
    +SPI Read 128K
    +Saving ROM to backup.rom
    +SPI Write 128K
    +SPI Read 128K
    +Successfully programmed SPI ROM
    +Result: Ok(())
    +Sync
    +System will shut off in 5 seconds
    +Sync
    +
    +
    +

    Note: this is example output, versions may differ

    +
    +
      +
    • Computer will shut down automatically.
    • +
    • Power on your computer. Booting process may take a while.
    • +
    • After boot, choose option number 9 to drop to Shell.
    • +
    • Retrieve information about your updated EC.
    • +
    +
    system76_ectool info
    +
    +

    The output of the above-described command should contain information about + the version of flashed firmware:

    +
    board: clevo/ns50mu
    +version: 2022-08-31_cbff21b
    +
    +

    Additional features

    +

    The section below presents a list of functionalities added to DTS, which were +developed at the community's request and which do not necessarily relate +strictly to Dasharo.

    +

    Run commands from iPXE shell

    +
    +

    Note: this functionality might not work, please see + GitHub issue.

    +
    +

    It is possible to execute the bash script after Linux startup by passing it from +the iPXE shell. Every script placed in /sbin/ipxe-commands will be executed +automatically after startup.

    +

    Here is a simple instruction on how to use that feature.

    +
      +
    • Run the HTTP server in the directory which contains the DTS base image. If you + build it by yourself, then it should be the meta-dts subdirectory: + build/tmp/deploy/images/genericx86-64.
    • +
    +

    The easiest way to start an HTTP server is using http.server python module.

    +
    $ python3 -m http.server 9000
    +
    +
      +
    • Create a dts.ipxe bootchain file in a directory where you have an HTTP + server. That file should have similar content (you need to enter the IP of + your host machine in a local network).
    • +
    +
    #!ipxe
    +#
    +kernel http://<YOUR_IP>:9000/bzImage root=/dev/nfs initrd=http://<YOUR_IP>:9000/dts-base-image-genericx86-64.cpio.gz
    +initrd http://<YOUR_IP>:9000/dts-base-image-genericx86-64.cpio.gz
    +module http://<YOUR_IP>:9000/custom-script /sbin/ipxe-commands mode=755
    +boot
    +
    +
      +
    • +

      Copy your custom-script script in this same directory.

      +
    • +
    • +

      Enter the iPXE shell on your device and load dts.ipxe bootchain file.

      +
    • +
    +
    iPXE> dhcp
    +Configuring (net0 00:0d:b9:4b:49:60)...... ok
    +iPXE> route
    +net0: 192.168.4.126/255.255.255.0 gw 192.168.4.1
    +iPXE> chain http://192.168.4.98:9000/dts.ipxe
    +http://192.168.4.98:9000/dts.ipxe... ok
    +http://192.168.4.98:9000/bzImage... ok
    +http://192.168.4.98:9000/dts-base-image-genericx86-64.cpio.gz... ok
    +http://192.168.4.98:9000/custom-script... ok
    +
    +

    Now your custom-script script should be copied to DTS rootfs as +ipxe-commands and will be executed after boot.

    +

    Run DTS using VentoyOS

    +

    Starting from version v1.1.1, we provide also an ISO +formatted image. Thanks to that, it can be used with VentoyOS[1]. As for now the +following limitations are known.

    +
      +
    • VentoyOS needs to be started in UEFI mode.
    • +
    • Nothing can be saved on root file system, as VentoyOS boots systems in + read-only mode.
    • +
    +

    Please let us know if you started DTS using VentoyOS and have additional +information for us. You can share them on Dasharo Matrix +Workspace.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dasharo-tools-suite/images/dts-hcl-run.jpg b/dasharo-tools-suite/images/dts-hcl-run.jpg new file mode 100644 index 00000000000..4b82ca664fb Binary files /dev/null and b/dasharo-tools-suite/images/dts-hcl-run.jpg differ diff --git a/dasharo-tools-suite/images/dts-logo.jpg b/dasharo-tools-suite/images/dts-logo.jpg new file mode 100644 index 00000000000..a9f37280a09 Binary files /dev/null and b/dasharo-tools-suite/images/dts-logo.jpg differ diff --git a/dasharo-tools-suite/overview/index.html b/dasharo-tools-suite/overview/index.html new file mode 100644 index 00000000000..e51d1ebcaf9 --- /dev/null +++ b/dasharo-tools-suite/overview/index.html @@ -0,0 +1,5875 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Tools Suite

    +

    +

    Overview

    +

    Dasharo Tools Suite (DTS) is a set of tools running in a minimal Linux +environment to deploy, update, and maintain firmware on Dasharo-supported +devices. For example, it can be used to update the firmware on a device or run +the initial deployment, even when no OS is currently installed.

    +
      +
    • Releases - groups information about all releases.
    • +
    • Documentation - describes DTS functionality and + information on how to run it.
    • +
    +

    Reporting issues

    +

    Thank you for using Dasharo Tools Suite. If you have encountered any problems +with this system or would like to provide feedback for us - please open an issue +on Dasharo +issues.

    +

    And if you have already used this system and would be interested in supporting +the project, please check how to get Supporters +Entrance, +which ensures delivery of Dasharo firmware updates.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dasharo-tools-suite/releases/index.html b/dasharo-tools-suite/releases/index.html new file mode 100644 index 00000000000..a4f0b4e7f56 --- /dev/null +++ b/dasharo-tools-suite/releases/index.html @@ -0,0 +1,6050 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Release Notes

    +

    Following Release Notes describe the status of Open Source Software development +for Dasharo Tools Suite.

    +

    For details about our release process, please read Dasharo Standard Release +Process.

    +

    +Subscribe to Dasharo Tools Suite Newsletter +

    +

    v1.2.0 - 2023-05-10

    +

    Images

    +

    USB bootable DTS v1.2.0 image +sha256 +sha256.sig

    +

    DTS v1.2.0 ISO image +sha256 ISO +sha256.sig ISO

    +

    See how to verify hash and signature on this + video. It works the same way with ISO image.

    +

    Changelog

    +

    Please, refer to +changelog +stored in meta-dts repository.

    +

    v1.1.1 - 2023-02-20

    +

    Images

    +

    USB bootable DTS v1.1.1 image +sha256 +sha256.sig

    +

    DTS v1.1.1 ISO image +sha256 ISO +sha256.sig ISO

    +

    See how to verify hash and signature on this + video. It works the same way with ISO image.

    +

    Changelog

    +
      +
    • Fixed Dasharo zero-touch initial deployment on MSI PRO Z690-A, added DDR5 + target with dedicated firmware.
    • +
    • Blocked Dasharo zero-touch initial deployment on platforms where Dasharo + firmware was detected.
    • +
    • Added couple UX improvements for Dasharo zero-touch initial deployment:
        +
      • added platform verification step (show detected device information),
      • +
      • added firmware verification step (show hash of using binary),
      • +
      • added progress bar on first instructions,
      • +
      • used reboot as default behavior after successful flashing.
      • +
      +
    • +
    • Added improvements for HCL report.
    • +
    • Added DTS ISO format image, and documentation about + VentoyOS usage.
    • +
    • Improved README of the meta-dts repository.
    • +
    • Added service to run shell commands from + iPXE.
    • +
    • Added instructions for building PoC image with enabled UEFI Secure + Boot support.
    • +
    +

    v1.1.0 - 2022-11-02

    +

    Images

    +

    USB bootable DTS v1.1.0 image +sha256 +sha256.sig

    +

    Changelog

    + +

    v1.0.2 - 2022-10-19

    +

    Images

    +

    USB bootable DTS v1.0.2 image +sha256 +sha256.sig

    +

    See how to verify hash and signature on this + video.

    +

    Changelog

    +
      +
    • Added new vendor-specific menu entry, which is displayed only on supported + platforms. For now, NovaCustom menu was added for NovaCustom NV4x and + NovaCustom NS5x/7x laptops.
    • +
    • DTS version is now printed in the main menu.
    • +
    • ec_transition script now supports NovaCustom NV4x laptops and automatically + download firmware used for transition both for NovaCustom NV4x NV4x and + NovaCustom NS5x/7x laptops, firmware + transition documentation is updated.
    • +
    • Added kernel configuration to silence terminal logs by default (change + loglevel to 1).
    • +
    • Enabled GOOGLE_MEMCONSOLE_COREBOOT kernel configuration to ease getting + firmware logs.
    • +
    +

    v1.0.1 - 2022-09-02

    +

    Images

    +

    USB bootable DTS v1.0.1 image +sha256 +sha256.sig

    +

    See how to verify hash and signature on this video.

    +

    Changelog

    + +

    v1.0.0 - 2022-08-09

    +

    Images

    +

    USB bootable DTS v1.0.0 image +sha256

    +
    # assuming all files have been downloaded to the same directory without
    +# changing names
    +sha256sum -c [sha256 file]
    +
    +

    Changelog

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dev-proc/documentation-guidelines/index.html b/dev-proc/documentation-guidelines/index.html new file mode 100644 index 00000000000..20942d36096 --- /dev/null +++ b/dev-proc/documentation-guidelines/index.html @@ -0,0 +1,6012 @@ + + + + + + + + + + + + + + + + + + Documentation guidelines - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Documentation guidelines

    +

    That document can be treated as an onboarding into creating and maintaining +documentation in projects developed by Dasharo Team. It is a set of general +rules and tips that you should have in mind while writing guides to any projects +in Dasharo repositories.

    +

    Table of content

    + +

    General rules

    +
      +
    • Make a plan - before starting a new document, you should know how it will +look. It is good to prepare a table of content first, and then fill up planned +chapters.
    • +
    • Read twice before publish - everyone make mistakes. Before committing +your changes, it is good to read this again and make sure that you do not make +any typos, a dump of commands output is correct, or there are no other mistakes.
    • +
    • Goal of document - Documentation is not written for everyone. Some +documents contain only a list of commands with minor descriptions, some of them +were created to describe research results, and others may be written for +non-technical persons with a huge amount of data that are obvious and +unnecessary to read by developers. Because of that, you should always know for +who you are writing that document - it may be developers, testers, or +non-technical management.
    • +
    • Hierarchy of information - most important information should always be +on top of the document. We should start with the title, short description, and +table of contexts. The rest of the chapters should start with the most important +one.
    • +
    • 30/90 rule - It is good to ask your reporter or someone else to do a quick +review where approx 30% of the work was done. At this moment, you probably have +prepared the initial draft of the document with a table of content and some +remarks about content in planned chapters. The second review should be done when +90% of the work is finished, and the document is almost done. With that +workflow, you can make sure that you are on the same page with a reporter.
    • +
    • Existing resources - We should not duplicate content that was previously +described in another document. Some steps or explanations are related to a few +documents, and it is not necessary to write the same again. It is good to use +references to existing documents (like hyperlinks) - because of that, updating +and maintenance of documentation are easier because the change in one document +is related to several others. Also, if you see that a related document is +outdated, it will be a much better choice to review and update them instead of +writing another new one from scratch.
    • +
    • Maintenance - documentation may be outdated after a few changes. We should +keep that in mind and prepare an updated schedule. One of the ideas is to mark +related documents in every pull request with technical changes. Of course, the +best solution is to improve documentation with every change in +code/architecture, but it is not always possible due to deadlines or lack of +time. Marking documents to update in the future allows us to do that on better +occasions - and we prevent situations where the reader must inform us that the +documentation is highly outdated - or even useless.
    • +
    • Archive - Projects are changing, and some topics from the past are not +existing now. If the document describes the working of a non-existing mechanism, +we should move it to the special folder with archived content. We can go back to +that solution in the future, but it must be moved out to as not to mislead the +reader.
    • +
    +

    Document type

    +

    Good documentation should be written in one of four modes. +It can be a tutorial, how-to guide, technical reference, or explanation. +These modes were proposed by Diataxis framework, and we +want to follow that method in the future. Generally:

    +
      +
    • Tutorials are learning-oriented, and their purpose is to take the reader +by the hand through a series of steps to complete a project of some kind. It +may be a getting started guide, end2end process, or preparing the working +environment.
    • +
    • How-to-guides should be written as a step list that is required to +solve the problem. They are goal-oriented, which is the main difference between +tutorials: how-to guides lead to solving some problems and are not focused on +the learning experience. For example, building system images or modifying boot +parameters.
    • +
    • Reference guides are technical descriptions, and it is +information-oriented. It is only information about some technical thing without +an explanation of it in the larger context. A good example of that is a +requirement list, description of functions or variables used in the program, or +list of supported platforms.
    • +
    • Explanation is a discussion focused on the understanding of some topic, +like boot flow, description of specific communication protocol, or device +provisioning. That document should explain the subject, not instruct how to do +something.
    • +
    +

    We should not create documents that are not related to these modes.

    +

    Useful tools

    +
      +
    • grammarly.com - online writing assistant who can +improve your grammar and make the document clear. A premium account is a very +useful option, but it is not a must. Core functionalities are available for +free. It is highly recommended to use the Grammarly tool before committing +changes.
    • +
    • hemingwayapp.com - make your writing clear. +Sometimes it catches things that are not detected by Grammarly.
    • +
    • draw.io - we use that to prepare diagrams.
    • +
    • paste.dasharo.com - pastebin alternative hosted +by Dasharo.
    • +
    • asciinema.org - free and open-source solution for +recording terminal sessions. Sometimes - especially in more complex cases, it is +good to present command sequences in this way.
    • +
    +

    Formatting

    +

    General rules of formatting documents:

    +
      +
    • Use markdown preview to verify that document is rendering correctly. That +feature is available in VS code, Github/Gitlab web IDE, and other tools.
    • +
    • Line with code should not have more than 80 characters. To follow that rule, +it is good to set the line at width 80 in your IDE. +Here is how to do it in VS code.
    • +
    +

    We also maintain the repository +Dasharo/dev-tools-configs +with editors configs used by our community. Feel free to create PR with your +configuration - you can give your proposition to improve existing settings or +create configs for editors that don't exist yet in our repository. +A properly configurated editor simplifies correct formatting.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dev-proc/feature-bug-fix-dev-process/index.html b/dev-proc/feature-bug-fix-dev-process/index.html new file mode 100644 index 00000000000..0750d30804b --- /dev/null +++ b/dev-proc/feature-bug-fix-dev-process/index.html @@ -0,0 +1,5809 @@ + + + + + + + + + + + + + + + + + + Features and bug fixes development process - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Features and bug fixes development

    +

    We are in favor of Test Driven Bug Fixing methodology for which process looks +as follows:

    +
      +
    1. Create automated test that validates feature or reproduces bug - test fails at + this point
    2. +
    3. Pull upstream master branch to Dasharo forked repository master branch
    4. +
    5. Merge master to <platform>/develop
    6. +
    7. Create new branch <platform>/<feature> from <platform>/develop
    8. +
    9. Commit changes to <platform>/<feature>
    10. +
    11. Run test written in point 1 and make sure it pass.
    12. +
    13. Run <platform> regression test suite and make sure new feature does not + introduce new bugs.
    14. +
    15. Submit PR to <platform>/develop
    16. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dev-proc/hcl-maintainer/index.html b/dev-proc/hcl-maintainer/index.html new file mode 100644 index 00000000000..1b52ad6d496 --- /dev/null +++ b/dev-proc/hcl-maintainer/index.html @@ -0,0 +1,5877 @@ + + + + + + + + + + + + + + + + + + HCL Maintainer documentation - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo HCL Maintainer documentation

    +

    This documentaintion aims to describe how to maintain Dasharo Hardware +Compatibility List for CPUs, memory, mainboards and GPU.

    +

    Generating entry

    +

    Dasharo HCL report parsing

    +

    For reports uploaded to 3mdeb cloud please use dedicated +script readme.

    +

    Extending list

    +

    Please always sort table before publishing.

    +

    In vim:

    +
      +
    • Shift+V - to enter visual mode and mark whole range of entries.
    • +
    • type : and sort u to run vim sort function on marked range and leave only + unique lines.
    • +
    +

    Github report

    + + +

    Github pull request

    +

    Go through standard review process for Dasharo documentation.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dev-proc/smbios-rules/index.html b/dev-proc/smbios-rules/index.html new file mode 100644 index 00000000000..68a0aa10a05 --- /dev/null +++ b/dev-proc/smbios-rules/index.html @@ -0,0 +1,5918 @@ + + + + + + + + + + + + + + + + + + Dasharo Product Guidelines: SMBIOS Information - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Product Guidelines: SMBIOS Information

    +

    Introduction

    +

    This document describes the guidelines for filling in the SMBIOS fields in +devices supported by Dasharo. It is meant to be used primarily as a reference +for Dasharo developers.

    +

    BIOS Information (Type 0)

    +

    Vendor field

    +

    The Vendor field, for firmware with release date after 13 January 2022, +is set as follows:

    +
    3mdeb
    +
    +

    For firmware with release date before 13 January 2022:

    +
    3mdeb Embedded Systems Consulting
    +
    +

    BIOS Version field

    +

    The BIOS Version string is defined as follows:

    +
    Dasharo ([major_framework]+[minor_framework]) v[version]
    +
    +
      +
    • major_framework refers to the primary framework in which the firmware is + developed, e.g. coreboot or UEFI.
    • +
    • minor_framework is the secondary framework, a supporting component for the + primary framework, e.g. a coreboot payload. May not always be used, e.g. if + edk2 is used as the primary framework.
    • +
    • version means version according to official + Dasharo Versioning documentation.
    • +
    +

    For TianoCore UEFIPayloadPkg, +we use the simpler and more recognizable UEFI name.

    +

    Examples:

    +
      +
    • Dasharo (coreboot+UEFI) v1.0.0 - for coreboot-based builds with TianoCore UEFIPayload
    • +
    • Dasharo (coreboot+SeaBIOS) v1.0.0 - for coreboot-based builds with SeaBIOS payload
    • +
    • Dasharo (coreboot+Heads) v1.0.0 - for coreboot-based builds with Heads payload
    • +
    • Dasharo (UEFI) v1.0.0 - for plain edk2-based builds
    • +
    +

    System Information (Type 1)

    +

    Devices with an existing BIOS implementation

    +

    In this case, set all the fields that are relevant (excluding BIOS version and +vendor) to the same values as the stock firmware.

    +

    To obtain SMBIOS values from the stock firmware, either:

    +
      +
    • Obtain the fwdump-docker logs from 3mdeb cloud
    • +
    • Run dmidecode -t 1 on the machine itself
    • +
    +

    Devices with no existing BIOS implementation

    +

    In the case where the device does not have an existing supported BIOS or the +client chooses to use different SMBIOS fields (e.g. to make it easier to +differentiate devices), refer to the +SMBIOS specification v3.5.0.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dev-proc/source-code-structure/index.html b/dev-proc/source-code-structure/index.html new file mode 100644 index 00000000000..57c446cdbe3 --- /dev/null +++ b/dev-proc/source-code-structure/index.html @@ -0,0 +1,5991 @@ + + + + + + + + + + + + + + + + + + Source code structure - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Source code structure

    +

    Every repository forked and maintained by Dasharo Release Team has following +branch structure:

    +
      +
    • master - follows upstream project master branch
    • +
    • <platform>/release - contains all code releases for given <platform>, + list of supported platforms is in + Hardware Compatibility List + section
    • +
    • <platform>/rel_vX.Y.Z - release branch for version X.Y.Z
    • +
    • <platform>/develop - contains most recent development and is periodically + synced with master branch
    • +
    • <platform>/<feature> - tracks development of platform specific feature
    • +
    +

    <platform> = <coreboot_mainboard_vendor>_<coreboot_mainboard_model> if +platform is supported by coreboot, otherwise we use common sense and available +information about hardware.

    +

    Remotes

    +

    It is assumed that upstream repository is cloned and remote named dasharo is +added later. This has to be done in order to pull git submodules from upstream +repository so they don't have to be kept on Dasharo's repository. This can be +done like this:

    +
    git clone https://review.coreboot.org/coreboot.git
    +cd coreboot
    +git submodule update --init --checkout
    +git remote add dasharo git@github.com:Dasharo/coreboot.git
    +
    +

    If everything was done properly, this is expected state of remotes:

    +
    git remote -v
    +dasharo git@github.com:Dasharo/coreboot.git (fetch)
    +dasharo git@github.com:Dasharo/coreboot.git (push)
    +origin  https://review.coreboot.org/coreboot.git (fetch)
    +origin  https://review.coreboot.org/coreboot.git (push)
    +
    +

    Tags

    +

    Dasharo Release tags in git repository use format: <platform>_vX.Y.Z

    +

    New platform support

    +

    Branch for new platform should be created from most recentmaster branch tag. +If there is justified need to create support for new board at arbitrary +non-tagged commit developer should mark this commit with <platform>_v0.0.0 +tag.

    +

    Force-pushes rules

    +

    Force-pushes to <platform>/rel_vX.Y.Z, <platform>/develop or +<platform>/<feature> are forbidden with following exceptions:

    +
      +
    • rebasing - when some other PR is merged to target branch before our does, or + when upstream's master introduces the same fixes that our branch would
    • +
    • squashing - to not produce unnecessary "fix indentation" or "add missing + braces" commits to the history
    • +
    • (re-)signing commits (both -S and -s) - shouldn't happen, but if it does + happen it would be better to have it fixed by original author than the person + that tries to upstream it some time later.
    • +
    +

    Force-pushes to <platform>/release branches are unconditionally forbidden.

    +

    Merging guidelines

    +

    We want to keep the history linear. The rebase merging strategy is desired. +Merge commits in the code repositories are not allowed. The rebase strategy +should be the only one available in the GitHub web UI.

    +

    It is, however, strongly advised not to use GitHub web UI to perform code +merges. The signed-off tends to be dropped (even when using the rebase +strategy), which is problematic for some projects (e.g. it makes the coreboot +lint checks fail after merging from the UI).

    +

    The procedure of merging is as follows:

    +
      +
    1. Review the code in GitHub.
    2. +
    3. Make sure to receive at least one Approve in the review process.
    4. +
    5. Make sure that all change requests are resolved.
    6. +
    7. +

      Merge the branch using git CLI. In case of merging the feature branch into + develop branch it may look as follows:

      +
      git fetch dasharo
      +git checkout dasharo/<platform>/develop -b <platform>/develop
      +git merge --ff-only dasharo/<platform>/<feature>
      +git push dasharo <platform>/develop
      +
      +
    8. +
    9. +

      This should automatically trigger closing the MR in the GitHub web UI.

      +
    10. +
    11. +

      The remote branch can be safely deleted after this process.

      +
      git push dasharo --delete <platform>/<feature>
      +
      +
    12. +
    13. +

      Note that the merging may fail if the source (in this case: feature) branch + is not properly rebased on top of the target (in this case: develop) + branch. In such a case, one must rebase the source branch first:

      +
    14. +
    +
    git checkout dasharo/<platform>/<feature>
    +git checkout -b <platform>/<feature>
    +git rebase dasharo/<platform>/<develop>
    +git push -f dasharo <platform>/<feature>
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dev-proc/standard-release-process/index.html b/dev-proc/standard-release-process/index.html new file mode 100644 index 00000000000..c0015865706 --- /dev/null +++ b/dev-proc/standard-release-process/index.html @@ -0,0 +1,5866 @@ + + + + + + + + + + + + + + + + + + Standard Release Process - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Standard Release Process

    +

    Following procedure is generic description of release process of firmware for +supported hardware platforms. Precise steps and any difference from standard +process are described in platform specific documentation.

    +

    Description here is, intentionally, Open Source Firmware framework agnostics +and should be maintained in that way.

    +

    Process steps

    +
      +
    1. Checkout new branch <platform>/rel_vX.Y.Z from recent commit on + <platform>/release - to understand versioning scheme please read + Versioning section
    2. +
    3. Merge current <platform>/develop to <platform>/rel_vX.Y.Z
    4. +
    5. Run platform regression test suite
    6. +
    7. Fix all required issues and repeat point 3 until fixed - this doesn't mean + all tests pass, this mean that approved set passed
    8. +
    9. If results are accepted merge it to <platform>/release branch
    10. +
    11. +

      Add tag, which should trigger CI and publish binaries. Tag should be + annotated and signed. For example:

      +
      git tag -a -s -m "<platform>_vX.Y.Z" <platform>_vX.Y.Z
      +
      +
    12. +
    13. +

      Merge release branch to develop

      +
    14. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/dev-proc/versioning/index.html b/dev-proc/versioning/index.html new file mode 100644 index 00000000000..dbef586b41d --- /dev/null +++ b/dev-proc/versioning/index.html @@ -0,0 +1,5937 @@ + + + + + + + + + + + + + + + + + + Versioning - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Versioning

    +

    Dasharo Releases are versioned using Semantic Versioning +and Keep A Changelog to document +changes introduced in new releases.

    +

    Major version zero (0.y.z) is for initial development and may not support all +Dasharo Quality Criteria.

    +

    The only way to map Dasharo Version to version of Open Source Firmware +framework or other components included in Dasharo Release is through release +notes. Link to Dasharo Release Notes for your hardware platform can be found +in menu on the left side (Supported Hardware->Hardware Model->Releases).

    +

    Dasharo Supporters releases

    +

    Dasharo Supporters receive firmware updates more frequently than the community. +Number of updates per year depends on the number of Dasharo Subscriptions sold +and the availability of other funding (e.g., NLNet, corporate sponsors, +community donations) but is less than 2 updates per year. Dasharo Supporters +updates are characterized by a changing patch version (z). Fixes and features +introduced in Dasharo Supporters releases will also be available later in +community releases. In short, being a Dasharo Supporter gives an early access to +the newest features and fixes.

    +

    Community releases

    +

    Community releases are built and published once a year. Each community release +has a zero patch version (x.y.0) and the only changing number is the minor +version y.

    +

    Signing keys

    +

    In Dasharo we use following rules for keys:

    +
      +
    • GPG RSA 4096 for signing and authentication and subkey for encryption
    • +
    • There few types of naming conventions, which define Real Name field and + chain of trust schemes:
        +
      • Software:
          +
        • Real Name: <name> open-source software release <version> signing key
        • +
        • Signing key: 3mdeb Open Source Software Master Key <contact@3mdeb.com>
        • +
        +
      • +
      • Firmware:
          +
        • Real Name: <name> open-source firmware release <version> signing key
        • +
        • Signing key: 3mdeb Dasharo Master Key
        • +
        +
      • +
      • PC Engines (firmware exception):
          +
        • Real Name: PC Engines open-source firmware release <version> signing key
        • +
        • Signing key: 3mdeb Open Source Firmware Master Key <contact@3mdeb.com>
        • +
        +
      • +
      • Dasharo firmware produced by 3mdeb:
          +
        • Real Name: Dasharo release <version> compatible with <name> signing key
        • +
        • Signing key: 3mdeb Dasharo Master Key
        • +
        +
      • +
      • For Dasharo firmware produced by 3mdeb on customer's behalf:
          +
        • Real Name: Dasharo open-source firmware <version> for <name> signing key
        • +
        • Signing key: 3mdeb Dasharo Master Key
        • +
        +
      • +
      +
    • +
    +

    <name> typically is in form <vendor> <model> or just <vendor> if we +release firmware for whole line of products which can be support in one binary +e.g. PC Engines. Examples:

    +
      +
    • Dell OptiPlex 7010/9010
    • +
    • ASUS KGPE-D16
    • +
    • MSI MS7D25
    • +
    • NovaCustom
    • +
    • Tuxedo
    • +
    +

    Most recent status should be reflected in +3mdeb-secpack repository.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/ecosystem/overview/index.html b/ecosystem/overview/index.html new file mode 100644 index 00000000000..2df7ae90be3 --- /dev/null +++ b/ecosystem/overview/index.html @@ -0,0 +1,5835 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Ecosystem Overview

    +
    +

    Dasharo ecosystem contain multiple components on various levels of +organization. This section overview role of every component.

    +

    +
      +
    • Open Source Firmware Community - semi-organised collections of contributors + to projects related to embedded firmware. Dasharo project contributors are + part of OSF community.
    • +
    • Development - Dasharo Development describes processes which Embedded Firmware + Team uses for the development of Dasharo Modules, which are sometimes custom + services, but most of the time ready to use productised services, Open Core + or SaaS.
    • +
    • Production - Dasharo Production describes the process of putting together Dasharo + Modules according to specific requirements. In this section we describe + development infrastructure, build environment, CI/CD and build publishing + methods. We also cover how production interacts with Dasharo Transparent + Validation System.
    • +
    • Customer Infrastructure - Some customers may have the need of replicating part + of Dasharo Production process and infrastructure in their own environment, + which leads to repositories synchronization, different CI/CD setup and other + needs. This section describes interaction with Customer Infrastructure and + which part of Dasharo Production is deployable on the customer site.
    • +
    • Transparent Validation - Dasharo Transparent Validation (DTV) is a set of + software, firmware and hardware components with the goal of simplifying and + improving long term maintenance of Dasharo firmware. In this section we + introduce components which belong to DTV.
    • +
    • Testing Infrastructure - Part of Dasharo Transparent Validation responsible + for scheduling automated testing, publishing test results and interacting + with Dasharo Production in the area of release candidate quality confirmation.
    • +
    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/ecosystem/roadmap/index.html b/ecosystem/roadmap/index.html new file mode 100644 index 00000000000..ef4fcb0a237 --- /dev/null +++ b/ecosystem/roadmap/index.html @@ -0,0 +1,5859 @@ + + + + + + + + + + + + + + + + + + Roadmap - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Roadmap

    +

    Each features on below roadmap should be placed in public issue tracker, so it +can be publicly referenced. Some places where issues can be discussed:

    + +

    Backlog

    +
      +
    • TrenchBoot Roadmap + firmware related issues.
    • +
    • Dasharo Reference OS on USB stick to simplify firmware deployment
    • +
    • fwupd/LVFS for firmware deployment
    • +
    • ipxe for firmware deployment
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/glossary/index.html b/glossary/index.html new file mode 100644 index 00000000000..63d6dc697f2 --- /dev/null +++ b/glossary/index.html @@ -0,0 +1,5908 @@ + + + + + + + + + + + + + + + + + + Glossary - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Glossary

    +

    After years of providing services and products on firmware +market we recognize that it is poisoned by incorrect and +confusing terminology. In following glossary we would like to +explain most used terms from Dasharo Documentation. We try to +refer to standards, literature and community best practices to +keep content added by us minimalistic.

    +

    Embedded Firmware

    +

    We use definition explained in first chapter of +"Embedded Firmware Solutions" book +by Jiming Sun, Marc Jones, Stefan Reinauer and Vincent Zimmer.

    +

    Firmware is "layer of software between the hardware and the +operating system (OS), with the main purpose to initialize and +abstract enough hardware so that the operating systems and +their drivers can further configure the hardware to its full +functionality."

    +

    Rising complexity of hardware initialization and need for its +manageability created need for BMC (Board Management +Controllers), EC (Environmental Controllers) and even more +specialized one like USB Power Delivery firmware. What may +make that firmware also covered by above definition.

    +

    Dasharo Hardware Compatibility List Report

    +

    Dasharo HCL Report dumps most important information about platform and backup +SPI NOR flash. Gathered information can be used for future analysis, debugging +and recovery. Optionally scripts upload dump to Dasharo HCL Backup Server, so +Dasharo Team can improve open source firmware product line and support +customers in case of issues.

    +

    As temporary solution we use 3mdeb NextCloud as Dasharo HCL Backup Server.

    +

    Dasharo HCL Reports are also used during open source firmware port feasibilty +analysis, so if you are interested in Dasharo support for your hardware, feel +free to reach us.

    +

    Please note Dasharo HCL Report may contain sensitive information like serial +numbers. Please do not make this information public. Dasharo Team respect your +privacy.

    +

    Dasharo Blobs Transmission

    +

    Unfortunately, some hardware platforms cannot be fully functional without +binary blobs in the firmware. Some binary blobs have no EULA or any other +license discussing redistributability. To avoid issues, Dasharo Blobs +Transmission scripts extract blobs from SPI NOR flash backup and patch Dasharo +open-source firmware distribution before initial deployment.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/guides/dasharo-reviewers-guide/index.html b/guides/dasharo-reviewers-guide/index.html new file mode 100644 index 00000000000..7ee10307f9e --- /dev/null +++ b/guides/dasharo-reviewers-guide/index.html @@ -0,0 +1,6098 @@ + + + + + + + + + + + + + + + + + + Dasharo Reviewers Guide - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Reviewers Guide

    +

    Based on reviews of Dasharo compatible with MSI Z690-A DDR4/DDR5, we created +the following guide to explain the performance gap between MSI proprietary and +Dasharo open-source firmware, but in the long run, the same discoveries can +apply to other Dasharo and open-source firmware solutions.

    +

    Introduction

    +

    During the 23+ years of coreboot's existence, one aspect that has never been +in-depth tested is how its performance compares against proprietary firmware +solutions that run on the same hardware platform. The lack of performance +testing is because, for most of the interested parties, the selling point of +coreboot was the transparency of being open-source, and this rarely made direct +comparisons about other features or functionality. Historically, most of what +we could find about coreboot performance involves the lower POST times claims, +but there needs to be more information regarding its runtime performance as +measured in benchmarks, which is a significant point that end users are +interested in. Sadly, we need more internal resources and the necessary field +experience to conduct such exhaustive benchmark testing. Several significant +findings came from third-party benchmarks and community reports, which is +enough to know our current standing. Professional hardware reviewers should be +better at performing and analyzing measures than we are.

    +

    Why We Ask To Fine Tune Settings

    +

    In general, we found out in our limited benchmarking that performance +out-of-the-box with Dasharo is measurably lower than performance with MSI +proprietary firmware, in the order of 6-8% on the benchmarked Core i5 12600K. +Lower performance was quickly tracked down to MSI using, by default, certain +processor operating parameters that are quite different from the values stated +on the Intel datasheets, resulting in alterations of the processor behavior +that allows it to sustain Turbo Boost with higher clock speeds and for longer +periods than otherwise possible, and thus appear to perform better overall. +After normalizing across both MSI proprietary firmware and Dasharo, the values +we found were different, and the benchmark difference was reduced to around 2% +(21:19- 29:00).

    +

    We also found several review websites that have already written articles and +analysis about this matter. Mainboard vendors use default values above those +specified by Intel (technically overclocking) to produce better performance +results in benchmarks (AnandTech, TechSpot, +VideoCardz, Gamers Nexus about cheating, +GamersNexus about MSI default settings, GamersNexus Z490 +YouTube Review, TechPowerUp, Tom's +Hardware). Depending on whom you ask, using aggressive values by +default can be seen either as a convenience, since the end user gets more +performance without having to know how to configure the firmware, or as a form +of cheating, due to the end user usually having no idea about these changes and +that they are overclocking out-of-the-box. As for the time being, we're +sticking to Intel specification default values; these mainboard vendors' +custom optimizations hurts us because it makes the difference look much bigger +than it is.

    +

    What we want to showcase is how Dasharo (for this MSI port, coreboot + EDKII +UefiPayloadPkg) performance compares against the proprietary firmware codebase. +The only way to do so accurately is by ensuring that the hardware operating +values are the same in both Dasharo and the original firmware so that the +performance differences are not due to higher processor clock speeds thanks to +higher Power Limits, unlimited Turbo Boost times, or similar tricks. Note that +we are okay with out-of-the-box comparisons, but that wouldn't be directly an +apples-to-apples comparison of the performance of both firmware codebases, +which is our point. Thus, to make it fair, the hardware has to be tweaked to +run with the same operating values on both. As you can't change values on +Dasharo unless you're willing to recompile (or ask for a custom build with +tweaked values), the easiest way is by bringing MSI firmware values down to +Dasharo/Intel levels.

    +

    Find Your Processor Intel Default Parameters

    +

    So far we've found six processor-configurable parameters that differ +significantly: PL1, PL2, PL1 Tau, ICCMAX, DC_LL, and AC_LL. coreboot uses the +values found on two sections of the Intel 12th Generation Intel Core Processors +Datasheet (Volume 1 of 2). You will have to check the datasheet to find the +proper values for your processor so that you can manually input them onto MSI +firmware. In the case of MSI firmware default values, we found no public +information, so we only know how it autoconfigures the processors we tested. +Note that on the datasheet, Intel doesn't mention processor models by +name/number but instead classifies them by amount of P+E cores and Base Power +TDP, so first, you have to check these two values from Intel Ark for your +processor model, then check on the Datasheet tables what matches both classes +to get the Intel default values for the configurable parameters.

    +

    Here are examples covering the 12400, 12600K, 12900K and 12900KS (Processor +Line Thermal and Power - Package Turbo Specifications (S / HX - Processor +Lines) - S-Processor Line LGA) from this section of datasheet:

    +
      +
    • 12400 6+0 Core 65W PL1 = 65W PL2 = 117W PL1 Tau = 28s
    • +
    • 12600K 6+4 Core 125W PL1 = 125W PL2 = 150W PL1 Tau = 56s
    • +
    • 12900K 8+8 Core 125W PL1 = 125W PL2 = 241W PL1 Tau = 56s
    • +
    • 12900KS 8+8 Core 150W PL1 = 150W PL2 = 241W PL1 Tau = 56s
    • +
    +

    VCCCORE DC Specifications - Processor VCCCORE Active and Idle Mode DC Voltage +and Current Specifications - Segment S-Processor Line from this +section of datasheet:

    +
      +
    • 12400 S-Processor Line (65W) 6+0 -Core ICCMAX = 151A DC_LL/AC_LL = 1.7 mΩ (170)
    • +
    • 12600K S-Processor Line (125W) 6+4 -Core ICCMAX = 175A DC_LL/AC_LL = 1.7 mΩ (170)
    • +
    • 12900K S-Processor Line (125W) 8+8 -Core ICCMAX = 280A DC_LL/AC_LL = 1.1 mΩ (110)
    • +
    • 12900KS S-Processor Line (150W) 8+8 -Core ICCMAX = 280A DC_LL/AC_LL = 1.1 mΩ (110)1
    • +
    +

    On S-Processor Line, AC_LL is the same as DC_LL.

    +

    For reference, on a 12600K, the MSI 1.70 firmware on Auto with CPU Cooler +Tuning set to Boxed Cooler (lowest values for auto-configuration) uses the +following values vs. Dasharo/Intel defaults:

    +
      +
    • MSI BIOS 1.70 PL1 = 241W PL2 = 241W PL1 Tau = 56s ICCMAX = 250A DC_LL/AC_LL = 80
    • +
    • Dasharo 1.1.0 PL1 = 125W PL2 = 241W PL1 Tau = 56s ICCMAX = 175A DC_LL/AC_LL = 170
    • +
    +

    Configure MSI Firmware With Intel Default Parameters

    +

    After you have found your processor model values, you can input them on MSI +firmware. Most likely, you want to start from default settings.

    +

    Enter MSI Firmware, and change the following:

    +
      +
    • Settings Menu (Left Panel) -> Save & Exit
    • +
    • Restore Defaults (Confirm Yes)
    • +
    • Save Changes and Reboot (Confirm Yes)
    • +
    +

    +

    After the power off/on cycle, enter MSI firmware again, change the following +values, then repeat Save Changes and Reboot:

    +
      +
    • OC Menu (Left Panel) -> Advanced CPU Configuration
        +
      • Enhanced Turbo: Disabled (This is MSI name for Multi Core Enhancement)
      • +
      • Long Duration Power Limit(W): PL1
      • +
      • Long Duration Maintained(s): PL1 Tau
      • +
      • Short Duration Power Limit(W): PL2
      • +
      • CPU Current Limit (A): ICCMAX
      • +
      • CPU Lite Load Control: Advanced (Required to input DC_LL and AC_LL as + numbers instead of "Modes")
      • +
      • CPU AC Loadline: AC_LL
      • +
      • CPU DC Loadline: DC_LL
      • +
      +
    • +
    +

    +

    +

    Miscellaneous Comments

    +
      +
    • Since you can software flash Dasharo and flash MSI firmware again on the same + system, you likely want to use the same computer to test both firmware so + that no temperature or clock speeds difference could attribute to different + pressure on heatsink mounting or silicon lottery.
    • +
    • MSI firmware bases its default (Auto) PL1, PL2, and ICCMAX values on the CPU + Cooler Tuning set. When using Restore Defaults on a 12600K, this setting + defaults to Water Cooler, which allows for technically unlimited PL1 and PL2 + (4095W). Even the Boxed Cooler setting configures the 12600K to 241W PL1 and + 241W PL2. Thus, you must manually set the individual values for controlled + results.
    • +
    • So far, the setting that most affected benchmark scores are AC_LL and DC_LL. + PL1, PL2 and ICCMAX are limiting. They are only meaningful if the processor + gets limited by them, which would depend on the processor model (some have more + headroom than others. PL1 is 125W for both 6+4 12600K and 8+8 12900K, the + latter would be severely more limited), whereas the other two values are always + in effect.
    • +
    +

    On the tested 12600K, the effect of the significantly lower values of AC_LL on +DC_LL that MSI uses is a rather massive difference of 20 Watts in power +consumption (as reported by ThrottleStop and HWiNFO, and also by lower +processor temperatures) when running Cinebench R23. Thus, with MSI values +(whenever on MSI or a custom Dasharo build with those), the 12600K doesn't even +reach the PL1 limit, allowing it to maintain the highest Turbo Boost clock +speeds infinitely, whereas, on Dasharo (or MSI with Intel default values), the +extra power consumption makes it to go beyond PL1, eventually throttling back +to slower clocks to keep under PL1.

    +
      +
    • LCC (Loadline Calibration Control) is also present in another menu as CPU + Loadline Calibration Control, but we left it at Auto. We need to find out if + changes in CPU Lite Load Control / CPU AC Loadline / CPU DC Loadline change it + or if LCC operates the same regardless of changes to the previous options.
    • +
    • The most critical performance-related bug we found in Dasharo involves + benchmarking Single Thread applications on Windows 11. With Dasharo, Windows + 11 CPU Scheduler likes to move threads around between P and E cores, whereas + MSI firmware on the same scenario instead always favors P cores. Such behavior + significantly affects the scores of Single-Threaded benchmarks and makes them + highly variable depending on which core type a thread spent most of its time. + There may be MSRs (Model Specific Registers) related to Intel Thread Director + that we aren't aware of that manages this. The only workaround found is to set + CPU Affinity manually, which can be performed automatically with Process Lasso, + with the bonus of using Forced Mode to continuously re-apply the CPU Affinity + settings, as some applications, including Cinebench, like to change them when + you start to run the benchmark. Of course, this will not happen on P core, only + models like 12400. We did not test manual affinity tested on Linux.
    • +
    • Dasharo currently doesn't support manually changing the memory clock speeds, + and it will default to the highest standard JEDEC profile supported by the + installed memory modules. MSI firmware also defaults to JEDEC profiles, so + out-of-the-box, they're matched at memory configuration, thus not a problem. + Many enthusiast-grade DDR4 modules use 3200 MHz (maximum supported by Alder + Lake-S) or higher and have that clock speed as an XMP profile, whereas the + standard JEDEC profile could be just 2133 or 2400 MHz. In most cases, a 3200 + MHz DDR4 module will run at lower speeds than expected. There are modules rated + for JEDEC 3200 MHz 22-22-22 @ 1.2V that should work in both Dasharo and MSI + firmware, in case you're interested in testing this. It is also possible to + force Dasharo to use an XMP profile if you're willing to recompile or use a + custom build.
    • +
    • There are a lot of other settings and MSRs (Model Specific Registers) that we + have yet to test. We track the progress of that effort in this + issue. Public Alder Lake FSP Integration Guide documents how to set + these settings On or Off, but there are few details about how they change the + Processor behavior. The remaining 2% of performance will come from matching all + these settings.
    • +
    +
    +
    +
      +
    1. +

      On the public datasheet, there is no DC_LL for the 8+8 150W class, only + 8+8 125W, but we can confirm from alternate sources that this is the correct +value. 

      +
    2. +
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/guides/images/msi_1-70__cpu-defaults.jpg b/guides/images/msi_1-70__cpu-defaults.jpg new file mode 100644 index 00000000000..58197ef932b Binary files /dev/null and b/guides/images/msi_1-70__cpu-defaults.jpg differ diff --git a/guides/images/msi_1-70__cpu-manual.jpg b/guides/images/msi_1-70__cpu-manual.jpg new file mode 100644 index 00000000000..a5a48063f5a Binary files /dev/null and b/guides/images/msi_1-70__cpu-manual.jpg differ diff --git a/guides/images/msi_1-70__cpu-save-and-exit.jpg b/guides/images/msi_1-70__cpu-save-and-exit.jpg new file mode 100644 index 00000000000..f2197f06843 Binary files /dev/null and b/guides/images/msi_1-70__cpu-save-and-exit.jpg differ diff --git a/guides/logo-customization/index.html b/guides/logo-customization/index.html new file mode 100644 index 00000000000..4c1cdbff454 --- /dev/null +++ b/guides/logo-customization/index.html @@ -0,0 +1,5926 @@ + + + + + + + + + + + + + + + + + + Logo customization - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Boot logo replacement instructions

    +

    Introduction

    +

    The logo displayed at boot can be customized according to the client's +preferences. For this, we have created a script that automates the process of +replacing the logo.

    +

    Prerequisites

    +

    The image file must fulfill a number of requirements:

    +
      +
    • Bitmap (BMP file)
    • +
    • Recommended resolution up to 577×432, but can be higher if it fits in the +BOOTSPLASH region.
    • +
    • indexed or 24bit RGB colors
    • +
    • uncompressed
    • +
    • preferably containing a simple logo on a black background with no additional +padding.
    • +
    • make sure it is properly formatted. To be sure, use the command:
    • +
    +
    convert -background None custom_logo.bmp BMP3:logo.bmp
    +
    +

    Replace logo in an existing image

    +

    For devices supporting persistent bootlogo, it's possible to replace the logo +without rebuilding firmware from scratch. You only need the firmware image +and cbfstool.

    +
      +
    1. +

      Obtain cbfstool source code (skip if you've already cloned the coreboot + source):

      +
      git clone https://github.com/Dasharo/coreboot.git
      +
      +
    2. +
    3. +

      Build and install cbfstool:

      +
      cd coreboot/util/cbfstool
      +git checkout 912a262b7bf7cb49544f90cdb5c632b658918893
      +make
      +sudo make install
      +
      +
    4. +
    5. +

      Remove the existing logo from the firmware image (replace [path] with the + path to your firmware binary):

      +
      cbfstool [path] remove -r BOOTSPLASH -n logo.bmp
      +
      +
    6. +
    7. +

      Add your desired bootlogo to the firmware image (replace [path] with the + path to your firmware image and [logo] with the path to the logo):

      +
      cbfstool [path] add -f [logo] -r BOOTSPLASH -n logo.bmp -t raw -c lzma
      +
      +
    8. +
    9. +

      Now you can flash the updated firmware image as usual. If you're not + updating firmware and just changing the logo, only the BOOTSPLASH region + needs to be updated. For example:

      +
      sudo flashrom -p internal --fmap -i BOOTSPLASH -w [path]
      +
      +
    10. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/guides/vboot-signing/index.html b/guides/vboot-signing/index.html new file mode 100644 index 00000000000..67905e30098 --- /dev/null +++ b/guides/vboot-signing/index.html @@ -0,0 +1,5966 @@ + + + + + + + + + + + + + + + + + + Firmware signing for vboot - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo vboot signing

    +

    Introduction

    +

    Verified Boot is a method of verifying that the firmware compents haven't been +tampered with. It uses cryptographic signatures to determine whether the +firmware comes from trusted source. This document covers the procedure for +generating vboot keys and configuring the coreboot build system to sign the +binaries with the generated keys.

    +

    Prerequisites

    + +
    git clone https://github.com/Dasharo/dasharo-tools.git
    +
    +

    Generating keys

    +
    +

    Make sure that you are in the dasharo-tools repository

    +
    +

    Generate the keys with the following command:

    +
    ./vboot/generate_keys keys
    +
    +

    The keys will be created in the directory $PWD/keys, i.e. in the keys +subdirectory in your current directory.

    +

    Signing image without rebuilding

    +

    This is the default procedure that should be followed by users downloading +firmware from the Release section, who wishes to use their own keys for +vboot.

    +
    +

    Make sure that you are in the dasharo-tools repository

    +
    +

    Be sure you have generated the keys as in Generate keys +section. Assuming you have generated keys to the keys/ directory:

    +
    ./vboot/resign <released_firmware_file> keys
    +
    +

    For example:

    +
    ./vboot/resign protectli_vault_cml_v1.0.16_resigned.rom keys
    +
    +

    The successful output can look like this:

    +
    ...
    +INFO: sign_bios_at_end: BIOS image does not have FW_MAIN_B. Signing only FW_MAIN_A
    + - import root_key from /.../keys/root_key.vbpubk: success
    + - import recovery_key from /.../keys/recovery_key.vbpubk: success
    +successfully saved new image to: /.../protectli_vault_cml_v1.0.16_resigned.rom
    +The /.../protectli_vault_cml_v1.0.16.rom was resigned and saved as: /.../protectli_vault_cml_v1.0.16_resigned.rom
    +
    +

    Now the image will be signed with your own keys. Be sure to save the keys in a +safe location, because you will need them to sign each firmware update. +Otherwise, the firmware updates to RW partitions will not be executed by vboot.

    +

    Adding keys to the coreboot config

    +
    +

    This procedure is only meant for developers or when you are rebuilding +firmware by yourself.

    +
    +

    In the root of the coreboot tree, execute the following command:

    +
    make nconfig
    +
    +

    Navigate to Security -> Verified Boot (vboot) -> Vboot keys and enter the +paths to the keys in the appropriate fields.

    +

    Exit nconfig by pressing Esc repeatedly and pressing Enter when prompted +to save the configuration.

    +

    Now, rebuild coreboot with this config to generate images signed with the chosen +vboot keys.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/images/NS51-front-1.jpg b/images/NS51-front-1.jpg new file mode 100644 index 00000000000..506b60ec595 Binary files /dev/null and b/images/NS51-front-1.jpg differ diff --git a/images/NV4x-front-1.jpg b/images/NV4x-front-1.jpg new file mode 100644 index 00000000000..33427c4980a Binary files /dev/null and b/images/NV4x-front-1.jpg differ diff --git a/images/OFF.svg b/images/OFF.svg new file mode 100644 index 00000000000..09eab454208 --- /dev/null +++ b/images/OFF.svg @@ -0,0 +1,123 @@ + + + + diff --git a/images/SD-Wire.jpg b/images/SD-Wire.jpg new file mode 100644 index 00000000000..aaace0daccd Binary files /dev/null and b/images/SD-Wire.jpg differ diff --git a/images/SD-wire_PCB_elements_1.jpg b/images/SD-wire_PCB_elements_1.jpg new file mode 100644 index 00000000000..b79baf2ef0f Binary files /dev/null and b/images/SD-wire_PCB_elements_1.jpg differ diff --git a/images/SD-wire_PCB_elements_2.jpg b/images/SD-wire_PCB_elements_2.jpg new file mode 100644 index 00000000000..92d28c5cac5 Binary files /dev/null and b/images/SD-wire_PCB_elements_2.jpg differ diff --git a/images/SD-wire_leds.jpg b/images/SD-wire_leds.jpg new file mode 100644 index 00000000000..54f9e8ab821 Binary files /dev/null and b/images/SD-wire_leds.jpg differ diff --git a/images/SD-wire_scheme-1.jpg b/images/SD-wire_scheme-1.jpg new file mode 100644 index 00000000000..7f9629e4abc Binary files /dev/null and b/images/SD-wire_scheme-1.jpg differ diff --git a/images/VP2410.png b/images/VP2410.png new file mode 100644 index 00000000000..7fa2c58c097 Binary files /dev/null and b/images/VP2410.png differ diff --git a/images/VP2420.png b/images/VP2420.png new file mode 100644 index 00000000000..7fa2c58c097 Binary files /dev/null and b/images/VP2420.png differ diff --git a/images/VP4630_banner-1.jpg b/images/VP4630_banner-1.jpg new file mode 100644 index 00000000000..e1cc71c3596 Binary files /dev/null and b/images/VP4630_banner-1.jpg differ diff --git a/images/case_open1.jpg b/images/case_open1.jpg new file mode 100644 index 00000000000..b14ca6bacdf Binary files /dev/null and b/images/case_open1.jpg differ diff --git a/images/case_open2.jpg b/images/case_open2.jpg new file mode 100644 index 00000000000..68b6a104074 Binary files /dev/null and b/images/case_open2.jpg differ diff --git a/images/ch341a_rec/adapter_assemble.jpg b/images/ch341a_rec/adapter_assemble.jpg new file mode 100644 index 00000000000..cb11c14d279 Binary files /dev/null and b/images/ch341a_rec/adapter_assemble.jpg differ diff --git a/images/ch341a_rec/adapter_shifter.jpg b/images/ch341a_rec/adapter_shifter.jpg new file mode 100644 index 00000000000..1ef944a0ad8 Binary files /dev/null and b/images/ch341a_rec/adapter_shifter.jpg differ diff --git a/images/ch341a_rec/breakout_assemble.jpg b/images/ch341a_rec/breakout_assemble.jpg new file mode 100644 index 00000000000..3e08786601f Binary files /dev/null and b/images/ch341a_rec/breakout_assemble.jpg differ diff --git a/images/ch341a_rec/ch341a.jpg b/images/ch341a_rec/ch341a.jpg new file mode 100644 index 00000000000..614b876c6d0 Binary files /dev/null and b/images/ch341a_rec/ch341a.jpg differ diff --git a/images/ch341a_rec/ch341a_kit.jpg b/images/ch341a_rec/ch341a_kit.jpg new file mode 100644 index 00000000000..249b2845334 Binary files /dev/null and b/images/ch341a_rec/ch341a_kit.jpg differ diff --git a/images/ch341a_rec/msi_flash.jpg b/images/ch341a_rec/msi_flash.jpg new file mode 100644 index 00000000000..bda0cd08de0 Binary files /dev/null and b/images/ch341a_rec/msi_flash.jpg differ diff --git a/images/ch341a_rec/msi_z690a.jpg b/images/ch341a_rec/msi_z690a.jpg new file mode 100644 index 00000000000..53c603f5e1a Binary files /dev/null and b/images/ch341a_rec/msi_z690a.jpg differ diff --git a/images/ch341a_rec/pin_breakout.jpg b/images/ch341a_rec/pin_breakout.jpg new file mode 100644 index 00000000000..5ff567be75e Binary files /dev/null and b/images/ch341a_rec/pin_breakout.jpg differ diff --git a/images/ch341a_rec/probe_attach.jpg b/images/ch341a_rec/probe_attach.jpg new file mode 100644 index 00000000000..38e86d1d797 Binary files /dev/null and b/images/ch341a_rec/probe_attach.jpg differ diff --git a/images/ch341a_rec/usb_ext.jpg b/images/ch341a_rec/usb_ext.jpg new file mode 100644 index 00000000000..7ac34924a7c Binary files /dev/null and b/images/ch341a_rec/usb_ext.jpg differ diff --git a/images/ch341a_rec/wire_attach1.jpg b/images/ch341a_rec/wire_attach1.jpg new file mode 100644 index 00000000000..0c141bc4f9a Binary files /dev/null and b/images/ch341a_rec/wire_attach1.jpg differ diff --git a/images/ch341a_rec/wire_attach2.jpg b/images/ch341a_rec/wire_attach2.jpg new file mode 100644 index 00000000000..76f68298a5f Binary files /dev/null and b/images/ch341a_rec/wire_attach2.jpg differ diff --git a/images/ch341a_rec/wson8_probe.jpg b/images/ch341a_rec/wson8_probe.jpg new file mode 100644 index 00000000000..6fd4853336d Binary files /dev/null and b/images/ch341a_rec/wson8_probe.jpg differ diff --git a/images/ch341a_rec/wson8_probe2.jpg b/images/ch341a_rec/wson8_probe2.jpg new file mode 100644 index 00000000000..8b079fa4058 Binary files /dev/null and b/images/ch341a_rec/wson8_probe2.jpg differ diff --git a/images/checkbox_aut_login.jpg b/images/checkbox_aut_login.jpg new file mode 100644 index 00000000000..729fbcbe863 Binary files /dev/null and b/images/checkbox_aut_login.jpg differ diff --git a/images/clip_connected.jpg b/images/clip_connected.jpg new file mode 100644 index 00000000000..7dd15098302 Binary files /dev/null and b/images/clip_connected.jpg differ diff --git a/images/clip_downside.jpg b/images/clip_downside.jpg new file mode 100644 index 00000000000..3b8a125afbf Binary files /dev/null and b/images/clip_downside.jpg differ diff --git a/images/clip_upside.jpg b/images/clip_upside.jpg new file mode 100644 index 00000000000..01d78d35814 Binary files /dev/null and b/images/clip_upside.jpg differ diff --git a/images/dasharo-black.jpg b/images/dasharo-black.jpg new file mode 100644 index 00000000000..76bdf76ee1e Binary files /dev/null and b/images/dasharo-black.jpg differ diff --git a/images/dasharo-logo.png b/images/dasharo-logo.png new file mode 100644 index 00000000000..e9715cd4f11 Binary files /dev/null and b/images/dasharo-logo.png differ diff --git a/images/dell_optiplex_9010.jpg b/images/dell_optiplex_9010.jpg new file mode 100644 index 00000000000..9e07ef441fa Binary files /dev/null and b/images/dell_optiplex_9010.jpg differ diff --git a/images/dell_optiplex_9010_spi_pin1.jpg b/images/dell_optiplex_9010_spi_pin1.jpg new file mode 100644 index 00000000000..5d67e797997 Binary files /dev/null and b/images/dell_optiplex_9010_spi_pin1.jpg differ diff --git a/images/dell_optiplex_uefi_mode.jpg b/images/dell_optiplex_uefi_mode.jpg new file mode 100644 index 00000000000..424268e95a3 Binary files /dev/null and b/images/dell_optiplex_uefi_mode.jpg differ diff --git a/images/disk_dock_open1.jpg b/images/disk_dock_open1.jpg new file mode 100644 index 00000000000..74dae5897dd Binary files /dev/null and b/images/disk_dock_open1.jpg differ diff --git a/images/disk_dock_open2.jpg b/images/disk_dock_open2.jpg new file mode 100644 index 00000000000..77cad63b31d Binary files /dev/null and b/images/disk_dock_open2.jpg differ diff --git a/images/disk_dock_open3.jpg b/images/disk_dock_open3.jpg new file mode 100644 index 00000000000..e87d483876e Binary files /dev/null and b/images/disk_dock_open3.jpg differ diff --git a/images/disk_dock_open4.jpg b/images/disk_dock_open4.jpg new file mode 100644 index 00000000000..f80b72c87d0 Binary files /dev/null and b/images/disk_dock_open4.jpg differ diff --git a/images/ecosystem_overview.jpg b/images/ecosystem_overview.jpg new file mode 100644 index 00000000000..fb2fd8ee682 Binary files /dev/null and b/images/ecosystem_overview.jpg differ diff --git a/images/favicon.png b/images/favicon.png new file mode 100644 index 00000000000..33a6aa5c78c Binary files /dev/null and b/images/favicon.png differ diff --git a/images/fpt.jpg b/images/fpt.jpg new file mode 100644 index 00000000000..97a7ea2fc53 Binary files /dev/null and b/images/fpt.jpg differ diff --git a/images/gpu_activity_win10.jpg b/images/gpu_activity_win10.jpg new file mode 100644 index 00000000000..cc98d9c5e53 Binary files /dev/null and b/images/gpu_activity_win10.jpg differ diff --git a/images/hmrfpo_setup.jpg b/images/hmrfpo_setup.jpg new file mode 100644 index 00000000000..2e4876f14b9 Binary files /dev/null and b/images/hmrfpo_setup.jpg differ diff --git a/images/idc-sd-cable.jpg b/images/idc-sd-cable.jpg new file mode 100644 index 00000000000..41ad83f7aa8 Binary files /dev/null and b/images/idc-sd-cable.jpg differ diff --git a/images/ipxe_upload.jpg b/images/ipxe_upload.jpg new file mode 100644 index 00000000000..4be2ed08cf2 Binary files /dev/null and b/images/ipxe_upload.jpg differ diff --git a/images/ipxe_uploaded.jpg b/images/ipxe_uploaded.jpg new file mode 100644 index 00000000000..359ca882256 Binary files /dev/null and b/images/ipxe_uploaded.jpg differ diff --git a/images/jsm_add_request.jpg b/images/jsm_add_request.jpg new file mode 100644 index 00000000000..021756c3195 Binary files /dev/null and b/images/jsm_add_request.jpg differ diff --git a/images/jsm_view_requests.jpg b/images/jsm_view_requests.jpg new file mode 100644 index 00000000000..191d64a20ea Binary files /dev/null and b/images/jsm_view_requests.jpg differ diff --git a/images/jsm_workflow.jpg b/images/jsm_workflow.jpg new file mode 100644 index 00000000000..ad1355dcb00 Binary files /dev/null and b/images/jsm_workflow.jpg differ diff --git a/images/kgpe_1.jpg b/images/kgpe_1.jpg new file mode 100644 index 00000000000..d1c12b2c4a0 Binary files /dev/null and b/images/kgpe_1.jpg differ diff --git a/images/kgpe_2.jpg b/images/kgpe_2.jpg new file mode 100644 index 00000000000..50bda50d928 Binary files /dev/null and b/images/kgpe_2.jpg differ diff --git a/images/kgpe_3.jpg b/images/kgpe_3.jpg new file mode 100644 index 00000000000..f683386bb1d Binary files /dev/null and b/images/kgpe_3.jpg differ diff --git a/images/kgpe_front_panel.jpg b/images/kgpe_front_panel.jpg new file mode 100644 index 00000000000..957a47cb981 Binary files /dev/null and b/images/kgpe_front_panel.jpg differ diff --git a/images/kgpe_overview.jpg b/images/kgpe_overview.jpg new file mode 100644 index 00000000000..825163628d1 Binary files /dev/null and b/images/kgpe_overview.jpg differ diff --git a/images/kgpe_rear_panel.jpg b/images/kgpe_rear_panel.jpg new file mode 100644 index 00000000000..a471fd383e3 Binary files /dev/null and b/images/kgpe_rear_panel.jpg differ diff --git a/images/kgpe_tpm_header.jpg b/images/kgpe_tpm_header.jpg new file mode 100644 index 00000000000..6f389606aa4 Binary files /dev/null and b/images/kgpe_tpm_header.jpg differ diff --git a/images/logo/logo-bar.svg b/images/logo/logo-bar.svg new file mode 100644 index 00000000000..1cd93c1791c --- /dev/null +++ b/images/logo/logo-bar.svg @@ -0,0 +1,103 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/images/logo/logo-basic.svg b/images/logo/logo-basic.svg new file mode 100644 index 00000000000..5c6833572cb --- /dev/null +++ b/images/logo/logo-basic.svg @@ -0,0 +1,103 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/images/menus/add_boot_opt.jpeg b/images/menus/add_boot_opt.jpeg new file mode 100644 index 00000000000..c684fc13b8d Binary files /dev/null and b/images/menus/add_boot_opt.jpeg differ diff --git a/images/menus/add_boot_opt2.jpeg b/images/menus/add_boot_opt2.jpeg new file mode 100644 index 00000000000..196ba803171 Binary files /dev/null and b/images/menus/add_boot_opt2.jpeg differ diff --git a/images/menus/add_boot_opt3.jpeg b/images/menus/add_boot_opt3.jpeg new file mode 100644 index 00000000000..3dc8427d4ab Binary files /dev/null and b/images/menus/add_boot_opt3.jpeg differ diff --git a/images/menus/boot_maint_mgr.jpeg b/images/menus/boot_maint_mgr.jpeg new file mode 100644 index 00000000000..75d89b8fe50 Binary files /dev/null and b/images/menus/boot_maint_mgr.jpeg differ diff --git a/images/menus/boot_manager.jpeg b/images/menus/boot_manager.jpeg new file mode 100644 index 00000000000..0167be4959f Binary files /dev/null and b/images/menus/boot_manager.jpeg differ diff --git a/images/menus/boot_opts.jpeg b/images/menus/boot_opts.jpeg new file mode 100644 index 00000000000..076795aaf00 Binary files /dev/null and b/images/menus/boot_opts.jpeg differ diff --git a/images/menus/boot_order.jpeg b/images/menus/boot_order.jpeg new file mode 100644 index 00000000000..3ce48724398 Binary files /dev/null and b/images/menus/boot_order.jpeg differ diff --git a/images/menus/boot_order2.jpeg b/images/menus/boot_order2.jpeg new file mode 100644 index 00000000000..f6ee2dfeeb4 Binary files /dev/null and b/images/menus/boot_order2.jpeg differ diff --git a/images/menus/console_opts.jpeg b/images/menus/console_opts.jpeg new file mode 100644 index 00000000000..bd7e28b1366 Binary files /dev/null and b/images/menus/console_opts.jpeg differ diff --git a/images/menus/dasharo_chipset_opts.jpeg b/images/menus/dasharo_chipset_opts.jpeg new file mode 100644 index 00000000000..58a24cf99a1 Binary files /dev/null and b/images/menus/dasharo_chipset_opts.jpeg differ diff --git a/images/menus/dasharo_features.jpeg b/images/menus/dasharo_features.jpeg new file mode 100644 index 00000000000..c531098c7e9 Binary files /dev/null and b/images/menus/dasharo_features.jpeg differ diff --git a/images/menus/dasharo_net_opts.jpeg b/images/menus/dasharo_net_opts.jpeg new file mode 100644 index 00000000000..0489f50c39b Binary files /dev/null and b/images/menus/dasharo_net_opts.jpeg differ diff --git a/images/menus/dasharo_power_opts.jpeg b/images/menus/dasharo_power_opts.jpeg new file mode 100644 index 00000000000..d68cd35d4ce Binary files /dev/null and b/images/menus/dasharo_power_opts.jpeg differ diff --git a/images/menus/dasharo_sec_opts.jpeg b/images/menus/dasharo_sec_opts.jpeg new file mode 100644 index 00000000000..e18fa019873 Binary files /dev/null and b/images/menus/dasharo_sec_opts.jpeg differ diff --git a/images/menus/dasharo_usb_opts.jpeg b/images/menus/dasharo_usb_opts.jpeg new file mode 100644 index 00000000000..e2b83994324 Binary files /dev/null and b/images/menus/dasharo_usb_opts.jpeg differ diff --git a/images/menus/del_boot_opt.jpeg b/images/menus/del_boot_opt.jpeg new file mode 100644 index 00000000000..24eef5d948a Binary files /dev/null and b/images/menus/del_boot_opt.jpeg differ diff --git a/images/menus/dev_mgr.jpeg b/images/menus/dev_mgr.jpeg new file mode 100644 index 00000000000..4334a78fe97 Binary files /dev/null and b/images/menus/dev_mgr.jpeg differ diff --git a/images/menus/driver_opts.jpeg b/images/menus/driver_opts.jpeg new file mode 100644 index 00000000000..64e93594c19 Binary files /dev/null and b/images/menus/driver_opts.jpeg differ diff --git a/images/menus/hdd_passwd.jpeg b/images/menus/hdd_passwd.jpeg new file mode 100644 index 00000000000..592fa3bb26e Binary files /dev/null and b/images/menus/hdd_passwd.jpeg differ diff --git a/images/menus/hdd_passwd2.jpeg b/images/menus/hdd_passwd2.jpeg new file mode 100644 index 00000000000..b1129f89e00 Binary files /dev/null and b/images/menus/hdd_passwd2.jpeg differ diff --git a/images/menus/hdd_passwd3.jpeg b/images/menus/hdd_passwd3.jpeg new file mode 100644 index 00000000000..40ee3f36afd Binary files /dev/null and b/images/menus/hdd_passwd3.jpeg differ diff --git a/images/menus/hdd_passwd4.jpeg b/images/menus/hdd_passwd4.jpeg new file mode 100644 index 00000000000..ef1bae22cec Binary files /dev/null and b/images/menus/hdd_passwd4.jpeg differ diff --git a/images/menus/health_mgr.jpeg b/images/menus/health_mgr.jpeg new file mode 100644 index 00000000000..25b7edea1db Binary files /dev/null and b/images/menus/health_mgr.jpeg differ diff --git a/images/menus/main_page.jpeg b/images/menus/main_page.jpeg new file mode 100644 index 00000000000..47865f748be Binary files /dev/null and b/images/menus/main_page.jpeg differ diff --git a/images/menus/me_menu.jpeg b/images/menus/me_menu.jpeg new file mode 100644 index 00000000000..1737117adc2 Binary files /dev/null and b/images/menus/me_menu.jpeg differ diff --git a/images/menus/me_menu2.jpeg b/images/menus/me_menu2.jpeg new file mode 100644 index 00000000000..2bfa392aa2b Binary files /dev/null and b/images/menus/me_menu2.jpeg differ diff --git a/images/menus/net_dev_list.jpeg b/images/menus/net_dev_list.jpeg new file mode 100644 index 00000000000..c1f625424fe Binary files /dev/null and b/images/menus/net_dev_list.jpeg differ diff --git a/images/menus/net_dev_list2.jpeg b/images/menus/net_dev_list2.jpeg new file mode 100644 index 00000000000..726150fa1a9 Binary files /dev/null and b/images/menus/net_dev_list2.jpeg differ diff --git a/images/menus/net_dev_list3.jpeg b/images/menus/net_dev_list3.jpeg new file mode 100644 index 00000000000..1ebe976e84c Binary files /dev/null and b/images/menus/net_dev_list3.jpeg differ diff --git a/images/menus/one_time_boot.jpeg b/images/menus/one_time_boot.jpeg new file mode 100644 index 00000000000..ffa6f5c68a3 Binary files /dev/null and b/images/menus/one_time_boot.jpeg differ diff --git a/images/menus/one_time_boot2.jpeg b/images/menus/one_time_boot2.jpeg new file mode 100644 index 00000000000..0617e754eac Binary files /dev/null and b/images/menus/one_time_boot2.jpeg differ diff --git a/images/menus/one_time_boot3.jpeg b/images/menus/one_time_boot3.jpeg new file mode 100644 index 00000000000..9ebb1d42feb Binary files /dev/null and b/images/menus/one_time_boot3.jpeg differ diff --git a/images/menus/password_mgr.jpeg b/images/menus/password_mgr.jpeg new file mode 100644 index 00000000000..62eea6f79f3 Binary files /dev/null and b/images/menus/password_mgr.jpeg differ diff --git a/images/menus/secure_boot.jpeg b/images/menus/secure_boot.jpeg new file mode 100644 index 00000000000..ea72e797a2c Binary files /dev/null and b/images/menus/secure_boot.jpeg differ diff --git a/images/menus/secure_boot_custom.jpeg b/images/menus/secure_boot_custom.jpeg new file mode 100644 index 00000000000..9a90d420ea3 Binary files /dev/null and b/images/menus/secure_boot_custom.jpeg differ diff --git a/images/menus/secure_boot_custom_options.jpeg b/images/menus/secure_boot_custom_options.jpeg new file mode 100644 index 00000000000..7449e56897c Binary files /dev/null and b/images/menus/secure_boot_custom_options.jpeg differ diff --git a/images/menus/sol_error1.jpg b/images/menus/sol_error1.jpg new file mode 100644 index 00000000000..e66f727feeb Binary files /dev/null and b/images/menus/sol_error1.jpg differ diff --git a/images/menus/sol_error2.jpg b/images/menus/sol_error2.jpg new file mode 100644 index 00000000000..b479d3bd769 Binary files /dev/null and b/images/menus/sol_error2.jpg differ diff --git a/images/menus/tcg2_actions.jpeg b/images/menus/tcg2_actions.jpeg new file mode 100644 index 00000000000..d2403c6e51e Binary files /dev/null and b/images/menus/tcg2_actions.jpeg differ diff --git a/images/menus/tcg2_config.jpeg b/images/menus/tcg2_config.jpeg new file mode 100644 index 00000000000..8c92b7e99a9 Binary files /dev/null and b/images/menus/tcg2_config.jpeg differ diff --git a/images/menus/tcg2_config2.jpeg b/images/menus/tcg2_config2.jpeg new file mode 100644 index 00000000000..326ffaf6c8a Binary files /dev/null and b/images/menus/tcg2_config2.jpeg differ diff --git a/images/menus/tcg2_config3.jpeg b/images/menus/tcg2_config3.jpeg new file mode 100644 index 00000000000..3b2750d9227 Binary files /dev/null and b/images/menus/tcg2_config3.jpeg differ diff --git a/images/menus/tcg_opal.jpeg b/images/menus/tcg_opal.jpeg new file mode 100644 index 00000000000..cd951bd66ec Binary files /dev/null and b/images/menus/tcg_opal.jpeg differ diff --git a/images/menus/tcg_opal2.jpeg b/images/menus/tcg_opal2.jpeg new file mode 100644 index 00000000000..2f98c06eccf Binary files /dev/null and b/images/menus/tcg_opal2.jpeg differ diff --git a/images/menus/tcg_opal3.jpeg b/images/menus/tcg_opal3.jpeg new file mode 100644 index 00000000000..40c3633c143 Binary files /dev/null and b/images/menus/tcg_opal3.jpeg differ diff --git a/images/menus/tcg_opal4.jpeg b/images/menus/tcg_opal4.jpeg new file mode 100644 index 00000000000..6cee3aa772d Binary files /dev/null and b/images/menus/tcg_opal4.jpeg differ diff --git a/images/msi_mac.jpg b/images/msi_mac.jpg new file mode 100644 index 00000000000..be48b965af4 Binary files /dev/null and b/images/msi_mac.jpg differ diff --git a/images/msi_sn_qr.jpg b/images/msi_sn_qr.jpg new file mode 100644 index 00000000000..26800843312 Binary files /dev/null and b/images/msi_sn_qr.jpg differ diff --git a/images/muxPi-addon-left.jpg b/images/muxPi-addon-left.jpg new file mode 100644 index 00000000000..46a46743e75 Binary files /dev/null and b/images/muxPi-addon-left.jpg differ diff --git a/images/muxPi-addon-right.jpg b/images/muxPi-addon-right.jpg new file mode 100644 index 00000000000..be03ef60f9b Binary files /dev/null and b/images/muxPi-addon-right.jpg differ diff --git a/images/muxPi-block-diagram.jpg b/images/muxPi-block-diagram.jpg new file mode 100644 index 00000000000..e35d1c28f94 Binary files /dev/null and b/images/muxPi-block-diagram.jpg differ diff --git a/images/muxPi-board-bottom.jpg b/images/muxPi-board-bottom.jpg new file mode 100644 index 00000000000..57e55bd0711 Binary files /dev/null and b/images/muxPi-board-bottom.jpg differ diff --git a/images/muxPi-connectors.jpg b/images/muxPi-connectors.jpg new file mode 100644 index 00000000000..4e1502f962f Binary files /dev/null and b/images/muxPi-connectors.jpg differ diff --git a/images/muxPi-dypers.jpg b/images/muxPi-dypers.jpg new file mode 100644 index 00000000000..e46cefe293c Binary files /dev/null and b/images/muxPi-dypers.jpg differ diff --git a/images/muxPi-eth.jpg b/images/muxPi-eth.jpg new file mode 100644 index 00000000000..75b4f6a19db Binary files /dev/null and b/images/muxPi-eth.jpg differ diff --git a/images/muxPi-jumpers.jpg b/images/muxPi-jumpers.jpg new file mode 100644 index 00000000000..fadea9b7fe9 Binary files /dev/null and b/images/muxPi-jumpers.jpg differ diff --git a/images/muxPi-pin-connectors.jpg b/images/muxPi-pin-connectors.jpg new file mode 100644 index 00000000000..d95ce28caa2 Binary files /dev/null and b/images/muxPi-pin-connectors.jpg differ diff --git a/images/muxPi-power.jpg b/images/muxPi-power.jpg new file mode 100644 index 00000000000..606e8f90b38 Binary files /dev/null and b/images/muxPi-power.jpg differ diff --git a/images/muxPi-sd.jpg b/images/muxPi-sd.jpg new file mode 100644 index 00000000000..729a0baa850 Binary files /dev/null and b/images/muxPi-sd.jpg differ diff --git a/images/muxPi-uart.jpg b/images/muxPi-uart.jpg new file mode 100644 index 00000000000..fd813d40455 Binary files /dev/null and b/images/muxPi-uart.jpg differ diff --git a/images/muxPi-usb-m.jpg b/images/muxPi-usb-m.jpg new file mode 100644 index 00000000000..d626003c0d1 Binary files /dev/null and b/images/muxPi-usb-m.jpg differ diff --git a/images/muxPi-user-ui.jpg b/images/muxPi-user-ui.jpg new file mode 100644 index 00000000000..82f02047a68 Binary files /dev/null and b/images/muxPi-user-ui.jpg differ diff --git a/images/muxpi1.4.jpg b/images/muxpi1.4.jpg new file mode 100644 index 00000000000..db947469cc3 Binary files /dev/null and b/images/muxpi1.4.jpg differ diff --git a/images/muxpi1.4_connection.jpg b/images/muxpi1.4_connection.jpg new file mode 100644 index 00000000000..41267c6022c Binary files /dev/null and b/images/muxpi1.4_connection.jpg differ diff --git a/images/muxpi1.4_jumpers.jpg b/images/muxpi1.4_jumpers.jpg new file mode 100644 index 00000000000..8b0c76a2ac7 Binary files /dev/null and b/images/muxpi1.4_jumpers.jpg differ diff --git a/images/mx25l3206e_pinout.jpg b/images/mx25l3206e_pinout.jpg new file mode 100644 index 00000000000..0bdcd418453 Binary files /dev/null and b/images/mx25l3206e_pinout.jpg differ diff --git a/images/mx25l6406e_pinout.jpg b/images/mx25l6406e_pinout.jpg new file mode 100644 index 00000000000..c85938efc4e Binary files /dev/null and b/images/mx25l6406e_pinout.jpg differ diff --git a/images/novacustom_ns_ports_left_view.png b/images/novacustom_ns_ports_left_view.png new file mode 100644 index 00000000000..e7ede2f695b Binary files /dev/null and b/images/novacustom_ns_ports_left_view.png differ diff --git a/images/novacustom_ns_ports_right_view.png b/images/novacustom_ns_ports_right_view.png new file mode 100644 index 00000000000..fbe28df20d8 Binary files /dev/null and b/images/novacustom_ns_ports_right_view.png differ diff --git a/images/novacustom_nv_ports_left_view.png b/images/novacustom_nv_ports_left_view.png new file mode 100644 index 00000000000..6862e973fd5 Binary files /dev/null and b/images/novacustom_nv_ports_left_view.png differ diff --git a/images/novacustom_nv_ports_right_view.png b/images/novacustom_nv_ports_right_view.png new file mode 100644 index 00000000000..f4f6f9d3cb2 Binary files /dev/null and b/images/novacustom_nv_ports_right_view.png differ diff --git a/images/ns50mu_board_chips.jpg b/images/ns50mu_board_chips.jpg new file mode 100644 index 00000000000..6cdc7adddaa Binary files /dev/null and b/images/ns50mu_board_chips.jpg differ diff --git a/images/ns5x_7x_battery_unplugged.jpg b/images/ns5x_7x_battery_unplugged.jpg new file mode 100644 index 00000000000..e0e309c62a6 Binary files /dev/null and b/images/ns5x_7x_battery_unplugged.jpg differ diff --git a/images/ns5x_7x_without_bottom_cover.jpg b/images/ns5x_7x_without_bottom_cover.jpg new file mode 100644 index 00000000000..ef1a3136511 Binary files /dev/null and b/images/ns5x_7x_without_bottom_cover.jpg differ diff --git a/images/ns5x_arduino_breakout.jpg b/images/ns5x_arduino_breakout.jpg new file mode 100644 index 00000000000..eec607a3725 Binary files /dev/null and b/images/ns5x_arduino_breakout.jpg differ diff --git a/images/ns5x_arduino_breakout_attached.jpg b/images/ns5x_arduino_breakout_attached.jpg new file mode 100644 index 00000000000..5c1cf6abe35 Binary files /dev/null and b/images/ns5x_arduino_breakout_attached.jpg differ diff --git a/images/ns5x_arduino_connected.jpg b/images/ns5x_arduino_connected.jpg new file mode 100644 index 00000000000..c3f25d7bf0a Binary files /dev/null and b/images/ns5x_arduino_connected.jpg differ diff --git a/images/ns5x_arduino_full_setup.jpg b/images/ns5x_arduino_full_setup.jpg new file mode 100644 index 00000000000..00d02055862 Binary files /dev/null and b/images/ns5x_arduino_full_setup.jpg differ diff --git a/images/ns5x_battery_unplugged.jpg b/images/ns5x_battery_unplugged.jpg new file mode 100644 index 00000000000..c2ca1b29c05 Binary files /dev/null and b/images/ns5x_battery_unplugged.jpg differ diff --git a/images/ns5x_bottom_cover_removed.jpg b/images/ns5x_bottom_cover_removed.jpg new file mode 100644 index 00000000000..fcca9697c9b Binary files /dev/null and b/images/ns5x_bottom_cover_removed.jpg differ diff --git a/images/ns5x_keyboard_connectors.jpg b/images/ns5x_keyboard_connectors.jpg new file mode 100644 index 00000000000..4f79b228059 Binary files /dev/null and b/images/ns5x_keyboard_connectors.jpg differ diff --git a/images/ns5x_keyboard_removed.jpg b/images/ns5x_keyboard_removed.jpg new file mode 100644 index 00000000000..7ee2a4500c7 Binary files /dev/null and b/images/ns5x_keyboard_removed.jpg differ diff --git a/images/nv4x_board_chips.jpg b/images/nv4x_board_chips.jpg new file mode 100644 index 00000000000..87149a3c58b Binary files /dev/null and b/images/nv4x_board_chips.jpg differ diff --git a/images/nv4x_nvidia_panel.jpg b/images/nv4x_nvidia_panel.jpg new file mode 100644 index 00000000000..c8d2689572b Binary files /dev/null and b/images/nv4x_nvidia_panel.jpg differ diff --git a/images/nv4x_setup.jpg b/images/nv4x_setup.jpg new file mode 100644 index 00000000000..6f3f79dc5f1 Binary files /dev/null and b/images/nv4x_setup.jpg differ diff --git a/images/nvc_ec_flash/NS51-front-1.jpg b/images/nvc_ec_flash/NS51-front-1.jpg new file mode 100644 index 00000000000..506b60ec595 Binary files /dev/null and b/images/nvc_ec_flash/NS51-front-1.jpg differ diff --git a/images/nvc_ec_flash/ns5x_arduino_breakout.jpg b/images/nvc_ec_flash/ns5x_arduino_breakout.jpg new file mode 100644 index 00000000000..675da4e5073 Binary files /dev/null and b/images/nvc_ec_flash/ns5x_arduino_breakout.jpg differ diff --git a/images/nvc_ec_flash/ns5x_arduino_breakout_attached.jpg b/images/nvc_ec_flash/ns5x_arduino_breakout_attached.jpg new file mode 100644 index 00000000000..5c1cf6abe35 Binary files /dev/null and b/images/nvc_ec_flash/ns5x_arduino_breakout_attached.jpg differ diff --git a/images/nvc_ec_flash/ns5x_arduino_connected.jpg b/images/nvc_ec_flash/ns5x_arduino_connected.jpg new file mode 100644 index 00000000000..c3f25d7bf0a Binary files /dev/null and b/images/nvc_ec_flash/ns5x_arduino_connected.jpg differ diff --git a/images/nvc_ec_flash/ns5x_arduino_full_setup.jpg b/images/nvc_ec_flash/ns5x_arduino_full_setup.jpg new file mode 100644 index 00000000000..00d02055862 Binary files /dev/null and b/images/nvc_ec_flash/ns5x_arduino_full_setup.jpg differ diff --git a/images/nvc_ec_flash/ns5x_battery_unplugged.jpg b/images/nvc_ec_flash/ns5x_battery_unplugged.jpg new file mode 100644 index 00000000000..c2ca1b29c05 Binary files /dev/null and b/images/nvc_ec_flash/ns5x_battery_unplugged.jpg differ diff --git a/images/nvc_ec_flash/ns5x_bottom_cover_removed.jpg b/images/nvc_ec_flash/ns5x_bottom_cover_removed.jpg new file mode 100644 index 00000000000..be67525b6ce Binary files /dev/null and b/images/nvc_ec_flash/ns5x_bottom_cover_removed.jpg differ diff --git a/images/nvc_ec_flash/ns5x_keyboard_connectors.jpg b/images/nvc_ec_flash/ns5x_keyboard_connectors.jpg new file mode 100644 index 00000000000..6463f6f627e Binary files /dev/null and b/images/nvc_ec_flash/ns5x_keyboard_connectors.jpg differ diff --git a/images/nvc_ec_flash/ns5x_keyboard_removed.jpg b/images/nvc_ec_flash/ns5x_keyboard_removed.jpg new file mode 100644 index 00000000000..9b92a49c0e5 Binary files /dev/null and b/images/nvc_ec_flash/ns5x_keyboard_removed.jpg differ diff --git a/images/nvc_ec_flash/nv4x_arduino_breakout.jpg b/images/nvc_ec_flash/nv4x_arduino_breakout.jpg new file mode 100644 index 00000000000..dfa752e30ba Binary files /dev/null and b/images/nvc_ec_flash/nv4x_arduino_breakout.jpg differ diff --git a/images/nvc_ec_flash/nv4x_arduino_connected.jpg b/images/nvc_ec_flash/nv4x_arduino_connected.jpg new file mode 100644 index 00000000000..caff3947fb3 Binary files /dev/null and b/images/nvc_ec_flash/nv4x_arduino_connected.jpg differ diff --git a/images/nvc_ec_flash/nv4x_keyboard_connectors.jpg b/images/nvc_ec_flash/nv4x_keyboard_connectors.jpg new file mode 100644 index 00000000000..cea862eed8f Binary files /dev/null and b/images/nvc_ec_flash/nv4x_keyboard_connectors.jpg differ diff --git a/images/nvc_ec_flash/nv4x_keyboard_removed.jpg b/images/nvc_ec_flash/nv4x_keyboard_removed.jpg new file mode 100644 index 00000000000..a1270f3ab89 Binary files /dev/null and b/images/nvc_ec_flash/nv4x_keyboard_removed.jpg differ diff --git a/images/nvidia_win10.jpg b/images/nvidia_win10.jpg new file mode 100644 index 00000000000..9b8fb3c3ea3 Binary files /dev/null and b/images/nvidia_win10.jpg differ diff --git a/images/openness_msi.jpg b/images/openness_msi.jpg new file mode 100644 index 00000000000..10512f18e78 Binary files /dev/null and b/images/openness_msi.jpg differ diff --git a/images/openness_msi_bios.jpg b/images/openness_msi_bios.jpg new file mode 100644 index 00000000000..28e95d5eb7e Binary files /dev/null and b/images/openness_msi_bios.jpg differ diff --git a/images/openness_msi_bios_ami.jpg b/images/openness_msi_bios_ami.jpg new file mode 100644 index 00000000000..2d06c84f91f Binary files /dev/null and b/images/openness_msi_bios_ami.jpg differ diff --git a/images/openness_msi_bios_full.jpg b/images/openness_msi_bios_full.jpg new file mode 100644 index 00000000000..2d5edf7cc12 Binary files /dev/null and b/images/openness_msi_bios_full.jpg differ diff --git a/images/openness_msi_bios_full_ami.jpg b/images/openness_msi_bios_full_ami.jpg new file mode 100644 index 00000000000..2f6f82094fa Binary files /dev/null and b/images/openness_msi_bios_full_ami.jpg differ diff --git a/images/openness_msi_full.jpg b/images/openness_msi_full.jpg new file mode 100644 index 00000000000..475135ce590 Binary files /dev/null and b/images/openness_msi_full.jpg differ diff --git a/images/openness_msi_full_ami.jpg b/images/openness_msi_full_ami.jpg new file mode 100644 index 00000000000..d74efcbaf2a Binary files /dev/null and b/images/openness_msi_full_ami.jpg differ diff --git a/images/openness_msi_full_code.jpg b/images/openness_msi_full_code.jpg new file mode 100644 index 00000000000..b58d4687ca3 Binary files /dev/null and b/images/openness_msi_full_code.jpg differ diff --git a/images/openness_msi_full_code_ami.jpg b/images/openness_msi_full_code_ami.jpg new file mode 100644 index 00000000000..35dcc4244fa Binary files /dev/null and b/images/openness_msi_full_code_ami.jpg differ diff --git a/images/orange_led.jpg b/images/orange_led.jpg new file mode 100644 index 00000000000..3668d29b19e Binary files /dev/null and b/images/orange_led.jpg differ diff --git a/images/overview_service_jumper.jpg b/images/overview_service_jumper.jpg new file mode 100644 index 00000000000..b295c880074 Binary files /dev/null and b/images/overview_service_jumper.jpg differ diff --git a/images/pcengines-apu2.jpg b/images/pcengines-apu2.jpg new file mode 100644 index 00000000000..ee4cf8c45b0 Binary files /dev/null and b/images/pcengines-apu2.jpg differ diff --git a/images/pomona_clip.jpg b/images/pomona_clip.jpg new file mode 100644 index 00000000000..0a910ac4660 Binary files /dev/null and b/images/pomona_clip.jpg differ diff --git a/images/protectli_recovery/flash_chip.jpg b/images/protectli_recovery/flash_chip.jpg new file mode 100644 index 00000000000..38390b8aee8 Binary files /dev/null and b/images/protectli_recovery/flash_chip.jpg differ diff --git a/images/protectli_recovery/pomona_clip.jpg b/images/protectli_recovery/pomona_clip.jpg new file mode 100644 index 00000000000..b32a6ad2365 Binary files /dev/null and b/images/protectli_recovery/pomona_clip.jpg differ diff --git a/images/protectli_recovery/pomona_clip_connected_to_flash_chip.jpg b/images/protectli_recovery/pomona_clip_connected_to_flash_chip.jpg new file mode 100644 index 00000000000..1cbe4935e94 Binary files /dev/null and b/images/protectli_recovery/pomona_clip_connected_to_flash_chip.jpg differ diff --git a/images/protectli_recovery/pomona_clip_with_cables.jpg b/images/protectli_recovery/pomona_clip_with_cables.jpg new file mode 100644 index 00000000000..9e2d30760aa Binary files /dev/null and b/images/protectli_recovery/pomona_clip_with_cables.jpg differ diff --git a/images/protectli_recovery/pomona_clip_with_rte.jpg b/images/protectli_recovery/pomona_clip_with_rte.jpg new file mode 100644 index 00000000000..1b39b7931a7 Binary files /dev/null and b/images/protectli_recovery/pomona_clip_with_rte.jpg differ diff --git a/images/protectli_recovery/vp2410_disassembly.jpg b/images/protectli_recovery/vp2410_disassembly.jpg new file mode 100644 index 00000000000..728dd32d7a7 Binary files /dev/null and b/images/protectli_recovery/vp2410_disassembly.jpg differ diff --git a/images/protectli_recovery/vp2410_location_of_CMOS_header.jpg b/images/protectli_recovery/vp2410_location_of_CMOS_header.jpg new file mode 100644 index 00000000000..e7f00e7025d Binary files /dev/null and b/images/protectli_recovery/vp2410_location_of_CMOS_header.jpg differ diff --git a/images/protectli_recovery/vp2410_location_of_flash_chip.jpg b/images/protectli_recovery/vp2410_location_of_flash_chip.jpg new file mode 100644 index 00000000000..44afd795daa Binary files /dev/null and b/images/protectli_recovery/vp2410_location_of_flash_chip.jpg differ diff --git a/images/protectli_recovery/vp2420_location_of_CMOS_header.jpg b/images/protectli_recovery/vp2420_location_of_CMOS_header.jpg new file mode 100644 index 00000000000..37420120495 Binary files /dev/null and b/images/protectli_recovery/vp2420_location_of_CMOS_header.jpg differ diff --git a/images/protectli_recovery/vp2420_location_of_flash_chip.jpg b/images/protectli_recovery/vp2420_location_of_flash_chip.jpg new file mode 100644 index 00000000000..9d7a1116fce Binary files /dev/null and b/images/protectli_recovery/vp2420_location_of_flash_chip.jpg differ diff --git a/images/protectli_recovery/vp46xx_location_of_CMOS_header.jpg b/images/protectli_recovery/vp46xx_location_of_CMOS_header.jpg new file mode 100644 index 00000000000..9f160381e30 Binary files /dev/null and b/images/protectli_recovery/vp46xx_location_of_CMOS_header.jpg differ diff --git a/images/protectli_recovery/vp46xx_location_of_flash_chip.jpg b/images/protectli_recovery/vp46xx_location_of_flash_chip.jpg new file mode 100644 index 00000000000..26bcc285017 Binary files /dev/null and b/images/protectli_recovery/vp46xx_location_of_flash_chip.jpg differ diff --git a/images/q35-dasharo-device-manager.jpg b/images/q35-dasharo-device-manager.jpg new file mode 100644 index 00000000000..c0ecc53af14 Binary files /dev/null and b/images/q35-dasharo-device-manager.jpg differ diff --git a/images/q35-dasharo-features.jpg b/images/q35-dasharo-features.jpg new file mode 100644 index 00000000000..e32055edd1b Binary files /dev/null and b/images/q35-dasharo-features.jpg differ diff --git a/images/qspimux_kgpe.jpeg b/images/qspimux_kgpe.jpeg new file mode 100644 index 00000000000..bb445880814 Binary files /dev/null and b/images/qspimux_kgpe.jpeg differ diff --git a/images/qspimux_pin_header.jpg b/images/qspimux_pin_header.jpg new file mode 100644 index 00000000000..9045374cbff Binary files /dev/null and b/images/qspimux_pin_header.jpg differ diff --git a/images/rte-boot.jpg b/images/rte-boot.jpg new file mode 100644 index 00000000000..6d3e92decb3 Binary files /dev/null and b/images/rte-boot.jpg differ diff --git a/images/rte-rest-api-interface.jpg b/images/rte-rest-api-interface.jpg new file mode 100644 index 00000000000..9955fc366d1 Binary files /dev/null and b/images/rte-rest-api-interface.jpg differ diff --git a/images/rte-v1.1.0-WSON8-SPI-header.jpg b/images/rte-v1.1.0-WSON8-SPI-header.jpg new file mode 100644 index 00000000000..aa02f67b685 Binary files /dev/null and b/images/rte-v1.1.0-WSON8-SPI-header.jpg differ diff --git a/images/rte-v1.1.0-basic-rte.jpg b/images/rte-v1.1.0-basic-rte.jpg new file mode 100644 index 00000000000..4c5670e1a16 Binary files /dev/null and b/images/rte-v1.1.0-basic-rte.jpg differ diff --git a/images/rte-v1.1.0-flash_chip_NS50_70PU.jpg b/images/rte-v1.1.0-flash_chip_NS50_70PU.jpg new file mode 100644 index 00000000000..54b4b843382 Binary files /dev/null and b/images/rte-v1.1.0-flash_chip_NS50_70PU.jpg differ diff --git a/images/rte-v1.1.0-interface-desc.jpg b/images/rte-v1.1.0-interface-desc.jpg new file mode 100644 index 00000000000..3c4eaf08225 Binary files /dev/null and b/images/rte-v1.1.0-interface-desc.jpg differ diff --git a/images/rte-v1.1.0-trans.jpg b/images/rte-v1.1.0-trans.jpg new file mode 100644 index 00000000000..dd8fac9b317 Binary files /dev/null and b/images/rte-v1.1.0-trans.jpg differ diff --git a/images/service_jumper.jpeg b/images/service_jumper.jpeg new file mode 100644 index 00000000000..6bc3129d00c Binary files /dev/null and b/images/service_jumper.jpeg differ diff --git a/images/service_jumper_header.jpg b/images/service_jumper_header.jpg new file mode 100644 index 00000000000..36bf36973f3 Binary files /dev/null and b/images/service_jumper_header.jpg differ diff --git a/images/service_mode_warn.jpg b/images/service_mode_warn.jpg new file mode 100644 index 00000000000..ad077aae2dc Binary files /dev/null and b/images/service_mode_warn.jpg differ diff --git a/images/soic16_clip_connected.jpg b/images/soic16_clip_connected.jpg new file mode 100644 index 00000000000..d9c78850840 Binary files /dev/null and b/images/soic16_clip_connected.jpg differ diff --git a/images/soic16_clip_downside.jpg b/images/soic16_clip_downside.jpg new file mode 100644 index 00000000000..2e9cd78ba5b Binary files /dev/null and b/images/soic16_clip_downside.jpg differ diff --git a/images/soic16_clip_upside.jpg b/images/soic16_clip_upside.jpg new file mode 100644 index 00000000000..ca129c84c1b Binary files /dev/null and b/images/soic16_clip_upside.jpg differ diff --git a/images/soic16_pomona_clip.jpg b/images/soic16_pomona_clip.jpg new file mode 100644 index 00000000000..52cf1a533cc Binary files /dev/null and b/images/soic16_pomona_clip.jpg differ diff --git a/images/supermicro_check_fw_rev.jpg b/images/supermicro_check_fw_rev.jpg new file mode 100644 index 00000000000..4351666c783 Binary files /dev/null and b/images/supermicro_check_fw_rev.jpg differ diff --git a/images/talos_cb_menuconfig.jpg b/images/talos_cb_menuconfig.jpg new file mode 100644 index 00000000000..2b36953afa7 Binary files /dev/null and b/images/talos_cb_menuconfig.jpg differ diff --git a/images/vboot_bootflow.jpg b/images/vboot_bootflow.jpg new file mode 100644 index 00000000000..6dac88730ad Binary files /dev/null and b/images/vboot_bootflow.jpg differ diff --git a/images/white_led.jpg b/images/white_led.jpg new file mode 100644 index 00000000000..749c079c86c Binary files /dev/null and b/images/white_led.jpg differ diff --git a/images/x11_mfg_mode.jpg b/images/x11_mfg_mode.jpg new file mode 100644 index 00000000000..dc89b0f20ac Binary files /dev/null and b/images/x11_mfg_mode.jpg differ diff --git a/images/x11ssh-f.jpg b/images/x11ssh-f.jpg new file mode 100644 index 00000000000..e316973256b Binary files /dev/null and b/images/x11ssh-f.jpg differ diff --git a/index.html b/index.html new file mode 100644 index 00000000000..56d14cde3f7 --- /dev/null +++ b/index.html @@ -0,0 +1,5835 @@ + + + + + + + + + + + + + + + + + + About Dasharo - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    +

    About

    +

    Dasharo is an open-source firmware distribution focusing on seamless +deployment, clean and simple code, long-term maintenance, professional support, +transparent validation, superior documentation, privacy-respecting +implementation, liberty for the owners and trustworthiness for all.

    +

    More about Dasharo

    +

    Dasharo homepage

    +

    Dasharo is registered trademark and product developed by 3mdeb.

    +

    Compatible hardware

    +

    Refer to the Supported hardware section.

    + + +

    Community

    +
      +
    • Dasharo Matrix Workspace - general + Dasharo discussion, support and other open-source firmware related work.
    • +
    • Dasharo OSF vPub - 3-4 times a year we organize + online party to discuss recent achievements in open-source firmware, open + source hardware and open instruction set architecture. Feel free to check the + website about recent vPub plans or subscribe to newsletter.
    • +
    • Discord server
    • +
    • Dasharo Twitter account
    • +
    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/newcomers/index.html b/newcomers/index.html new file mode 100644 index 00000000000..55e9e274d40 --- /dev/null +++ b/newcomers/index.html @@ -0,0 +1,5977 @@ + + + + + + + + + + + + + + + + + + New? Start here - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Newcomers

    +

    If you are new to Dasharo, this section is to help you get started using Dasharo +firmware and possibly contributing to making it better.

    +

    coreboot

    +

    If you have no prior experience with coreboot, it's highly recommended to visit +OpenSecurityTraining2 and finish these courses:

    + +

    OpenSecurityTraining2 provides other great courses related to firmware, which +are all freely available here.

    +

    Docker

    +

    coreboot needs a specific toolchain to be built, hence why it is usually built +inside of a Docker. In case of Dasharo, all images are built using Docker, so +you will make sure it works properly on your system.

    +

    Follow these two links:

    + +

    Once you have Docker set up on your machine, you can pull docker images from +coreboot/coreboot-sdk +(keep in mind that some platforms require older docker images).

    +

    To pull a Docker image, use:

    +
    docker pull coreboot/coreboot-sdk:<tag>
    +
    +

    The typical procedure to build a coreboot image is as follows:

    +
    git clone https://github.com/Dasharo/coreboot.git
    +
    +
    cd coreboot
    +
    +
    git checkout <platform>/release
    +
    +
    docker run -u $UID --rm -it \
    +-v $PWD:/home/coreboot/coreboot
    +-w /home/coreboot/coreboot coreboot/coreboot-sdk:<tag>\
    +bash
    +
    +
    cp configs/config.<platform> .config
    +
    +
    make olddefconfig
    +
    +
    make
    +
    +

    Dasharo Contribution

    +

    All code review and all issues related to Dasharo are resolved on +GitHub. An account there is necessary to contribute and +report issues. All Dasharo repositories can be found +here.

    +

    When you have an account on GitHub go ahead and +configure an SSH key. +It's also highly recommended to configure a GPG key before contributing +anything. Instructions to do that can be found +here. +With that your account should be ready to contribute to Dasharo.

    +

    Since Dasharo is based on coreboot and edk2, it's best to contribute directly +in the upstream +if possible. Refer to these documents:

    + +

    If for some reason you can't contribute your change in upstream repositories, +then consider contributing directly to Dasharo. Before doing anything it's +best to get familiar with source code structure. +To create a patch:

    +
      +
    1. fork the repository + which you want to edit,
    2. +
    3. in the forked repository: git checkout <platform>/develop (make sure to + start from the correct branch),
    4. +
    5. create a new branch: git checkout -b <platform>/<feature>,
    6. +
    7. commit your changes:
        +
      • make sure to sign your commits by using + git commit -sm "<commit_message>",
      • +
      • <commit_message> should be: path/to/file: Change description,
      • +
      • one commit should be one logical change,
      • +
      +
    8. +
    9. create a pull request from a fork.
    10. +
    +

    Do not forget to check whether patch has been reviewed and changes to your +contribution (PR) are needed. If so, remember about answering to each addressed +thread with information about change in the commit

    +
      +
    • template: Fixed: <link to commit>
    • +
    • example: Fixed 0a2a4ee
    • +
    +

    Dasharo Matrix Space

    +

    Matrix is a communicator used at Dasharo. If you want +quick answers it's best to join our matrix space and talk to us there.

    +

    Dasharo Matrix Space

    +

    If you've never used Matrix before, you will first need to get a client. +Available clients are listed here.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/osf-trivia-list/dasharo/index.html b/osf-trivia-list/dasharo/index.html new file mode 100644 index 00000000000..aff5ed90026 --- /dev/null +++ b/osf-trivia-list/dasharo/index.html @@ -0,0 +1,6436 @@ + + + + + + + + + + + + + + + + + + Dasharo - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Frequenty Asked Questions about Dasharo

    +

    What is Dasharo?

    +

    Dasharo is registered trademark and product developed by 3mdeb.

    +

    Dasharo is an open-source firmware distribution focusing on:

    + +

    Dasharo consists of productized services, set +of open-source repositories, +and quality control which help to +provide scalable, modular, easy to combine open-source BIOS, UEFI, and firmware +solutions. It offers the components that are needed to develop and maintain a +high quality, and modular firmware, for the stability and security of your +platform.

    +

    For individuals Dasharo provides optional features in subscription model called +Supporters Entrance.

    +

    Why 3mdeb created Dasharo?

    +

    3mdeb created Dasharo to establish a recognized brand with a proven history of +successful firmware integrations. Dasharo aims to deliver added +value to customers and the community as an open-source firmware distribution, +such as transparent validation, long-term maintenance, bleeding-edge +integration for modern hardware, and other products requested by the community +and customers.

    +

    3mdeb has been providing services related to open-source firmware for years and +has been asked multiple times by various parties to create a recognized brand. +Therefore, the creation of Dasharo was a move to fulfill that need and +establish a marketing vehicle to deliver value to customers.

    +

    In addition, 3mdeb plans to provide a camp for all coreboot refugees, including +platforms moved to branches due to the need for code evolution, such as Intel +Intel Quark SoC deprecation and LEGACY_SMP_INIT & +RESOURCE_ALLOCATOR_V3. We want to provide solutions for those +requiring long-term maintenance and firmware support. More elaborate +explanation of our position you can find +below.

    +

    Dasharo typically supports fully open platforms like Raptor Computing Systems +Talos II family, ASUS KGPE-D16, and other which are not as +open but provide modern computing experience, such as MSI PRO Z690-A +DDR4/DDR5. The goal is to provide a reliable, secure, and scalable +firmware solution for a wide range of platforms and applications, aligning with +the vision of a new golden age of computing advocated by experts in computer +architecture.

    +

    What Dasharo provides?

    +

    Dasharo has 10 rules that govern the production and release of firmware within +its ecosystem. Dasharo rules define what we deliver with every release. These +rules are:

    +
      +
    1. Every release of firmware produced by Dasharo Ecosystem must contain source +code, binary, SHA256 hash, and Dasharo +cryptographic signature of that hash.
    2. +
    3. Dasharo Universe contains structured documentation for key activities +related to open-source firmware life-cycle: initial deployment, update and +recovery.
    4. +
    5. +

      Cryptographic keys hierarchy should be followed:

      + +

      Keys can be found in +3mdeb-secpack repository.

      +
    6. +
    7. +

      Every release of firmware produced by Dasharo Ecosystem must have an +attached test report according to requirements. Every test should be described +by test specification documentation.

      +
    8. +
    9. Customer-specific Dasharo validation procedures are delivered with the +release notes directly to the customer and does not have to be publicly +available.
    10. +
    11. Every firmware produced by Dasharo Ecosystem use Semantic Versioning +2.0.0 compatible versioning scheme. For details please +check description.
    12. +
    13. Every firmware produced by Dasharo Ecosystem should use Keep A Changelog +1.0.0 compatible scheme as changelog +format.
    14. +
    15. Every Dasharo firmware release should be delivered with integrity and +signature verification procedures.
    16. +
    17. Every Dasharo firmware release must contain a detailed description of +components and links to the range of code changes since the last release.
    18. +
    19. Dasharo Ecosystem uses open-source software to create and maintain its +firmware solutions, and the company strives to maintain transparency in its +processes and procedures.
    20. +
    +

    These 10 rules are designed to ensure that every release of firmware produced +by Dasharo Ecosystem is reliable, secure, and meets the needs of customers and +the community. By following these rules, Dasharo Ecosystem provides a +consistent and high-quality firmware solution for a wide range of platforms and +applications.

    +

    What is Dasharo binary blob policy?

    +

    Modern x86 platforms' firmware requires closed source blobs to be integrated +into the image to properly initialize the silicon. The ecosystem is shifting +towards designs and technologies with a lot of small microcontrollers and +intellectual property (IP) blocks specialized in a very thin range of tasks. +Those microcontrollers and IP blocks typically require firmware blobs as well. +Some of the blobs are clearly visible, some may be obfuscated and hidden inside +the silicon or other firmware blobs (e.g. Intel Management Engine region +contains multiple other blobs besides the ME firmware - +more about Intel ME blob).

    +

    So Dasharo's binary blob policy is as follows:

    +
    +

    Integrate only the necessary amount of blobs required for proper platform +operation and minimize the amount of blobs that are optional whenever +possible by providing open equivalent implementations or removing them if +there is no functional impact on the platform operation. Ultimately the blobs +should be attested and properly documented. Dasharo Team is trying to achieve +it by working on firmware SBOMs.

    +
    +

    Dasharo also works without blobs on platforms that allow that. For example, +ASUS KGPE-D16 can run without any blobs (officially there is no PSP on that +hardware, and Opteron 6200 series CPUs can run without microcode patches). +There is also a libre, POWER9-based server/workstation Talos II by Raptor +Computing Systems, which also do not use any binary blobs, however it is more +expensive than x86 platforms.

    +

    Why Dasharo?

    +

    Open-source firmware ecosystem problems

    +

    Every open-source project has its own internal dynamics, history and politics. +We are always looking for a solution that endorse non-aggression principle and +peaceful coexistence, which hopefully will allow everyone to compete based on +the same rules. We believe that market is big enough for all players and, if +not we should make market bigger, not fight for every possible piece causing +collateral damage.

    +

    Eventually, in the community, we are all human beings, including all our good +and bad features. In some cases, sympathy and antipathy cause unexpected +dynamics. This impacts every community.

    +

    We also should be aware that the open-source ecosystem is a place of +OPSEC and +PSYWAR techniques use, +which leads to redirecting energy and resources into directions that make +open-source community activity less competitive.

    +

    In our opinion, massive energy is wasted in the open-source firmware community +because of incorrect focus, like religious flame wars about philosophical +principles, security paranoia without having an idea of threat modeling, or +revolutionary ideas and plans for how to overthrow multibillion-dollar industry +overlords. Although we may enjoy discussion during +Dasharo open-source firmware vPubs during everyday job would like to +focus on delivering value to those who can vote by choosing open-source +firmware/hardware/ISA based product to help change the computer industry.

    +

    Overall there is no economy around open-source firmware, and nobody seems to +care much about that. It impacts the upstreaming process, the number of +contributors, and reviewers. There are huge players with their own interests, +small open-source firmware vendors like 3mdeb and community members essentially +working for free. Without middle-size companies standing behind open-source +firmware-based products, not much will change. To fill the space between big +players and small boutique dev companies, we have to have products with the +volume on the market because the hardware market understands only sales +volumes, nothing else.

    +

    We want to work on changing the above paradigms or at least improve the +state-of-the-art relation in the community to the level where threats will have +a reasonably small impact. We believe that open-source firmware is a critical +tool, which should be used consciously to ensure privacy and liberty.

    +

    What is open-source firmware distribution?

    +

    Dasharo is 3mdeb's firmware distribution and all its components are +open-source. We provide releases in binary form. As you know in most cases on +x86 for firmware to be useful it has to cooperate with closed blobs. In all +binary releases we are making sure we provide information where all components +are coming from.

    +

    Dasharo works without blobs on platforms that allow that. When we are saying +Dasharo open-source firmware distribution we mean code that is delivered by +3mdeb that is open-source. We have no influence on the code provided by 3rd +parties (e.g. FSP, ME, GbE etc.).

    +

    In coreboot community there was some controversy about calling Dasharo +open-source firmware distribution (for details please check gerrit +review). We respect coreboot community opinion, so we agreed +that in case of coreboot documentation it would be better to use open-source +based firmware distribution. It doesn't mean we agree with that decision:

    +
      +
    • Definitions and rules used in coreboot documentation review are not clear.
    • +
    • Rules seem not to be applied equally to all contributors of + coreboot distribution.
    • +
    +

    Why Dasharo is not called coreboot firmware distribution?

    +

    While the coreboot is now the default open-source framework for Dasharo, we do +not want to limit Dasharo to one framework. We also expect another firmware +frameworks to be a base for Dasharo, such as +U-Boot, +oreboot, +Slim Bootloader, or pure +EDK II.

    +

    Moreover, coreboot is not enough in most cases for booting modern computer. +Most Dasharo flavors are currently based on coreboot with EDK II payload, but +we also have coreboot with +skiboot/heads payload, +and we expect more flavors to appear in the future.

    +

    What value Dasharo provides in comparison to coreboot?

    + +

    Dasharo Zero-Touch Initial Deployment

    +

    Documentation supported hardware provides information about initial deployment, +updates and recovery procedures. Developed by Dasharo Team Dasharo Tools Suite +(DTS) operating system supports users by automating the deployment +process, which helps reducing errors and inconsistencies, and make sure the +firmware can be further updated to new version without any problems. DTS also +provides controlled and secure environment for initial deployment and update of +firmware, reducing the risk of tampering or unauthorized changes.

    +

    Dasharo Zero-Touch Initial Deployment is smooth, effortless and user-friendly +process, which reduces user frustration and improves satisfaction.

    +

    Use of DTS largely improves firmware adoption, hardware compatibility reporting +and binary blobs transmission, as well as recovery.

    +

    For more details about zero-touch initial deployment please read relevant +DTS +documentation.

    +

    Dasharo Clean and Simple Code

    +

    Dasharo is an open-source distribution project with a simple code structure +described in detail here. While the +project benefits from the simplicity of the coreboot source code, it is +continuously researching and improving its development process and tools to +provide a superior experience for developers. One example of this ongoing work +is the improvements made to fork maintenance, currently being tracked in this +issue on the Dasharo +GitHub repository. The project also explores the concept of a bootstrapable +toolchain, discussed in the build process +section of the project documentation.

    +

    Dasharo Long Term Maintenance

    +
      +
    • We provide long term maintenance - coreboot community for various reasons, do + not merge some patches, because of understaffing, lack of reviewers. Some + changes have long way to upstream, we maintain those patches and make them + work before those will go upstrea. If ever, we are committed to maintain + platforms which are moved to branch in coreboot.
    • +
    • Firmware update - we are registered consultants for fwupd/LVFS and + enable customers and community platforms, so they can get seamless firmware + update in Linux.
    • +
    +

    Dasharo Professional Support

    +

    Dasharo Support coming in form of three following packages:

    +
      +
    • Dasharo Community Support (DCP) - donation driven development.
    • +
    • Dasharo Support Package (DSP) - annual firmware support package.
    • +
    • Dasharo Enterprise Package (DEP) - custom SLA, corporate and open roadmap + alignment advisroy.
    • +
    +

    The Dasharo Community Support Program is an open-source firmware support +initiative that leverages the expertise of community members and developers to +improve firmware solutions for a range of hardware models.

    +

    Platforms in scope of the program should comply with Dasharo quality criteria, +which we slowly gather in Dasharo Certification +Program.

    +

    3mdeb supports and maintains DCP-approved firmware through Dasharo Support +Package (DSP) and Dasharo Enterprise Package (DEP). These packages offer +essential services like porting to new platforms, developing device drivers, +debugging, and fixing bugs. Companies can rely on 3mdeb's expertise to ensure +their systems remain secure, up-to-date, and reliable.

    +

    If you are interested in our services please contact us +here.

    +

    Dasharo Transparent Validation

    +
      +
    • We provide transparent validation results - coreboot in itself provide no + guarantees around release quality and do not provide binary distribution (for + reference please check coreboot project scope, we provide + those in scope of validation we perform.
    • +
    +

    Dasharo Trustworthiness for All

    +
      +
    • We provide ready to use binaries with GPG based signing scheme that improve + verification where firmware coming from.
    • +
    + +

    What are the differences between the official coreboot repository and the Dasharo repository?

    +

    Dasharo focuses on specific platforms listed in supported +hardware section of Dasharo Universe documentation.

    +

    Dasharo repository contains release tags which are associated with Dasharo +Certification Program providing certain quality criteria including test +results. We always trying to minimize delta, but sometimes it can be up to 5k +SLOC (or more I guess e.g. Talos II coreboot support).

    +

    What is Dasharo Certification Program?

    +

    The Dasharo Certification Program (DCP) is a highly specialized certification +program that benchmarks open-source firmware ecosystem deliverables. The +program ensures that firmware is stable, secure, and dependable while aligning +with the Dasharo values. DCP encourages developers to create their version of +Dasharo or contribute to the Dasharo project or coreboot upstream, enabling +them to leverage the power of open-source development to create custom firmware +tailored to their specific needs based on years of Dasharo quality assurance +results. The program's rigorous certification process entails comprehensive +testing in the Dasharo Certification Lab, ensuring that the firmware binary +meets the strict standards established by the program. By aligning with the +Dasharo values, the certification program improves the overall posture of the +open-source firmware ecosystem, making it long-term maintainable, sustainable, +and trustworthy and providing specific service level agreements and warranties +to commercial customers and the community.

    +

    What is DCP-approved firmware?

    +

    The Dasharo-certified firmware provides long-term maintenance over ten years +after the CPU microarchitecture release, which means that OEM, ODM, hardware +vendors, and other companies can rely on the firmware for a long time without +worrying about end-of-life issues. Moreover, DCP-approved firmware vendors must +provide professional support channels to ensure that other business entities +can rely on those channels for long-term support regarding firmware and +software.

    +

    The validation process for DCP firmware is transparent. Test results and bug +reports are always publicly available, allowing the community to continually +identify issues and improve the firmware. However, in case of a security +embargo, the results can be kept under a strict but well-defined policy, +ensuring the security of the firmware.

    +

    Future work

    +

    These future goals align with the values of privacy, liberty, and +trustworthiness in the context of firmware development and the broader tech +industry. We would like to implement following features as part of Dasharo +Certification Program:

    +
      +
    • Privacy-respecting implementation: By working on solutions that allow users + to deactivate potentially malicious components, like ME or PSP, the firmware + will respect user privacy and help mitigate data privacy concerns. This + approach gives users more control over their devices and reduces the risk of + unauthorized access or surveillance. Discussion and more detail in dedicated + issue.
    • +
    • Liberty for the owners: Respecting the liberty of hardware owners to repair + and transfer ownership without risking the leak of personally identifiable + data is crucial. This approach supports the right-to-repair movement and + ensures that users maintain control over their personal information even when + they modify or pass on their devices. Discussion and more detail in dedicated + issue.
    • +
    • Trustworthiness for all: By publishing known good measurements for each boot + phase and storing those measurements in tamper-resistant mediums, such as + TPM, during the boot process will increase security and confidence in the + firmware. Users and other stakeholders can verify that the firmware executed + during the boot process is genuine and uncompromised by making reference + measurements publicly available. Discussion and more detail in dedicated + issue.
    • +
    + + +

    Why there is no AMD mainboard supported in Dasharo ?

    +

    Unfortunately, from the perspective of a small open-source firmware vendor, it +isn't easy to work with AMD. Despite our experience with AMD SoCs since 2016, +we could not yet deliver Dasharo for a modern (Zen core-based) platform. We're +trying hard, but Intel has a better ecosystem for open-source firmware +development.

    +

    The reason for that state may be because AMD is in a rush, and they are +understaffed in all areas compared to their success. We've been doing AMD +open-source firmware development for 6+ years, including our yearly reports of +open-source firmware status at FOSDEM, but the level of support for small +volume firmware development companies is not yet at the level of competition.

    +

    AGESA distribution was a problem in the past, but we solved that, and Dasharo +for AMD is possible. Because Dynamic Root of Trust can work without blob, we +favor AMD, but we can't do anything without a partner who can sponsor the +development effort. We are on the market of open-source firmware vendors, not +hardware vendors.

    +

    Can you port Dasharo to my mainboard?

    +

    There are other versions of the same questions:

    +
      +
    • Dasharo supports mainboard X; I have mainboard Y (or X'). Can you teach me + how to port Dasharo to my mainboard?
    • +
    • Can you help me port Dasharo to my mainboard?
    • +
    +

    TL;DR: No, we can't. In Dasharo, we support only carefully selected targets.

    +

    The answer to that question requires understanding many aspects of the +open-source firmware business we learned over the years. The critical point is +that we can't help to port arbitrary targets. Hardware has to be carefully +selected to bring the most benefits to the open-source firmware community and +improve the sustainability of the ecosystem. Random hardware porting lead to an +unmaintainable stack of platforms that no one adapts in scale, which does not +lead to market change in the correct direction. Lack of commercial adoption is +part of coreboot problems as a project, and we would like to avoid this +mistake.

    +

    We have strict criteria based on various aspects explained in Dasharo Community +Support section.

    +

    Dasharo Team tries to select platforms with long-term availability potential.

    +

    Because we are fully responsible for hardware that we enable in open-source +firmware ecosystem, our releases have to pass the Dasharo Certification +criteria. The whole effort is relatively expensive and, in most cases, not +feasible for enabling one platform. That's why in most cases, our customers are +OEM/ODM, angel investors, or communities that need reasonable quantities of +hardware (>200pcs).

    +

    If the board comes with variants with minimal differences required for support +in an open-source firmware stack, and one of the variants is part of the +Dasharo Support Package, Dasharo Enterprise Package, or Dasharo Community +Support, there is a chance to put that hardware on the relevant roadmap. In +such a case, don't hesitate to contact us; we will see what we can do. However, +the community member who requested support for the platform should also offer +their help in validating the firmware and maintenance. That kind of request +will be more than welcome from active community members. New members should +consider ways to help us to gain a reputation +that can lead to influencing Dasharo Community Supported roadmap.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/osf-trivia-list/deployment/index.html b/osf-trivia-list/deployment/index.html new file mode 100644 index 00000000000..2532105b644 --- /dev/null +++ b/osf-trivia-list/deployment/index.html @@ -0,0 +1,6026 @@ + + + + + + + + + + + + + + + + + + Deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Deployment

    +

    Deployment section of Dasharo Knowledge Base FAQ considers topic of open-source +firmware deployment, which may include operations of reading and writing SPI NOR +flash, as well as binary modifications.

    +

    If you can't find the answer to your questions feel free to contact us through +Community Channels or submit issue through Dasharo +Github.

    +

    Flashrom

    +

    Following sections explain how to deal with most common flashrom problem.

    +

    How to install flashrom ?

    +
      +
    • Install flashrom v1.1 or newer with your distribution's package manager if + you don't have it installed yet. If your distro doesn't provide flashrom or + provides an outdated one, you can build it yourself using + this instruction.
    • +
    • Or compile recent version of flashrom:
    • +
    +
    sudo apt install libpci-dev libftdi-dev libusb-1.0-0-dev
    +git clone https://github.com/flashrom/flashrom.git
    +cd flashrom
    +sudo make install
    +
    +

    Perform dry run to detect the problems early

    +

    Most of the problems can be detected early and avoided without attempting to +flash the firmware. You may check for most of the errors described here by +doing a dry run (not passing any firmware binary):

    +
    sudo flashrom -p internal
    +
    +

    In below sections there are example errors that you may find in the output of +above command.

    +

    Could not get I/O privileges (Operation not permitted)

    +

    If you see a flashrom error like this:

    +
    ERROR: Could not get I/O privileges (Operation not permitted).
    +You need to be root.
    +Error: Programmer initialization failed.
    +
    +

    It means you have insufficient privileges to perform initialization. Please use +sudo before flashrom command.

    +

    /dev/mem mmap failed: Operation not permitted

    +
    /dev/mem mmap failed: Operation not permitted
    +FAILED!
    +FATAL ERROR!
    +Error: Programmer initialization failed.
    +
    +

    Linux kernel restricts access to IOMEM. To fix that add iomem=relaxed to the +kernel command line.

    +

    Recommended way to fix the problem:

    +
      +
    • Edit /etc/default/grub:
    • +
    +
    GRUB_CMDLINE_LINUX="iomem=relaxed"
    +
    +
      +
    • Update GRUB2 config with:
    • +
    +
    sudo update-grub2
    +
    +
      +
    • Alternatively, if previous command doesn't work:
    • +
    +
    sudo grub-mkconfig -o /boot/grub/grub.cfg
    +
    +
      +
    • Reboot and try flashrom command again
    • +
    +

    Other method:

    +
      +
    • Edit grub.cfg in /boot/grub/:
    • +
    +
    linux /boot/vmlinuz-4.15.0-115-generic ro quiet iomem=relaxed
    +
    +
      +
    • Reboot and try flashrom command again
    • +
    +

    Last resort you can try to modify boot option runtime. YMMV:

    +
      +
    • If your computer uses BIOS for booting, then hold down the Shift, or if + your computer uses UEFI for booting, press Esc several times, while GRUB + is loading to get the boot menu. And, after getting a GRUB menu, press E + on a boot entry to append iomem=relaxed to kernel command line and press + Ctrl+X or F10 to boot. Although this setting is temporary and will + last only during the next boot, this way is faster and a customer doesn't + need to re-generate anything.
    • +
    +

    Please note having it as a temporary setting maybe is slightly better for security +(there's a reason why it's disabled by default).

    +

    If the above does not resolve the problem, the kernel may be compiled with strict +devmem, which prohibits accessing the IOMEM. You should then take different +Linux system.

    +

    Transaction error between offset ...?

    +
    SPI Configuration is locked down.
    +FREG0: Flash Descriptor region (0x00000000-0x00000fff) is read-only.
    +FREG2: Management Engine region (0x00005000-0x005fffff) is locked.
    +Not all flash regions are freely accessible by flashrom. This is most likely
    +due to an active ME. Please see https://flashrom.org/ME for details.
    +At least some flash regions are read protected. You have to use a flash
    +layout and include only accessible regions. For write operations, you'll
    +additionally need the --noverify-all switch. See manpage for more details.
    +Enabling hardware sequencing due to multiple flash chips detected.
    +OK.
    +Found Programmer flash chip "Opaque flash chip" (12288 kB, Programmer-specific) mapped at physical address 0x0000000000000000.
    +Reading flash... Transaction error between offset 0x00005000 and 0x0000503f (= 0x00005000 + 63)!
    +Read operation failed!
    +FAILED.
    +
    +

    Most probably it means problem lays in ME not allowing to read its region. One +of the method to mitigate the issues is to put ME in Manufacturing Mode. Such +operation depends on ME version, SPI flash layout and platform design. Detail +information you should find in sections dedicated to given hardware. To access +documentation for supported hardware please go to Hardware Compatibility +List.

    +

    Please note we consider further mitigations in Dasharo Roadmap.

    +

    WARNING: No chipset found

    +

    If you see the following in the flashrom output:

    +
    WARNING: No chipset found. Flash detection will most likely fail.
    +No EEPROM/flash device found.
    +Note: flashrom can never write if the flash chip isn't found automatically.
    +
    +

    that means your flashrom version is incorrect. Follow the procedure for +building the right flashrom is described in Build flashrom section in the +Initial deployment documentation.

    +

    Chip write protection enabled

    +

    If you see anything like this in the flashrom output (or similar, the hex +number may differ):

    +
    PR0: Warning: 0x001c0000-0x01ffffff is read-only.
    +
    +

    That means you did not disable BIOS boot medium lock correctly. GO back to +firmware setup and disable the option as described in +Prerequisites. Flashrom update procedure containing +--ifd -i bios parameters will fails if you do not disable the protection. +The procedure using the --fmap -i RW_SECTION_A -i RW_SECTION_B parameters +is not affected.

    +

    Warning: BIOS region SMM protection is enabled!

    +

    If you see anything like this in the flashrom output (or similar, the hex +number may differ):

    +
    Warning: BIOS region SMM protection is enabled!
    +Warning: Setting Bios Control at 0xdc from 0xaa to 0x89 failed.
    +New value is 0xaa.
    +
    +

    Any attempt to flash the firmware will fail. That means you did not disable +Enable SMM BIOS write protection option correctly. Go back to firmware setup +and disable the option as described in Prerequisites.

    +

    How to use flashrom to backup vendor BIOS?

    + + +

    It is always a good idea to backup the original BIOS of your hardware, before +switching to open-source firmware.

    + +
    flashrom -p internal -r bios_backup_`date +%Y%m%d`.bin
    +
    +flashrom v1.2-551-gf47ff31 on Linux 5.10.0-9-amd64 (x86_64)
    +flashrom is free software, get the source code at https://flashrom.org
    +
    +Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
    +Found chipset "Intel Q77".
    +Enabling flash write... SPI Configuration is locked down.
    +The Flash Descriptor Override Strap-Pin is set. Restrictions implied by
    +the Master Section of the flash descriptor are NOT in effect. Please note
    +that Protected Range (PR) restrictions still apply.
    +Enabling hardware sequencing due to multiple flash chips detected.
    +OK.
    +Found Programmer flash chip "Opaque flash chip" (12288 kB, Programmer-specific) mapped at physical address 0x0000000000000000.
    +Reading flash... done.
    +
    +

    If you face any issues, please refer to the troubleshooting section for +hardware platform.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/osf-trivia-list/dts/index.html b/osf-trivia-list/dts/index.html new file mode 100644 index 00000000000..58e1175156e --- /dev/null +++ b/osf-trivia-list/dts/index.html @@ -0,0 +1,5905 @@ + + + + + + + + + + + + + + + + + + Dasharo Tools Suite - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Tools Suite

    +

    What is Dasharo Tools Suite Supporters Entrance

    +

    Dasharo Tools Suite Supporters Entrance (DTS SE) is an extended version of +DTS provided to Dasharo Supporters via +the Supporters Entrance subscription. +DTS is like a swiss army knife for Dasharo firmware: you can execute initial +deployment, firmware update and even dump machine logs for debugging and +development support. But with SE you could get updates for your own, customized +build configurations.

    +

    How to get Dasharo Tools Suite Supporters Entrance?

    +

    DTS SE is available only to Dasharo Supporters for personal use. Commercial +use of DTS SE should be discussed directly with 3mdeb +or Dasharo Team.

    +

    In general there are three ways to support us:

    +

    I have more time than money and I can code

    +

    Please help us develop Dasharo influence on open-source firmware market and +spread the word about it. There are multiple ways to do that:

    + +

    To get access to DTS SE you should contact 3mdeb or +Dasharo Team and prove your contribution +regarding above areas of support and influence. If it would be meaningful we +would be glad to give you access to DTS SE for a year.

    +

    I have more time than money and I can't code

    +

    Please contribute +ideas for new features, review documentation and help testing bug fixes.

    +

    If you would like to pursue that path please contact us on Dasharo - +General Matrix channel to +agree on scope of contribution to avoid any potential collision with other +developers. To get access to DTS SE you should contact +3mdeb or Dasharo Team +with links to your contribution and we would be glad to provide one year of DTS +SE updates.

    +

    I have more money than time

    +

    Please donate using one of +available methods and contact 3mdeb or Dasharo +Team to let us know about your donation. Minimal +donating to access DTS SE with one year update support is 60EUR.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/osf-trivia-list/introduction/index.html b/osf-trivia-list/introduction/index.html new file mode 100644 index 00000000000..4bc0bdbbe2f --- /dev/null +++ b/osf-trivia-list/introduction/index.html @@ -0,0 +1,5815 @@ + + + + + + + + + + + + + + + + + + Introduction - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Open Source Firmware Trivia Questions List (OSFTQL)

    +

    Goal of following questions list is to provide answers to terribly trivial +topics or questions that were asked and answered gazillion times. We believe to +move forward with so limited resources we have to stop wasting community +precious time on something we agree on, but move forward with discussion.

    +

    Other role of this list is to create taxonomy of OSF trivia questions for +community and Dasharo customers, to avoid repeating explanation of topics which +most of community already agree on.

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/osf-trivia-list/me/index.html b/osf-trivia-list/me/index.html new file mode 100644 index 00000000000..3762678c7df --- /dev/null +++ b/osf-trivia-list/me/index.html @@ -0,0 +1,5981 @@ + + + + + + + + + + + + + + + + + + Intel ME/CSME - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Introduction

    +

    Until Nehalem (ME version 6) it was possible to remove ME firmware completely. +Starting with Nehalem, ME firmware can't be completely removed.

    +
      +
    • If ME firmware is missing, the PC will not boot at all
    • +
    • Earlier ME versions left a 30 minute grace period for recovering from + a bad flash, but this is no longer true
    • +
    +

    Three methods to reduce ME's capabilities have been found: neutering, +disabling and soft-disabling.

    +
      +
    • Removing non-essential portions of the ME's firmware is commonly referred + to as neutering ME
    • +
    • Setting a bit in the Flash Descriptor which acts as a kill-switch which + tells ME to hang after initialization is usually what we mean by + disabling ME
    • +
    +

    Neutering ME

    +

    Neutralizing ME: removing non-essential portions of the ME's firmware

    +
      +
    • Also called "neutering"
    • +
    • Not initially designed by Intel
    • +
    +

    Method discovered by Nicola Corna of the me_cleaner project +Removes all modules other than those required for platform init

    +
      +
    • Modules left in ME 6.0 - 10.x: ROMP, BUP
    • +
    • +

      Modules left in ME >= 11.x: rbe, kernel, syslib, bup, sometimes + also mfs +A neutered ME will initialize hardware, then throw an error due to missing +firmware

      +
    • +
    • +

      This sometimes results in power management issues

      +
        +
      • Therefore it's not recommended in production without extensive testing
      • +
      +
    • +
    • Functions provided by ME will no longer be operational
    • +
    +

    ME >= v11.x: Sometimes mfs also needs to be preserved. mfs is responsible +for some of the hardware initialization.

    +

    Why is it possible?

    +
      +
    • The FPT is not signed, has just a checksum
    • +
    • The partitions are individually signed
    • +
    • The offset and size of each partition are saved in each FPT entry
    • +
    +

    FPT

    +

    Source: Intel ME myths and reality, Igor Skochinsky & Nicola Corna

    +

    Soft-disabling ME

    +

    +hmrfpo +

    +

    It's also possible to put ME into a soft-disabled state by sending +a HECI SET_ME_DISABLE or HMRFPO_ENABLE message

    +
      +
    • BIOS needs to send these messages
    • +
    • ME will stay disabled until a corresponding ENABLE message is sent
    • +
    • Functional ME firmware must be present
    • +
    • Usually what the "Disable ME" option in some BIOSes does
    • +
    • Also offered as an option when buying some laptops (e.g. Dell)
    • +
    +

    HAP / AltMeDisable bit (aka disabling ME)

    +

    Method discovered in 2017 by Positive Technologies. Initially introduced by +Intel for government/intelligence purposes.

    +
      +
    • Not even the US government trusts ME entirely!
    • +
    +

    Also supported by the me_cleaner project +Involves setting an undocumented, secret bit in the Flash Descriptor which +acts as a kill-switch for the ME

    +
      +
    • AltMeDisable on ME versions < 11.x
    • +
    • HAP (High Assurance Platform) on ME versions >= 11.x
    • +
    +

    Leaves ME in a stopped state, lets it shut down gracefully instead of erroring +out +- This can help prevent issues with power management that may arise from + disabling the ME +- Supported by some OEMs

    +

    3mdeb official statement

    +

    Whenever it is possible 3mdeb try to minimize impact of (CS)ME/SPS/TXE or any +other firmware residing on peripheral or built-in CPUs.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/osf-trolling-list/build_process/index.html b/osf-trolling-list/build_process/index.html new file mode 100644 index 00000000000..71fff065ad8 --- /dev/null +++ b/osf-trolling-list/build_process/index.html @@ -0,0 +1,5985 @@ + + + + + + + + + + + + + + + + + + Firmware build process - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    [OSFI001] Build process

    +

    [OSFI0010] There is no healthy OSF without reproducible builds

    +

    What are the reproducible builds?

    +

    Reproducible Builds and a lot of its aspects +is well explained on the linked website.

    +

    Why are reproducible builds crucial OSF?

    +

    This is because knowing hashes of firmware components, we can calculate expected +TPM PCRs values. By knowing good PCR values and being able to predict further +values after firmware update, we are gaining the following advantages:

    +
      +
    • +

      We can easily confirm if the firmware is valid by reading TPM PCRs and compare + to reference integrity measures (RIM), RIM can be calculated by build exactly + the same version of OSF.

      +

      NOTE: Please note that depending on your threat model using TPM chip with +closed source firmware implementation may lead to solution which is not +trustworthy.

      +
    • +
    • +

      Process of replying measurements provided in TPM Event Log is simpler because + we can easily obtain software and confirm hashes used during PCR extension + the process was valid and the same as produced by the software build process

      +
    • +
    • Looking for bugs by using bisection is easier since being able to build every + commit of software in a reproducible manner give us confidence that there would + be no change in behavior between 2 consecutive builds
    • +
    • Consistent behavior for given hash can be confirmed by test results tied to + given hash in that way users looking at test results may expect exactly the + same behavior for firmware binaries with the same hash
    • +
    • Long term maintenance should be easier if firmware build would be + reproducible over a long time, because often happen some firmware land in + industrial applications, e.g., robots, trains, smart city infrastructure, if + the bug will be detected after a long time; it is important to have tools and be + able to confirm the same binary can be generated in the future. If we know given + toolchain reproduce binary bit by bit we are sure it also reproduces + software/firmware behavior. In that light making small incremental + improvement using a toolchain that gives reproducible results give us higher + the chance that we will not introduce uncontrolled change in behavior and code + the change will be reflected by the compilation process without affecting previous + software behavior.
    • +
    +

    [OSFI0011] Docker containers as build systems "considered harmful."

    +

    Docker containers for a couple of last years become the default method for providing +reproducible runtime environment for software as well those started to be very +useful for developers to transfer exact configuration for building given +software stack. We wrote about the usefulness of Docker containers in embedded +software development environment on +3mdeb blog.

    +

    After a long time of using Docker containers for embedded software development +and build environments we noticed problems for long time maintenance and +reproducibility.

    +

    coreboot-sdk problems

    +

    The example can be coreboot-sdk used for building +coreboot project.

    +

    A good summary of the problem was provided by +Thrilleratplay in guix-docker repo:

    +
    +

    Currently, the coreboot build environment, coreboot-sdk, uses a Debian docker +base image. To install additional required packages, apt-get update must be +run. The resulting Docker image is hosted in the Docker hub repository to be +retrieved at any time in the future. However, at any time in the future, +building the same docker file will generate a different image based on the +latest packages used in apt-get. Over time, as packages are updated due to bug, +security or feature improvements, the docker image's provenance in the +docker hub repository becomes increasingly difficult, if not impossible, to +audit and reproduce.

    +
    +

    Some more detailed notes related to coreboot-sdk issues are presented below.

    +
      +
    1. There is no meaningful versioning of SDK + [1] - at some point, + there was versioning 1.32-53, now switched to git SHA. Both seemed to have + no meaning and were released at arbitrary points in time. The result is that it + is hard to find which version of SDK works with the coreboot tree version.
    2. +
    3. Validation of coreboot-sdk is not sufficient - for example, recently, python + fixes were merged [2], + somehow this change passed all QA checks, but SeaBIOS use python (not python2 + or python3) and all builds using this version of SDK that compile SeaBIOS fail.
    4. +
    5. coreboot-sdk is based on moving target Debian sid. It is close to impossible + to build the same Docker images at 2 different points in time.
    6. +
    7. coreboot-sdk enforce given version of ACPI spec - this may not always be + a good thing to use the most recent compiler and update code accordingly + since it can easily break OSes.
    8. +
    +

    Why we care?

    +
      +
    1. Whenever we deliver code or service to community or customer, we provide + build environment which, for the sake of quality user support, should be + stable.
    2. +
    3. CI pipelines rely on those containers. Replacing docker image in CI pipeline + whenever something change defeat the purpose of having automation and + increase maintenance cost significantly and increase maintenance cost + significantly
    4. +
    +

    Requirements for OSF dev and build process

    +

    Open-source firmware development and build environment SHOULD have: +* meaningful release process +* meaningful validation process, at least basic build system and dev env + capabilities should be tested +* meaningful revisions with a clear explanation of what software stack can be build + with what version of dev and build system, a description should include + side-spec compliance, e.g., ACPI, SMBIOS, UEFI, etc. +* reproducible process that works across systems and in the long run +* signature, so anyone can identify where build and dev env coming from and if + it is trustworthy

    +

    Ideas for solving the above issues

    +
      +
    1. Docker images are not reproducible - this is a known fact, and if we are + extremely serious about stability, security and quality, we should stop + using a not reproducible build environment. Of course, there is some work + making Docker images reproducible, but it opens Pandora's box + [3] + of Yocto or Buildroot. Another path could be Nix or Guix, which is currently + pursued in the community OSFW #guix-buildstack channel
    2. +
    3. this is a private channel; feel free to ping anyone from 3mdeb Team to join.
    4. +
    5. coreboot toolchain is built by its own build system, which would be hard to + couple with Dockerfile or something else.
    6. +
    7. Docker images can be signed using docker trust commands as described + here.
    8. +
    9. Other idea would be to use wget and dpkg -i for every needed package in + Dockerfile that create base image for reproducible toolchain. Of course + that means quite extensive dependency management, but maybe simplicity is worth + the effort.
    10. +
    11. It is also possible to maintain VMs per given coreboot (or other OSF) + version. That may mean long term VM image compatibility issues as well as + problems with making sure images would work with various hypervisor versions. + It is even more complex if multiple OS should be supported. VMs also have quite + big overhead in terms of performance
    12. +
    +

    I'm not tracking all activity in the community, so some claims may be plain +wrong. Please let me know what I miss when I'm wrong.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/osf-trolling-list/jsm_documentation/index.html b/osf-trolling-list/jsm_documentation/index.html new file mode 100644 index 00000000000..e492304afb3 --- /dev/null +++ b/osf-trolling-list/jsm_documentation/index.html @@ -0,0 +1,6016 @@ + + + + + + + + + + + + + + + + + + Jira Service Management - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Jira Service Management client procedure

    +

    Dasharo Support Package

    +

    If you are interested in starting cooperation using the Support Package, it is +the perfect time to start. The Support Package will help us allocate resources +and a secure timeline for your needs. To ensure that we can provide +comprehensive assistance with your current products and future new developments, +we encourage you to choose our new Support Package for more streamlined +cooperation, guaranteed availability, and quick, on-time delivery.

    +

    Why should you add requests to Jira Service Management?

    +

    JSM allows you to easily keep track of the status of individual requests. Each +new request you add means analysis and pricing of task execution. This +conversation will take place on JSM. Progress on the request will also be +reported using JSM.

    +

    Before you raise your first request

    +

    Remember to provide a list of email addresses of people that need access to the +portal. It's required to prepare the organization, where requested people will +automatically receive updates on the ticket statuses.

    +

    How to add a request

    +

    Raising requests using the portal

    +

    To add a new request using the web service:

    +
      +
    1. Go to portal + and select the project.
    2. +
    3. Select a type of request and provide the required data. You can also add + attachments by dragging and dropping them into any part of the web page, or + by clicking the Browse button.
    4. +
    5. When you are ready to send the request, click Send. Your request is created + and awaits our response.
    6. +
    +

    +

    +

    Raising requests using email

    +

    If you prefer raising a request using email, you can do this by sending a +message to special email address generated for the project.

    +

    The email address will be provided to you by separate message.

    +

    Communication through the Jira Service Desk

    +

    You can always add a comment to the request and attach files. You can do it +directly from the JSM request page or using email simply by replying to the +email thread.

    +

    We'll also add comments, questions and quotations in the comment section.

    +

    What happens after you raise a request

    +

    We'll soon let you know about the cost and what solutions are proposed. You'll +also receive information on which requests will be resolved in the next release.

    +

    Process and request statuses

    +

    The diagram below presents what the workflow of JSM requests looks like.

    +

    +
      +
    • Open - your request is created and visible for us, but we didn't start +working on it yet.
    • +
    • Analysis - our team is analyzing your request. We will soon let you know +what will be the cost of resolving this request.
    • +
    • +

      Waiting for the client - your action is required to continue working on the +request. Most of the time it will be:

      +
        +
      1. acceptance of the estimated effort
      2. +
      3. need for additional clarification.
        +

        Note that the request with this status is waiting for your response. Delaying +a response will result with lack of progress being made on the request.

        +
        +
      4. +
      +
    • +
    • +

      Approved - you have accepted the cost, and we will soon start working to +resolve the request.

      +
    • +
    • Rejected - you have rejected the cost of resolving the request, and we will +not work on this request.
    • +
    • In progress - we are actively working on the request.
    • +
    • On hold - the progress on resolving the request has been paused, and the +work may be resumed in the future.
    • +
    • +

      Closed - the request has been resolved, but there was no work to be done or +work was stopped due to:

      +
        +
      1. the client's decision
      2. +
      3. feasibility study showed 0% success rate
      4. +
      5. other
      6. +
      +
    • +
    • +

      Done - the request is resolved, and work has been completed.

      +
    • +
    +

    Support budget

    +

    After completing the requests, you'll receive information about the state of +your support budget by email (by default two times a month).

    +

    SLAs

    +

    Our team aims to provide the best support experience. We want you to always be +up to date on the status of your request. We are doing our best to reply on your +request in less that 36 hours.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/osf-trolling-list/trusted_computing/index.html b/osf-trolling-list/trusted_computing/index.html new file mode 100644 index 00000000000..15f02cdaed6 --- /dev/null +++ b/osf-trolling-list/trusted_computing/index.html @@ -0,0 +1,5814 @@ + + + + + + + + + + + + + + + + + + Trusted Computing - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    [OSFI002] Trusted computing

    +
    +

    [OSFI0020] CRTM what it stand for?

    +

    According to +TCG Glossary v1.1 rev1.0 +published in 2017 correct definition is:

    +
    +

    The instructions executed by the platform when it acts as the RTM. [Formerly +described as “Core Root of Trust for Measurement”. Code Root of +Trust for Measurement is the preferred expansion.] This acronym expansion is +preferred.

    +
    +

    Not every one agree with that expansion of CRTM abbreviation. What do you think?

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/projects/trenchboot-aem-v2/index.html b/projects/trenchboot-aem-v2/index.html new file mode 100644 index 00000000000..d5447ba4dbb --- /dev/null +++ b/projects/trenchboot-aem-v2/index.html @@ -0,0 +1,6206 @@ + + + + + + + + + + + + + + + + + + TrenchBoot Anti Evil Maid (current plan - v2) - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + + +

    Trenchboot as Anti Evil Maid

    +

    Abstract

    +

    As Qubes OS users, promoters, and developers, we understand how essential it is +to be aware of the latest developments in maintaining the security of your +favorite operating system. We're excited to share our plans to integrate the +TrenchBoot Project into Qubes OS's new Anti-Evil Maid (AEM) implementation. As +you may know, traditional firmware security measures like UEFI Secure Boot and +measured boot, even with a Static Root of Trust (SRT), may only sometimes be +enough to ensure a completely secure environment for your operating system. +Compromised firmware may allow for the injection of malicious software into +your system, making it difficult to detect. To overcome these limitations, many +silicon vendors have started implementing Dynamic Root of Trust (DRT) +technologies to establish a secure environment for operating system launch and +integrity measurements. We're excited to take advantage of these advancements +through integration with the TrenchBoot Project.

    +

    The usage of DRT technologies like Intel Trusted Execution Technology (TXT) or +AMD Secure Startup becomes more and more significant, for example, Dynamic Root +of Trust for Measurement (DRTM) requirements of Microsoft Secured Core +PCs. In open-source projects, DRTM hasn't found its place yet, +but that gradually changes. The demand on having firmware independent Roots of +Trust is increasing and projects that satisfy this demand are growing, for +instance, TrenchBoot. TrenchBoot is a framework that allows +individuals and projects to build security engines to perform launch integrity +actions for their systems. The framework builds upon Boot Integrity +Technologies (BITs) that establish one or more Roots of Trust (RoT) from which +a degree of confidence that integrity actions were not subverted is derived. The +project has grown a lot thanks to the previous NLnet NGI0 PET grant +and now it looks for further expansion into extensive use of the DRT +technologies in open-source and security-oriented operating systems like +Qubes OS. Qubes OS Anti Evil Maid (AEM) software +heavily depends on the availability of the DRTM technologies to prevent the +Evil Maid attacks. However, the project hasn't evolved much +since the beginning of 2018 and froze on the support of TPM 1.2 with Intel TXT +in legacy boot mode (BIOS). This effectively limits the usage of this security +software to older Intel machines only. TPM 1.2 implemented SHA1 hashing +algorithm which is nowadays considered weak in the era of forever-increasing +computer performance and quantum computing. The solution to this problem comes +with a newer TPM 2.0 with more agile cryptographic algorithms and SHA256 +implementation by default. Qubes OS AEM software suffers from the following:

    +
      +
    1. Lack of TPM 2.0 support to handle more secure hashes and safer design of the + TPM firmware according to a newer specification.
    2. +
    3. Qubes OS AEM has never supported any AMD processors with AMD Secure Startup + technology. Implementing AMD support would make a huge impact and broaden + the usage of DRTM technologies.
    4. +
    +

    The initial AEM implementation relied on the Trusted Boot project, +Intel's reference implementation of Intel TXT. It had never any plans to +support AMD processors. TrenchBoot is filling this gap supporting both Intel +and AMD hardware which makes it an ideal target to replace Trusted Boot in +Qubes OS AEM implementation. Furthermore, the project grant would be used to +implement the missing pieces in the Qubes OS AEM software to cover the AMD and +Intel support for both TPM 1.2 and TPM 2.0.

    +

    Compare your own project with existing or historical efforts

    +

    3mdeb is a licensed provider for quality coreboot consulting services for 7 +years. We are well-known in the open-source community for maintaining firmware +of the PC Engines APU series platform for over 7-years. Delivering high-quality +firmware releases each month and providing technical support on PC Engines and +OPNSense forums. 3mdeb embedded systems developers are experienced engineers +accustomed to operating systems development. Our developers have contributed to +the fwupd support for Qubes OS. 3mdeb is also regularly +co-organizing mini-conference events with Qubes OS maintainer Marek +Marczykowski-Górecki where various topics related to Qubes OS security are +discussed. Among them, the Anti Evil Maid was frequently presented by 3mdeb +engineers:

    + +

    3mdeb, with financial support from Qubes OS, developed a proof of concept +replacing Trusted Boot with TrenchBoot on Intel hardware with TPM 1.2. Qubes OS +and 3mdeb already tested a new solution with Qubes OS Anti Evil Maid, which is +available for community use. The result of this solution can be seen in the +published blog post that concludes the first phase of integrating TrenchBoot +Anti Evil Maid for Qubes OS. The numbering of the next phases of the project +will commence with number 2 in order to maintain consistency with the work +already completed in phase 1. The following application +describes the remaining work required to have production quality adoption in +one of the most popular secure operating system on the market.

    +

    What are the significant technical challenges you expect to solve

    +

    First of all Qubes OS AEM software consists of software packages providing +Trusted Boot and the Qubes OS TPM scripts. These software +packages would need to replace the Trusted Boot with TrenchBoot supported GRUB2 +and Xen.

    +

    Secondly, the TPM scripts require adding support for TPM 2.0 equivalent +functionality. AEM requires access to non-volatile RAM inside TPM which is +defined differently in the TPM 2.0 specification compared to TPM 1.2.

    +

    Another challenge would be to update the TrenchBoot components for AMD +platforms to the recent boot protocol, which will allow AMD platforms to take +advantage of the QubesOS AEM feature, and TrenchBoot.

    +

    Requested support

    +
      +
    1. +

      Phase 2 - TPM 2.0 support in Qubes OS AEM (Intel hardware):

      +
        +
      • +

        Implement support for TPM 2.0 module in Xen

        +

        Required to measure Dom0 kernel and initial ram disk before they are +executed.

        +
      • +
      • +

        Implement support for TPM 2.0 event log in Xen

        +

        Required to log the Dom0 kernel and initial ram disk hashes to the TPM +event log. The event log could be used for future system attestation.

        +
      • +
      • +

        Implement parallel CPU cores bring-up for DRTM launch

        +

        Currently the CPU cores are being woken up in parallel, but later they +are hacked to be waiting in a queue. If any interrupt would come at +that time, it could be a serious danger. It has to be fixed as soon as +possible, as required by Intel TXT specification.

        +
      • +
      • +

        Integrate TPM 2.0 software stack into Qubes OS Dom0

        +
      • +
      • +

        Extend the AEM scripts to detect TPM version on the platform

        +

        While AEM fully supports TPM 1.2 there is no support for TPM 2.0 at +all. When the TPM family is determined the script should use the +appropriate software stack for given TPM. The task implements the AEM +TPM 1.2 equivalent functionalities using TPM 2.0 software stack and as +a result allowing the use of TPM 2.0 with Qubes OS AEM. It will require +implementing the access to TPM 2.0 NVRAM, sealing and unsealing the +secret data and generating TOTP.

        +
      • +
      • +

        Extend the AEM scripts to use appropriate software stack for TPM 2.0

        +

        Currently, only TPM 1.2 is supported in Qubes OS AEM service code. The +3 items above will ensure the necessary software for TPM 2.0 is +available and AEM scripts executed early from the initrd can detect +which TPM family is present on the platform and use appropriate +software stack and functions. TPM 1.2 and TPM 2.0 software stacks are +not compatible so the scripts themselves must use proper API for given +TPM and its respective software stack.

        +
      • +
      • +

        Update Qubes OS AEM documentation

        +
      • +
      • +

        Test the solution on Intel hardware with TPM 1.2 and 2.0 using legacy + boot mode

        +
      • +
      +
    2. +
    3. +

      Phase 3 - Update to the newest TrenchBoot boot protocol:

      +
        +
      • +

        Code rebase onto the most recent work implementing Secure Launch protocol + being upstreamed to Linux and GRUB

        +

        The current state of TrenchBoot support has diverged with what was +developed for QubesOS AEM for Intel hardware with TPM 1.2. The task +aims to update the work and align with the TrenchBoot boot protocol +being upstreamed to GRUB and Linux kernel. Xen shall take similar +approach as Linux kernel in terms of DRTM launch.

        +
      • +
      • +

        Test the solution on Intel hardware with TPM 1.2 and TPM 2.0 using + legacy boot mode

        +
      • +
      +
    4. +
    5. +

      Phase 4 - AMD support for Qubes OS AEM with TrenchBoot:

      +
        +
      • +

        Update the Secure Kernel Loader (formerly LandingZone) package support + for QubesOS

        +

        Since the initial work done by 3mdeb engineers for AMD AEM in Qubes OS +a lot of time has passed and Secure Kernel Loader - SKL (formerly +Landing Zone) has improved a lot and added new features. SKL is an +open-source module written by TrenchBoot developers required by AMD +Secure Startup technology to perform DRTM launch. The task aims to +refresh the previous work and update the SKL package for Qubes OS to +the newest revision.

        +
      • +
      • +

        TrenchBoot Secure Kernel Loader (SKL) improvements for AMD server + CPUs with multiple nodes

        +

        While SKL was extensively tested on System on Chip and single CPU +platforms, it was not much tested on workstation/server segment CPUs +which are more complex. For example one server CPU package may contain +two independent CPUs inside called nodes. Each node will enable +protection on the SKL during DRTM execution. This protection has to be +disabled on each node when TrenchBoot DRTM tasks are done. The task +implements the correct support for server CPUs in TrenchBoot SKL.

        +
      • +
      • +

        Update TrenchBoot boot protocol for AMD in GRUB2

        +

        Some work to implement TrenchBoot support for Qubes OS on AMD hardware +has been done. GRUB2 with TrenchBoot support has been added to Qubes +building system on 3mdeb fork. The task aims to +update the work and align with the TrenchBoot boot protocol being +upstreamed to GRUB2 and Linux kernel.

        +
      • +
      • +

        Update TrenchBoot boot protocol for AMD in Secure Kernel Loader

        +

        The task aims to update the TrenchBoot boot protocol for AMD platforms +in Secure Kernel Loader and align with the TrenchBoot boot protocol +being upstreamed to GRUB2 and Linux kernel.

        +
      • +
      • +

        Test the solution on AMD hardware with TPM 2.0 and TPM 1.2 with legacy + boot mode

        +
      • +
      +
    6. +
    +

    Projects or organizations relevant to this project before?

    +
      +
    1. Qubes OS
    2. +
    3. Xen Hypervisor
    4. +
    5. GNU GRUB
    6. +
    7. TrenchBoot
    8. +
    9. Invisible Things Lab
    10. +
    11. Apertus Solutions
    12. +
    13. Oracle
    14. +
    15. 3mdeb
    16. +
    +

    The ecosystem of the project

    +

    3mdeb has a good relationship with the maintainers of relevant projects which +will participate in review of the work:

    +
      +
    • Marek Marczykowski-Górecki (Invisible Things Lab CTO) - Qubes OS maintainer
    • +
    • Andrew Cooper (Citrix) - Xen Hypervisor Maintainer
    • +
    • Daniel Kiper (Oracle) - GRUB2 Maintainer
    • +
    • Daniel Smith (Apertus Solutions) - TrenchBoot founder and maintainer
    • +
    +

    Review

    +

    Further reviews and suggestions are welcome. You can do it in two ways:

    +
      +
    • using Giscus on the bottom of this page
    • +
    • contributing to this repository directly via Pull Request
    • +
    + + + + + + + + + + +

    Comments

    + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/projects/trenchboot-aem/index.html b/projects/trenchboot-aem/index.html new file mode 100644 index 00000000000..75648df2f99 --- /dev/null +++ b/projects/trenchboot-aem/index.html @@ -0,0 +1,6246 @@ + + + + + + + + + + + + + + + + + + TrenchBoot Anti Evil Maid (previoius plan - v1) - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + + +

    Trenchboot as Anti Evil Maid

    +

    This is out of date and left here as a reference. Please use the current +version of the plan for up-to-date information

    +

    Abstract

    +

    The firmware is the heart of the security of a given system and should always +be up-to-date to maintain the computer's security. However, being up to date +does not prevent the firmware vulnerabilities from appearing. The Static Root +of Trust (SRT) like Unified Extensible Firmware Interface (UEFI) Secure Boot +and measured boot provided by the firmware is not always sufficient to +establish a secure environment for an operating system. If the firmware is +compromised, it could inject malicious software into operating system +components and prevent the machine owner from detecting it. Silicon vendors +implement alternative technologies to establish a Dynamic Root of Trust (DRT) +to provide a secure environment for operating system launch and integrity +measurements. Either from SRT or DRT, these integrity measurements can be used +for operating system attestation. However, DRT technologies are designed to +provide the ability to establish a secure environment for integrity +measurements at any arbitrary point of time instead of relying on the firmware, +which requires machine reset to establish the aforementioned secure +environment.

    +

    The usage of DRT technologies like Intel Trusted Execution Technology (TXT) or +AMD Secure Startup becomes more and more significant, for example, Dynamic Root +of Trust for Measurement (DRTM) requirements of +Microsoft Secured Core PCs. DRTM hasn't found its place in +open-source projects yet, but that gradually changes. The demand on having +firmware independent Roots of Trust is increasing, and projects that satisfy +this demand are growing, for instance, TrenchBoot. TrenchBoot is a +framework that allows individuals and projects to build security engines to +perform launch integrity actions for their systems. The framework builds upon +Boot Integrity Technologies (BITs) that establish one or more Roots of Trust +(RoT) from which a degree of confidence that integrity actions were not +subverted is derived. The project has grown a lot thanks to the previous +NLnet NGI0 PET grant and now it looks for further expansion +into extensive use of the DRT technologies in open-source and security-oriented +operating systems like Qubes OS. +Qubes OS Anti Evil Maid (AEM) software heavily depends on the +availability of the DRTM technologies to prevent the +Evil Maid attacks. However, the project hasn't evolved much since +the beginning of 2018 and froze on the support of TPM 1.2 with Intel TXT in +legacy boot mode (BIOS). Because of that, the usage of this security software +is effectively limited to older Intel machines only. TPM 1.2 implemented SHA1 +hashing algorithm, which is nowadays considered weak in the era of +forever-increasing computer performance and quantum computing. The solution to +this problem comes with a newer TPM 2.0 with more agile cryptographic +algorithms and SHA256 implementation by default. Qubes OS AEM software suffers +from the following:

    +
      +
    1. Lack of TPM 2.0 support to handle more secure hashes and safer design of the + TPM firmware according to a newer specification.
    2. +
    3. Lack of UEFI mode support. All modern systems boot in UEFI mode only. Legacy + boot modes are being deprecated and dropped from the PC firmware. The AEM + usage is not possible on most if not all modern machines.
    4. +
    5. Qubes OS AEM has never supported AMD processors with AMD Secure Startup + technology. Implementing AMD support would make a significant impact and + broaden the usage of DRTM technologies.
    6. +
    +

    The initial AEM implementation relied on the Trusted Boot, +Intel's reference implementation of Intel TXT. It never had any plans to +support AMD processors. TrenchBoot is filling this gap, supporting both Intel +and AMD hardware which makes it an ideal target to replace Trusted Boot in +Qubes OS AEM implementation. Furthermore, the project grant would be used to +implement the missing pieces in the Qubes OS AEM software to cover the AMD and +Intel support for both TPM 1.2 and TPM 2.0.

    +

    Compare your own project with existing or historical efforts

    +

    3mdeb is a licensed provider for quality coreboot consulting services since +2016. We are well-known in the open-source community for maintaining the +firmware of the PC Engines APU series platform since 2016. Delivering +high-quality firmware releases each month and providing technical support on PC +Engines and OPNSense forums. 3mdeb embedded systems developers are experienced +engineers accustomed to operating systems development. Our developers have +contributed to the fwupd support for Qubes OS. 3mdeb is also +regularly co-organizing mini-conference events with Qubes OS maintainer Marek +Marczykowski-Górecki, where various topics related to Qubes OS security are +discussed. Among them, the Anti Evil Maid was frequently presented by 3mdeb +engineers:

    + +

    A similar approach was already tried by Assured Information Security (AIS) to +boot Xen in UEFI mode with Intel TXT DRTM technology. However, this +is only a tiny portion of the work covered by our proposal. Additionally, +Qubes OS does not launch using Xen.efi like in the AIS work but uses +Multiboot2 protocol with GRUB2 instead, making this approach +unusable. Moreover, the Xen.efi approach is much more complex and assumes usage +of Trusted Boot, limiting the feature to Intel hardware only.

    +

    What are the significant technical challenges you expect to solve

    +

    First of all, Qubes OS AEM software consists of software packages providing +Trusted Boot and the Qubes OS TPM scripts. These software +packages would need to replace the Trusted Boot with TrenchBoot supported GRUB2 +and Xen. Secondly, the TPM scripts require adding support for TPM 2.0 +equivalent functionality. AEM requires access to non-volatile RAM inside TPM, +which is defined differently in the TPM 2.0 specification compared to TPM 1.2.

    +

    Another challenge would be to make Xen possible to boot in UEFI boot mode +without Boot Services defined in UEFI specification. Boot Services are a set of +functions exposed in UEFI structures that are used to help with handling the +boot process. However, the main principle of DRTM technologies is to not depend +on any external code that is not a part of the operating system software to be +executed after DRTM. UEFI Boot Services are a part of the firmware of which +DRTM tries to be independent. The whole security concept of DRTM depends on +cutting the ties with firmware. Thus the work includes implementing the +capability in Xen not to use the UEFI Boot Services, which GRUB2 would +terminate before DRTM is executed. Xen also contains an option not to use the +UEFI Runtime Services. Runtime Services is a set of functions available +throughout the whole machine lifetime, which means some firmware +functionalities are available even when the operating system is launched.

    +

    Removing the Boot Services from Xen brings certain drawbacks to the system +because the Boot Services hold essential information like memory map, TPM event +log, graphics framebuffer, etc. This information must be extracted by GRUB +before Boot Services are terminated and passed to the Xen. The proposed +solution is to pass this information via the Multiboot2 tags defined in the +specification for this particular Boot Services information.

    +

    Another challenge would be to get the work merged in the upstream repositories. +It would ensure the long-term support and maintenance of the solution and +availability. Providing software packages to be used out of the box is crucial +for technology availability.

    +

    Requested support

    +
      +
    1. +

      Phase 1: TrenchBoot Intel TXT and TPM 1.2 support

      +
        +
      • +

        Add TPM 1.2 support for Intel TXT in TrenchBoot GRUB2

        +

        The TrenchBoot support hasn't been implemented and verified with TPM +1.2 on Intel TXT path. This requirement ensures that the TPM 1.2 is also +supported for older Intel hardware with Intel TXT.

        +
      • +
      • +

        Xen Secure Launch - Intel TXT support in Xen for TrenchBoot

        +

        Due to the requirements of Intel TXT and how it is utilized, it is +impossible to use the Xen boot protocols defined in the UEFI or +Multiboot2 specifications. This task aims to create a custom Intel TXT +entry point for Xen, which would hand off to the standard Multiboot2 +entry point and enable the direct launch of Xen by GRUB via DRTM on +Intel hardware. Additionally, there is no support for launching Xen +with Intel TXT other than Trusted Boot. It has to be ported from +Trusted Boot specific code:

        +
          +
        • constructing MLE header
        • +
        • waking up APs
        • +
        • restoring MTRRs
        • +
        • reserving the TXT memory
        • +
        • reenabling SMIs
        • +
        • handling TXT shutdown and S3 resume/suspend
        • +
        • TPM event log finding
        • +
        +
      • +
      • +

        Test the solution on Intel hardware with TPM 1.2 with legacy boot mode

        +
      • +
      +
    2. +
    3. +

      Phase 2 - Qubes OS AEM TPM 2.0 support:

      +
        +
      • +

        Extend the AEM scripts to detect TPM version on the platform

        +

        As TPM 1.2 and TPM 2.0 use different software stacks and tools, it is +necessary to distinguish the TPM module family and use the appropriate +software. The task will implement the logic to distinguish the TPM +families.

        +
      • +
      • +

        Extend the AEM scripts to use the appropriate software stack for TPM 2.0

        +

        While AEM fully supports TPM 1.2, there is no support for TPM 2.0 at +all. When the TPM family is determined, the script should use the +appropriate software stack for the given TPM. The task implements the +AEM TPM 1.2 equivalent functionalities using TPM 2.0 software stack and +as a result allowing the use of TPM 2.0 with Qubes OS AEM. It will +require implementing the access to TPM 2.0 NVRAM, sealing and unsealing +the secret data, and generating TOTP.

        +
      • +
      • +

        Test the solution on Intel hardware with TPM 2.0 with legacy boot mode

        +
      • +
      +
    4. +
    5. +

      Phase 3 - Qubes OS AEM AMD support:

      +
        +
      • +

        Rebase and refresh TrenchBoot GRUB2 for QubesOS

        +

        Some work to implement TrenchBoot support for Qubes OS on AMD hardware +has been done. GRUB2 with TrenchBoot support has been added to Qubes +building system on 3mdeb fork +The task aims to refresh the work and align with the upstream +Qubes OS GRUB2 repository

        +
      • +
      • +

        Clean up the Secure Kernel Loader (formerly LandingZone) package support + for QubesOS

        +

        Since the initial work done by 3mdeb engineers for AMD AEM in Qubes OS, +a lot of time has passed, and Secure Kernel Loader - SKL (formerly +Landing Zone) has improved a lot and added new features. SKL is an +open-source module written by TrenchBoot developers required by AMD +Secure Startup technology to perform DRTM launch. The task aims to +refresh the previous work and update the SKL package for Qubes OS to +the newest revision.

        +
      • +
      • +

        TrenchBoot Secure Kernel Loader (SKL) improvements for AMD server CPUs with + multiple nodes

        +

        While SKL was extensively tested on System on Chip and single CPU +platforms, it was not tested on workstation/server segment CPUs which +are more complex. For example, one server CPU package may contain two +independent CPUs inside called nodes. Each node will enable protection +on the SKL during DRTM execution, and this protection must be disabled +on each node when TrenchBoot DRTM tasks are done. The task implements +the correct support for server CPUs in TrenchBoot SKL.

        +
      • +
      • +

        Test the solution on AMD hardware with TPM 2.0 and TPM 1.2 with legacy boot + mode

        +
      • +
      +
    6. +
    7. +

      Phase 4 - Xen UEFI boot mode with DRTM:

      +
        +
      • +

        TrenchBoot support for UEFI boot mode for AMD in GRUB

        +

        While TrenchBoot DRTM was extensively tested on Intel hardware with +UEFI firmware and Linux, it was not on AMD platforms. This task ensures +that DRTM works with UEFI boot mode on AMD processors in GRUB2 and +Linux without UEFI Boot Services.

        +
      • +
      • +

        TrenchBoot support for UEFI boot mode in Xen

        +

        When UEFI boot mode with TrenchBoot is working with GRUB2 and Linux, +all that is missing to fully support AMD and Intel hardware with Qubes +OS AEM is the Xen support to boot in UEFI mode without Boot Services. +This requires a significant amount of work to ensure that all +information that Xen would obtain from UEFI Boot Services would still +be available. The information has to be passed by GRUB2 to Xen via +Multiboot2 protocol:

        +
          +
        • EFI memory map
        • +
        • Framebuffer information
        • +
        • PCI devices information with their option ROMs
        • +
        +

        Additionally "EFI boot services not terminated" Multiboot2 tag must not +be passed to Xen by GRUB2 on DRTM launch when GRUB2 will terminate Boot +Services. Xen should detect such situations and act according to the +state of Boot Services. Xen will be implemented to:

        +
          +
        • parse the EFI memory map, framebuffer information, and PCI devices + information passed by GRUB2
        • +
        • do not expose the "EFI boot services" Multiboot2 tag indicating that + Xen can be executed without UEFI Boot Services presence
        • +
        • allocate the memory space for the trampoline used to launch other + processors or use the allocation done by GRUB2 if necessary
        • +
        • do not go error path when Boot Services are not present and skip all + calls to UEFI Boot Services by using the information provided by + GRUB2
        • +
        +
      • +
      • +

        Test the solution on AMD and Intel hardware with TPM 2.0 and TPM 1.2 with + legacy and UEFI boot mode

        +
      • +
      +
    8. +
    +

    Projects or organizations relevant to this project before?

    +
      +
    1. Qubes OS
    2. +
    3. Xen Hypervisor
    4. +
    5. GNU GRUB
    6. +
    7. TrenchBoot
    8. +
    9. Invisible Things Lab
    10. +
    11. Apertus Solutions
    12. +
    13. Oracle
    14. +
    15. 3mdeb
    16. +
    +

    The ecosystem of the project

    +

    3mdeb has a good relationship with the maintainers of relevant projects which +will participate in the review of the work:

    +
      +
    • Marek Marczykowski-Górecki (Invisible Things Lab CTO) - Qubes OS maintainer
    • +
    • Andrew Cooper (Citrix) - Xen Hypervisor Maintainer
    • +
    • Daniel Kiper (Oracle) - GRUB2 Maintainer
    • +
    • Daniel Smith (Apertus Solutions) - TrenchBoot founder and maintainer
    • +
    +

    Review

    +

    Further reviews and suggestions are welcome. You can do it in two ways:

    +
      +
    • using Giscus on the bottom of this page
    • +
    • contributing to this repository directly via Pull Request
    • +
    + + + + + + + + + + +

    Comments

    + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/quality-principles/introduction/index.html b/quality-principles/introduction/index.html new file mode 100644 index 00000000000..aec30886118 --- /dev/null +++ b/quality-principles/introduction/index.html @@ -0,0 +1,5941 @@ + + + + + + + + + + + + + + + + + + Quality Principles - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Quality Principles

    +

    Secure Delivery

    +

    Each Dasharo release is secured cryptographically, ensuring with RSA 4096 keys +the authenticity of binary SHA-256 integrity checksum. The three-step key +verification is guarantees that your client receives a clean file without any +third-party modifications. Integrity and signature verification procedure is +included, so that the key compliance can be easily checked.

    +

    Secure Maintenance

    +

    Dasharo doesn't believe in security through obscurity. That is why each Dasharo +firmware is supported with the system of Transparent Validation, proving its +efficiency and quality with testing results. As an Open Source product, it +provides timely emergency releases and patches together with long-lasting +maintenance.

    +

    Credibility

    +

    Dasharo values credibility. Each release is extended by a validation report +based on a project charter and a complete changelog with a description of the +product versioning.

    +

    Transparency

    +

    Generic testing procedures for a given Dasharo product line are included in the +product documentation. Specific testing procedures are delivered in the form of +a PDF document accompanying a release.

    +

    Availability

    +

    Dasharo product line page includes a hardware compatibility platform list. The +platform for which the new product line is created becomes its reference +platform. The consecutive hardware platforms are added to the hardware compatibility +list (HCL).

    +

    Compliance

    +

    No danger of version lock. Dasharo releases are versioned according to the +[Semantic Versioning 2.0.0] (https://semver.org/) specification for the sake of +consistency. Release notes comply with the [Keep A Changelog 1.0.0] +specification (https://keepachangelog.com/en/1.0.0/).

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000000..66daa2f32eb --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"About Dasharo is an open-source firmware distribution focusing on seamless deployment, clean and simple code, long-term maintenance, professional support, transparent validation, superior documentation, privacy-respecting implementation, liberty for the owners and trustworthiness for all. More about Dasharo Dasharo homepage Dasharo is registered trademark and product developed by 3mdeb . Compatible hardware Refer to the Supported hardware section. Community Dasharo Matrix Workspace - general Dasharo discussion, support and other open-source firmware related work. Dasharo OSF vPub - 3-4 times a year we organize online party to discuss recent achievements in open-source firmware, open source hardware and open instruction set architecture. Feel free to check the website about recent vPub plans or subscribe to newsletter. Discord server Dasharo Twitter account","title":"About Dasharo"},{"location":"#_1","text":"","title":""},{"location":"#about","text":"Dasharo is an open-source firmware distribution focusing on seamless deployment, clean and simple code, long-term maintenance, professional support, transparent validation, superior documentation, privacy-respecting implementation, liberty for the owners and trustworthiness for all. More about Dasharo Dasharo homepage Dasharo is registered trademark and product developed by 3mdeb .","title":"About"},{"location":"#compatible-hardware","text":"Refer to the Supported hardware section.","title":"Compatible hardware"},{"location":"#community","text":"Dasharo Matrix Workspace - general Dasharo discussion, support and other open-source firmware related work. Dasharo OSF vPub - 3-4 times a year we organize online party to discuss recent achievements in open-source firmware, open source hardware and open instruction set architecture. Feel free to check the website about recent vPub plans or subscribe to newsletter. Discord server Dasharo Twitter account","title":"Community"},{"location":"glossary/","text":"Glossary After years of providing services and products on firmware market we recognize that it is poisoned by incorrect and confusing terminology. In following glossary we would like to explain most used terms from Dasharo Documentation. We try to refer to standards, literature and community best practices to keep content added by us minimalistic. Embedded Firmware We use definition explained in first chapter of \"Embedded Firmware Solutions\" book by Jiming Sun, Marc Jones, Stefan Reinauer and Vincent Zimmer. Firmware is \"layer of software between the hardware and the operating system (OS), with the main purpose to initialize and abstract enough hardware so that the operating systems and their drivers can further configure the hardware to its full functionality.\" Rising complexity of hardware initialization and need for its manageability created need for BMC (Board Management Controllers), EC (Environmental Controllers) and even more specialized one like USB Power Delivery firmware. What may make that firmware also covered by above definition. Dasharo Hardware Compatibility List Report Dasharo HCL Report dumps most important information about platform and backup SPI NOR flash. Gathered information can be used for future analysis, debugging and recovery. Optionally scripts upload dump to Dasharo HCL Backup Server, so Dasharo Team can improve open source firmware product line and support customers in case of issues. As temporary solution we use 3mdeb NextCloud as Dasharo HCL Backup Server. Dasharo HCL Reports are also used during open source firmware port feasibilty analysis, so if you are interested in Dasharo support for your hardware, feel free to reach us . Please note Dasharo HCL Report may contain sensitive information like serial numbers. Please do not make this information public. Dasharo Team respect your privacy. Dasharo Blobs Transmission Unfortunately, some hardware platforms cannot be fully functional without binary blobs in the firmware. Some binary blobs have no EULA or any other license discussing redistributability. To avoid issues, Dasharo Blobs Transmission scripts extract blobs from SPI NOR flash backup and patch Dasharo open-source firmware distribution before initial deployment.","title":"Glossary"},{"location":"glossary/#glossary","text":"After years of providing services and products on firmware market we recognize that it is poisoned by incorrect and confusing terminology. In following glossary we would like to explain most used terms from Dasharo Documentation. We try to refer to standards, literature and community best practices to keep content added by us minimalistic.","title":"Glossary"},{"location":"glossary/#embedded-firmware","text":"We use definition explained in first chapter of \"Embedded Firmware Solutions\" book by Jiming Sun, Marc Jones, Stefan Reinauer and Vincent Zimmer. Firmware is \"layer of software between the hardware and the operating system (OS), with the main purpose to initialize and abstract enough hardware so that the operating systems and their drivers can further configure the hardware to its full functionality.\" Rising complexity of hardware initialization and need for its manageability created need for BMC (Board Management Controllers), EC (Environmental Controllers) and even more specialized one like USB Power Delivery firmware. What may make that firmware also covered by above definition.","title":"Embedded Firmware"},{"location":"glossary/#dasharo-hardware-compatibility-list-report","text":"Dasharo HCL Report dumps most important information about platform and backup SPI NOR flash. Gathered information can be used for future analysis, debugging and recovery. Optionally scripts upload dump to Dasharo HCL Backup Server, so Dasharo Team can improve open source firmware product line and support customers in case of issues. As temporary solution we use 3mdeb NextCloud as Dasharo HCL Backup Server. Dasharo HCL Reports are also used during open source firmware port feasibilty analysis, so if you are interested in Dasharo support for your hardware, feel free to reach us . Please note Dasharo HCL Report may contain sensitive information like serial numbers. Please do not make this information public. Dasharo Team respect your privacy.","title":"Dasharo Hardware Compatibility List Report"},{"location":"glossary/#dasharo-blobs-transmission","text":"Unfortunately, some hardware platforms cannot be fully functional without binary blobs in the firmware. Some binary blobs have no EULA or any other license discussing redistributability. To avoid issues, Dasharo Blobs Transmission scripts extract blobs from SPI NOR flash backup and patch Dasharo open-source firmware distribution before initial deployment.","title":"Dasharo Blobs Transmission"},{"location":"newcomers/","text":"Newcomers If you are new to Dasharo, this section is to help you get started using Dasharo firmware and possibly contributing to making it better. coreboot If you have no prior experience with coreboot, it's highly recommended to visit OpenSecurityTraining2 and finish these courses: Arch4031 , Arch4021 OpenSecurityTraining2 provides other great courses related to firmware, which are all freely available here . Docker coreboot needs a specific toolchain to be built, hence why it is usually built inside of a Docker. In case of Dasharo, all images are built using Docker, so you will make sure it works properly on your system. Follow these two links: Install Docker Engine on Ubuntu Post-installation steps for Linux Once you have Docker set up on your machine, you can pull docker images from coreboot/coreboot-sdk (keep in mind that some platforms require older docker images). To pull a Docker image, use: docker pull coreboot/coreboot-sdk: The typical procedure to build a coreboot image is as follows: git clone https://github.com/Dasharo/coreboot.git cd coreboot git checkout /release docker run -u $UID --rm -it \\ -v $PWD :/home/coreboot/coreboot -w /home/coreboot/coreboot coreboot/coreboot-sdk: \\ bash cp configs/config. .config make olddefconfig make Dasharo Contribution All code review and all issues related to Dasharo are resolved on GitHub . An account there is necessary to contribute and report issues. All Dasharo repositories can be found here . When you have an account on GitHub go ahead and configure an SSH key . It's also highly recommended to configure a GPG key before contributing anything. Instructions to do that can be found here . With that your account should be ready to contribute to Dasharo. Since Dasharo is based on coreboot and edk2, it's best to contribute directly in the upstream if possible. Refer to these documents: contributing to coreboot contributing to edk2 If for some reason you can't contribute your change in upstream repositories, then consider contributing directly to Dasharo. Before doing anything it's best to get familiar with source code structure . To create a patch: fork the repository which you want to edit, in the forked repository: git checkout /develop (make sure to start from the correct branch), create a new branch: git checkout -b / , commit your changes: make sure to sign your commits by using git commit -sm \"\" , should be: path/to/file: Change description , one commit should be one logical change, create a pull request from a fork . Do not forget to check whether patch has been reviewed and changes to your contribution (PR) are needed. If so, remember about answering to each addressed thread with information about change in the commit template: Fixed: example: Fixed 0a2a4ee Dasharo Matrix Space Matrix is a communicator used at Dasharo. If you want quick answers it's best to join our matrix space and talk to us there. Dasharo Matrix Space If you've never used Matrix before, you will first need to get a client. Available clients are listed here .","title":"New? Start here"},{"location":"newcomers/#newcomers","text":"If you are new to Dasharo, this section is to help you get started using Dasharo firmware and possibly contributing to making it better.","title":"Newcomers"},{"location":"newcomers/#coreboot","text":"If you have no prior experience with coreboot, it's highly recommended to visit OpenSecurityTraining2 and finish these courses: Arch4031 , Arch4021 OpenSecurityTraining2 provides other great courses related to firmware, which are all freely available here .","title":"coreboot"},{"location":"newcomers/#docker","text":"coreboot needs a specific toolchain to be built, hence why it is usually built inside of a Docker. In case of Dasharo, all images are built using Docker, so you will make sure it works properly on your system. Follow these two links: Install Docker Engine on Ubuntu Post-installation steps for Linux Once you have Docker set up on your machine, you can pull docker images from coreboot/coreboot-sdk (keep in mind that some platforms require older docker images). To pull a Docker image, use: docker pull coreboot/coreboot-sdk: The typical procedure to build a coreboot image is as follows: git clone https://github.com/Dasharo/coreboot.git cd coreboot git checkout /release docker run -u $UID --rm -it \\ -v $PWD :/home/coreboot/coreboot -w /home/coreboot/coreboot coreboot/coreboot-sdk: \\ bash cp configs/config. .config make olddefconfig make","title":"Docker"},{"location":"newcomers/#dasharo-contribution","text":"All code review and all issues related to Dasharo are resolved on GitHub . An account there is necessary to contribute and report issues. All Dasharo repositories can be found here . When you have an account on GitHub go ahead and configure an SSH key . It's also highly recommended to configure a GPG key before contributing anything. Instructions to do that can be found here . With that your account should be ready to contribute to Dasharo. Since Dasharo is based on coreboot and edk2, it's best to contribute directly in the upstream if possible. Refer to these documents: contributing to coreboot contributing to edk2 If for some reason you can't contribute your change in upstream repositories, then consider contributing directly to Dasharo. Before doing anything it's best to get familiar with source code structure . To create a patch: fork the repository which you want to edit, in the forked repository: git checkout /develop (make sure to start from the correct branch), create a new branch: git checkout -b / , commit your changes: make sure to sign your commits by using git commit -sm \"\" , should be: path/to/file: Change description , one commit should be one logical change, create a pull request from a fork . Do not forget to check whether patch has been reviewed and changes to your contribution (PR) are needed. If so, remember about answering to each addressed thread with information about change in the commit template: Fixed: example: Fixed 0a2a4ee","title":"Dasharo Contribution"},{"location":"newcomers/#dasharo-matrix-space","text":"Matrix is a communicator used at Dasharo. If you want quick answers it's best to join our matrix space and talk to us there. Dasharo Matrix Space If you've never used Matrix before, you will first need to get a client. Available clients are listed here .","title":"Dasharo Matrix Space"},{"location":"ways-you-can-help-us/","text":"Ways you can help us Please consider the following methods to support us if you value what we are doing. Join Dasharo Matrix Community We have created Matrix Dasharo Space, an open-source online community, inviting you to join us. Matrix Dasharo Space is a place where you can find solutions to many problems, and if not - our community will gladly help you. We encourage you to troubleshoot your open-source firmware issues there. Here is invitation link . Inside you will find multiple rooms. The main discussion happens in \"Dasharo - General\". Join Dasharo open-source firmware vPub We encourage you to join us at our vPub parties, which we hold 3-4x / year in \"Dasharo OSF vPub.\" vPub is an alternative to live meeting for those who can't or don't want to meet live. It also served as salvation in times of COVID-19. Our goal is to have a platform for open-source firmware, open-source hardware, and open instruction set architectures discussion in a casual atmosphere. For more information please visit event website . Write a Google review Google reviews help us attract new customers that can sponsor open-source development and provide value to the community. Please follow Google review link . Follow us on social media Follow us on Twitter: Dasharo , 3mdeb Follow us on Mastodon: Dasharo , 3mdeb Follow us on LinkedIn: 3mdeb Like us on Facebook: 3mdeb Join Reddit communities: Dasharo , 3mdeb Contribute through Github If you have a GitHub account, you can help us in multiple ways: Follow out organizations: Dasharo , 3mdeb Give a star to repositories you like If you want to contribute, refer to dasharo contribution Report issues, your test results, and feature ideas in dasharo-issues Donate money A donation of any amount motivates us because it means you care about our open-source firmware mission. It is straightforward if you don't have time for other contributions, and there are multiple options - feel free to choose one that works for you. Become a Dasharo Supporter Buy the Dasharo Supporters Entrance subscription if you own/use/buy a machine running Dasharo firmware: 1-year subcription 2-year subscription 3-year subscription Or buy the hardware including the subscriptions from us, e.g.: MSI PRO Z690-A DDR4 motherboard with Dasharo Supporters Entrance MSI PRO Z690-A DDR4 with Dasharo Supporters Entrance \u2013 Full PC Build or other platforms As a Dasharo Supporter you will get: The latest Dasharo releases issued by Dasharo Team Special Dasharo Updates for Supporters \u2013 Community receives one update per year, but Supporters are not limited to it. Number of updates depends on the number of Dasharo Subscriptions sold and the availability of other funding (e.g., NLNet, corporate sponsors, community donations). Dasharo Primer Support through invite-only Matrix channel where we often gather Supporters opinion and share exciting news about Dasharo direction Insider's view and influence on Dasharo features roadmap \u2013 you can have a real impact on Dasharo development PayPal Transferwise (aka Wise) Donations in USD TransferWise (ACH/ABA: 026073150) IBAN 8311535451 SWIFT: CMFGUS33 Donations in EUR TransferWise Europe SA IBAN: BE11 9672 7712 7548 SWIFT: TRWIBEB1XXX Bank wire Donations in USD 3mdeb Sp. z o.o IBAN: PL 87 1160 2202 0000 0005 1576 2206 SWIFT: BIGBPLPW Donations in EUR 3mdeb Sp. z o.o IBAN: PL 94 1160 2202 0000 0005 1576 1304 SWIFT: BIGBPLPW BTC and other crypto coins Our company does not currently support payment in cryptocurrencies. While we understand that cryptocurrencies have gained popularity and recognition in recent years, we have chosen to retain our focus on conventional payment channels. Firstly, we prioritize financial compliance and adhere to EU regulations. Managing cryptocurrencies would require extensive knowledge and resources to ensure compliance, which we are not equipped to handle at our current stage of development. Moreover, the uncertain and evolving nature of cryptocurrency regulations introduces significant risks and potential vulnerabilities. These factors could potentially lead to fiscal audits that could hamper the operations of 3mdeb and impede the progress of Dasharo development. We believe that by adhering to established payment methods, we can ensure a consistent and reliable payment process for our customers. This allows us to maintain a high level of security, accountability, and regulatory compliance. Technology Commons Trust If you are concerned about the privacy of your donation as well as the fact how we would spend the money, then please consider Technology Commons Trust Open Firmware Fund. Addresses: Bitcoin: 1GUm6FF7Fon6Umrt5CSi3AxxYg8dM2NKvV Monero: 89eBqUwoCpnPoUKD367kJm3Gsw639EUSdG3xwUyQmDroKHWHPyhYmJ63uP41ArHfPsBihNFTYjASpRUGaeSyp3JS9BmtjpQ PKT: pkt1qyv4gmnvvg2vfyj89e63thzj68jf2y9k7ssee7v If you want to contribute to other cryptocurrencies, please visit OFF website for details about contact information. We are pretty sure the Technology Commons Trust team will find the way. Open Collective You can donate by using 3mdeb's Open Collective page - a legal and financial tech platform that enables over 300 groups to raise and spend over $13 million dollars a year in full transparency. Purchasing merchandise We're excited to offer a range of Dasharo merchandise products to help support our open-source firmware distribution project. By purchasing items such as t-shirts and mugs, you can support Dasharo and help us continue developing and improving the firmware. Our online shop makes browsing and ordering merchandise easy, and we offer fast shipping to get your items to you quickly. Whether you're looking for a new t-shirt to wear to events or a mug for your morning coffee, we have various products. Head over to our shop and browse our selection of Dasharo merchandise! Can't see your option? Contact us contact@dasharo.com For OEM/ODM: Join the private-beta program We created Dasharo private beta program for OEM/ODM to improve quality and the efficiency of platform firmware development and deployment. Program benefits: Early access to the Dasharo roadmap reflects the most recent market trends and covers future hardware support and features. Early access to information about firmware development funding campaigns. Early access to source code and release binaries. Dasharo Tools Suite for seamless integration of value-added features. Dasharo Marketing Package helps explain the value that Dasharo brings to the product. Professional support at all stages of the product life cycle. Vertical market integration support. How to join? Please send us an email to contact@dasharo.com .","title":"Ways you can help us"},{"location":"ways-you-can-help-us/#ways-you-can-help-us","text":"Please consider the following methods to support us if you value what we are doing.","title":"Ways you can help us"},{"location":"ways-you-can-help-us/#join-dasharo-matrix-community","text":"We have created Matrix Dasharo Space, an open-source online community, inviting you to join us. Matrix Dasharo Space is a place where you can find solutions to many problems, and if not - our community will gladly help you. We encourage you to troubleshoot your open-source firmware issues there. Here is invitation link . Inside you will find multiple rooms. The main discussion happens in \"Dasharo - General\".","title":"Join Dasharo Matrix Community"},{"location":"ways-you-can-help-us/#join-dasharo-open-source-firmware-vpub","text":"We encourage you to join us at our vPub parties, which we hold 3-4x / year in \"Dasharo OSF vPub.\" vPub is an alternative to live meeting for those who can't or don't want to meet live. It also served as salvation in times of COVID-19. Our goal is to have a platform for open-source firmware, open-source hardware, and open instruction set architectures discussion in a casual atmosphere. For more information please visit event website .","title":"Join Dasharo open-source firmware vPub"},{"location":"ways-you-can-help-us/#write-a-google-review","text":"Google reviews help us attract new customers that can sponsor open-source development and provide value to the community. Please follow Google review link .","title":"Write a Google review"},{"location":"ways-you-can-help-us/#follow-us-on-social-media","text":"Follow us on Twitter: Dasharo , 3mdeb Follow us on Mastodon: Dasharo , 3mdeb Follow us on LinkedIn: 3mdeb Like us on Facebook: 3mdeb Join Reddit communities: Dasharo , 3mdeb","title":"Follow us on social media"},{"location":"ways-you-can-help-us/#contribute-through-github","text":"If you have a GitHub account, you can help us in multiple ways: Follow out organizations: Dasharo , 3mdeb Give a star to repositories you like If you want to contribute, refer to dasharo contribution Report issues, your test results, and feature ideas in dasharo-issues","title":"Contribute through Github"},{"location":"ways-you-can-help-us/#donate-money","text":"A donation of any amount motivates us because it means you care about our open-source firmware mission. It is straightforward if you don't have time for other contributions, and there are multiple options - feel free to choose one that works for you.","title":"Donate money"},{"location":"ways-you-can-help-us/#for-oemodm-join-the-private-beta-program","text":"We created Dasharo private beta program for OEM/ODM to improve quality and the efficiency of platform firmware development and deployment. Program benefits: Early access to the Dasharo roadmap reflects the most recent market trends and covers future hardware support and features. Early access to information about firmware development funding campaigns. Early access to source code and release binaries. Dasharo Tools Suite for seamless integration of value-added features. Dasharo Marketing Package helps explain the value that Dasharo brings to the product. Professional support at all stages of the product life cycle. Vertical market integration support. How to join? Please send us an email to contact@dasharo.com .","title":"For OEM/ODM: Join the private-beta program"},{"location":"common-coreboot-docs/checkbox/","text":"Checkbox certification software usage (Ubuntu 22.04) Introduction Checkbox is a flexible test automation software. It\u2019s the main tool used in Ubuntu Certification program. This document describes the usage of Checkbox on Ubuntu 22.04, but it can work on older versions of Ubuntu as well. Prerequisites To run the maximum number of tests, it is advised to connect as many peripheral devices as possible. Before running the checkbox, connect peripherals to available connectors, such as: External: card reader USB ports display ports Ethernet ports headphone and microphone jacks Thunderbolt ports power supply and battery PCMCIA or ExpressCard slot Internal: DIMM/RAM slots SATA ports PCI/PCIe slots M.2 slots TPM header other slots Set up the testing environment For the tests that don't require any interference after their startup, perform the following steps: To stop the screen from being locked on suspend, open the terminal and run the following command: gsettings set org.gnome.desktop.lockdown disable-lock-screen 'true' To execute all sudo commands without a password, open the terminal and run the following command for a user: echo \"user ALL=(ALL:ALL) NOPASSWD: ALL\" | sudo tee /etc/sudoers.d/user To set up automatic login so that a password is not required during testing reboot, power off etc.: Press the SUPER_KEY , type in Users and click Enter. A window with options to change should appear. Click the user name you want to enable automatic login for. On the top right side of the window, click Unlock ...` button. You will be asked to enter your user password to continue. You should now be able to toggle the Automatic Login button to enable it. Restart your system for changes to take effect. Download and install Checkbox Disable Secure Boot. To do this you can follow the steps described in Secure Boot test . Disable Secure boot is required to properly download packages. Open the terminal and type in the below commands to install Checkbox and all its dependencies: sudo add-apt-repository ppa:hardware-certification/public sudo apt-get update sudo apt-get install checkbox-ng plainbox-provider-resource-generic \\ plainbox-provider-certification-client plainbox-provider-checkbox \\ canonical-certification-client Run automatic validation Start checkbox. To do this, open the terminal and run the following command: sudo checkbox-cli After using the above-mentioned command, the following menu should appear: \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 ( X ) ( Deprecated ) Fully Automatic Client Certification Tests \u2502 \u2502 ( ) After suspend Dock Cert blocker tests \u2502 \u2502 ( ) After suspend Dock Cert tests \u2502 \u2502 ( ) After suspend Dock Hot-plug Cert tests \u2502 \u2502 ( ) After suspend Dock Hot-plug tests \u2502 \u2502 ( ) After suspend LED and oops tests ( using special sleep key ) \u2502 \u2502 ( ) After suspend LED and oops tests ( using special sleep key, cert. \u2502 \u2502 blockers only ) \u2502 \u2502 ( ) After suspend automated USB 3 write/read/compare tests on storage \u2502 \u2502 devices \u2502 \u2502 ( ) After suspend automated USB write/read/compare tests on storage \u2502 \u2502 devices \u2502 \u2502 ( ) After suspend reference tests \u2502 \u2502 ( ) After suspend reference tests ( automated ) \u2502 \u2502 ( ) After suspend reference tests ( certification blockers only ) \u2502 \u2502 ( ) After suspend tests ( discrete GPU automated ) \u2502 \u2502 ( ) After suspend tests ( discrete GPU manual ) \u2502 \u2502 ( ) After suspend tests ( discrete GPU ) \u2502 \u2502 ( ) After suspend tests ( discrete GPU, certification blockers only ) | . . . etc. \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 Select test suites ( SPACE - select, ARROWS - navigation, Enter - go to the next test suite), which you want to run. Marking the first option starts the full automated check. After selecting the first option, all modules should be displayed and you can manually uncheck some modules, which you don't want to test. \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 [ X ] + Audio tests \u2502 \u2502 [ X ] + Benchmarks tests \u2502 \u2502 [ X ] + Bluetooth tests \u2502 \u2502 [ X ] + CPU tests \u2502 \u2502 [ X ] + Camera tests \u2502 \u2502 [ X ] + Disk tests \u2502 \u2502 [ X ] + Ethernet Device tests \u2502 \u2502 [ X ] + Firmware tests \u2502 \u2502 [ X ] + Graphics tests \u2502 \u2502 [ X ] + Informational tests \u2502 \u2502 [ X ] + Input Devices tests \u2502 \u2502 [ X ] + Memory tests \u2502 \u2502 [ X ] + Miscellaneous tests \u2502 \u2502 [ X ] + Mobile broadband tests \u2502 \u2502 [ X ] + Non-device specific networking tests \u2502 \u2502 [ X ] + Optical Drive tests \u2502 \u2502 [ X ] + Power Management tests \u2502 \u2502 [ X ] + Suspend tests \u2502 \u2502 [ X ] + TPM 2 .0 ( Trusted Platform Module ) \u2502 \u2502 [ X ] + Touchpad tests \u2502 . . . etc. \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 Press T to start the testing procedure. You might be asked about the hardware in your machine. Just tick it truthfully and press T again. \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502Does this machine have this piece of hardware? \u2502 \u2502 An Ethernet Port ( X ) YES ( ) NO \u2502 \u2502 Camera/Capture Device ( X ) YES ( ) NO \u2502 \u2502 USB Storage Device Connected ( X ) YES ( ) NO \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 When testing ends, a menu with test results should appear. Press R to rerun test cases, or F to finish. After all, paths to the test results should be displayed in the terminal. By default, they are placed in /home/user/.local/share/checkbox-ng . Additional options run lets you run a particular test plan or a set of jobs, but it does save any results. Example of running one test plan: sudo checkbox-cli run com.canonical.certification::smoke launcher command lets you customize the checkbox experience. To use it, you need to create config_file.ini and start running the checkbox like below: checkbox-cli launcher config_file.ini For more details about these (and others) commands visit checkbox-cli . Troubleshooting When somehow the checkbox stop working you can resume the previous session. To do this, open the terminal and run the following command: sudo checkbox-cli If at least one incomplete session is present on the machine, you should see: Do you want to resume session 'session_title-2022-07-06T13.09.22' ? r = > resume this session n = > next session c = > create new session d = > delete old sessions [ rncd ] : Type in r to resume the stopped session. You can also create a new session or delete an old session by typing the appropriate letter. What do you want to do with that job? s = > skip that job p = > mark it as passed and continue f = > mark it as failed and continue r = > run it [ spfr ] : Decide what you want to do with the last test and type the appropriate letter. After this, your checkbox session will be resumed.","title":"Checkbox certification software usage"},{"location":"common-coreboot-docs/checkbox/#checkbox-certification-software-usage-ubuntu-2204","text":"","title":"Checkbox certification software usage (Ubuntu 22.04)"},{"location":"common-coreboot-docs/checkbox/#introduction","text":"Checkbox is a flexible test automation software. It\u2019s the main tool used in Ubuntu Certification program. This document describes the usage of Checkbox on Ubuntu 22.04, but it can work on older versions of Ubuntu as well.","title":"Introduction"},{"location":"common-coreboot-docs/checkbox/#prerequisites","text":"To run the maximum number of tests, it is advised to connect as many peripheral devices as possible. Before running the checkbox, connect peripherals to available connectors, such as: External: card reader USB ports display ports Ethernet ports headphone and microphone jacks Thunderbolt ports power supply and battery PCMCIA or ExpressCard slot Internal: DIMM/RAM slots SATA ports PCI/PCIe slots M.2 slots TPM header other slots","title":"Prerequisites"},{"location":"common-coreboot-docs/checkbox/#set-up-the-testing-environment","text":"For the tests that don't require any interference after their startup, perform the following steps: To stop the screen from being locked on suspend, open the terminal and run the following command: gsettings set org.gnome.desktop.lockdown disable-lock-screen 'true' To execute all sudo commands without a password, open the terminal and run the following command for a user: echo \"user ALL=(ALL:ALL) NOPASSWD: ALL\" | sudo tee /etc/sudoers.d/user To set up automatic login so that a password is not required during testing reboot, power off etc.: Press the SUPER_KEY , type in Users and click Enter. A window with options to change should appear. Click the user name you want to enable automatic login for. On the top right side of the window, click Unlock ...` button. You will be asked to enter your user password to continue. You should now be able to toggle the Automatic Login button to enable it. Restart your system for changes to take effect.","title":"Set up the testing environment"},{"location":"common-coreboot-docs/checkbox/#download-and-install-checkbox","text":"Disable Secure Boot. To do this you can follow the steps described in Secure Boot test . Disable Secure boot is required to properly download packages. Open the terminal and type in the below commands to install Checkbox and all its dependencies: sudo add-apt-repository ppa:hardware-certification/public sudo apt-get update sudo apt-get install checkbox-ng plainbox-provider-resource-generic \\ plainbox-provider-certification-client plainbox-provider-checkbox \\ canonical-certification-client","title":"Download and install Checkbox"},{"location":"common-coreboot-docs/checkbox/#run-automatic-validation","text":"Start checkbox. To do this, open the terminal and run the following command: sudo checkbox-cli After using the above-mentioned command, the following menu should appear: \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 ( X ) ( Deprecated ) Fully Automatic Client Certification Tests \u2502 \u2502 ( ) After suspend Dock Cert blocker tests \u2502 \u2502 ( ) After suspend Dock Cert tests \u2502 \u2502 ( ) After suspend Dock Hot-plug Cert tests \u2502 \u2502 ( ) After suspend Dock Hot-plug tests \u2502 \u2502 ( ) After suspend LED and oops tests ( using special sleep key ) \u2502 \u2502 ( ) After suspend LED and oops tests ( using special sleep key, cert. \u2502 \u2502 blockers only ) \u2502 \u2502 ( ) After suspend automated USB 3 write/read/compare tests on storage \u2502 \u2502 devices \u2502 \u2502 ( ) After suspend automated USB write/read/compare tests on storage \u2502 \u2502 devices \u2502 \u2502 ( ) After suspend reference tests \u2502 \u2502 ( ) After suspend reference tests ( automated ) \u2502 \u2502 ( ) After suspend reference tests ( certification blockers only ) \u2502 \u2502 ( ) After suspend tests ( discrete GPU automated ) \u2502 \u2502 ( ) After suspend tests ( discrete GPU manual ) \u2502 \u2502 ( ) After suspend tests ( discrete GPU ) \u2502 \u2502 ( ) After suspend tests ( discrete GPU, certification blockers only ) | . . . etc. \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 Select test suites ( SPACE - select, ARROWS - navigation, Enter - go to the next test suite), which you want to run. Marking the first option starts the full automated check. After selecting the first option, all modules should be displayed and you can manually uncheck some modules, which you don't want to test. \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 [ X ] + Audio tests \u2502 \u2502 [ X ] + Benchmarks tests \u2502 \u2502 [ X ] + Bluetooth tests \u2502 \u2502 [ X ] + CPU tests \u2502 \u2502 [ X ] + Camera tests \u2502 \u2502 [ X ] + Disk tests \u2502 \u2502 [ X ] + Ethernet Device tests \u2502 \u2502 [ X ] + Firmware tests \u2502 \u2502 [ X ] + Graphics tests \u2502 \u2502 [ X ] + Informational tests \u2502 \u2502 [ X ] + Input Devices tests \u2502 \u2502 [ X ] + Memory tests \u2502 \u2502 [ X ] + Miscellaneous tests \u2502 \u2502 [ X ] + Mobile broadband tests \u2502 \u2502 [ X ] + Non-device specific networking tests \u2502 \u2502 [ X ] + Optical Drive tests \u2502 \u2502 [ X ] + Power Management tests \u2502 \u2502 [ X ] + Suspend tests \u2502 \u2502 [ X ] + TPM 2 .0 ( Trusted Platform Module ) \u2502 \u2502 [ X ] + Touchpad tests \u2502 . . . etc. \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 Press T to start the testing procedure. You might be asked about the hardware in your machine. Just tick it truthfully and press T again. \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502Does this machine have this piece of hardware? \u2502 \u2502 An Ethernet Port ( X ) YES ( ) NO \u2502 \u2502 Camera/Capture Device ( X ) YES ( ) NO \u2502 \u2502 USB Storage Device Connected ( X ) YES ( ) NO \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 When testing ends, a menu with test results should appear. Press R to rerun test cases, or F to finish. After all, paths to the test results should be displayed in the terminal. By default, they are placed in /home/user/.local/share/checkbox-ng .","title":"Run automatic validation"},{"location":"common-coreboot-docs/checkbox/#additional-options","text":"run lets you run a particular test plan or a set of jobs, but it does save any results. Example of running one test plan: sudo checkbox-cli run com.canonical.certification::smoke launcher command lets you customize the checkbox experience. To use it, you need to create config_file.ini and start running the checkbox like below: checkbox-cli launcher config_file.ini For more details about these (and others) commands visit checkbox-cli .","title":"Additional options"},{"location":"common-coreboot-docs/checkbox/#troubleshooting","text":"When somehow the checkbox stop working you can resume the previous session. To do this, open the terminal and run the following command: sudo checkbox-cli If at least one incomplete session is present on the machine, you should see: Do you want to resume session 'session_title-2022-07-06T13.09.22' ? r = > resume this session n = > next session c = > create new session d = > delete old sessions [ rncd ] : Type in r to resume the stopped session. You can also create a new session or delete an old session by typing the appropriate letter. What do you want to do with that job? s = > skip that job p = > mark it as passed and continue f = > mark it as failed and continue r = > run it [ spfr ] : Decide what you want to do with the last test and type the appropriate letter. After this, your checkbox session will be resumed.","title":"Troubleshooting"},{"location":"common-coreboot-docs/dumping_logs/","text":"Dumping logs When facing an issue on a unique hardware configuration on the end user side it may prove useful to submit system logs to Dasharo team for diagnosis and possibly problem solution. This section describes how to dump various logs from a running system. System information One may use Dasharo Tools Suite HCL report or fwdump-docker image to gather all the hardware configuration information from a running system. The usage of the tools should result in an archive containing various logs from the running system. Submit them via email to contact@dasharo.com or use Dasharo pastebin . cbmem utility When already migrated to Dasharo, it is possible to retrieve firmware logs from coreboot on a running system. A utility called cbmem can be used for that purpose. By obtaining the logs Dasharo team will be able to locate any issues with the firmware. This method requires Secure Boot to be disabled. Options to get cbmem utility: Download precompiled utility from 3mdeb cloud Use Dasharo Tools Suite v1.1.0 or newer which has cbmem utility built in. Compile cbmem utility . See procedure below. Short instruction how to compile and use cbmem on Ubuntu 22.04 live CD: Launch Ubuntu 22.04 live CD and choose to Try Ubuntu . Right click on the desktop and choose Open in Terminal . Install required packages: sudo apt-get install -y build-essential libpci-dev Navigate to tmpfs: cd /tmp . Download and extract coreboot source: wget https://coreboot.org/releases/coreboot-4.17.tar.xz tar xvf coreboot-4.17.tar.xz Compile cbmem utility: cd coreboot-4.17/util/cbmem make Obtaining Dasharo firmware log One can obtain the firmware logs with: ```bash sudo ./cbmem -1 > cbmem.log ``` Execute the above command on the target platform. Newer Dasharo distributions will also contain complete logs from UEFI Payload to help debug issues outside of coreboot. NOTE: UEFI Payload logs are not available on platforms with serial console redirection enabled in the firmware.","title":"Dumping logs"},{"location":"common-coreboot-docs/dumping_logs/#dumping-logs","text":"When facing an issue on a unique hardware configuration on the end user side it may prove useful to submit system logs to Dasharo team for diagnosis and possibly problem solution. This section describes how to dump various logs from a running system.","title":"Dumping logs"},{"location":"common-coreboot-docs/dumping_logs/#system-information","text":"One may use Dasharo Tools Suite HCL report or fwdump-docker image to gather all the hardware configuration information from a running system. The usage of the tools should result in an archive containing various logs from the running system. Submit them via email to contact@dasharo.com or use Dasharo pastebin .","title":"System information"},{"location":"common-coreboot-docs/dumping_logs/#cbmem-utility","text":"When already migrated to Dasharo, it is possible to retrieve firmware logs from coreboot on a running system. A utility called cbmem can be used for that purpose. By obtaining the logs Dasharo team will be able to locate any issues with the firmware. This method requires Secure Boot to be disabled. Options to get cbmem utility: Download precompiled utility from 3mdeb cloud Use Dasharo Tools Suite v1.1.0 or newer which has cbmem utility built in. Compile cbmem utility . See procedure below. Short instruction how to compile and use cbmem on Ubuntu 22.04 live CD: Launch Ubuntu 22.04 live CD and choose to Try Ubuntu . Right click on the desktop and choose Open in Terminal . Install required packages: sudo apt-get install -y build-essential libpci-dev Navigate to tmpfs: cd /tmp . Download and extract coreboot source: wget https://coreboot.org/releases/coreboot-4.17.tar.xz tar xvf coreboot-4.17.tar.xz Compile cbmem utility: cd coreboot-4.17/util/cbmem make","title":"cbmem utility"},{"location":"common-coreboot-docs/dumping_logs/#obtaining-dasharo-firmware-log","text":"One can obtain the firmware logs with: ```bash sudo ./cbmem -1 > cbmem.log ``` Execute the above command on the target platform. Newer Dasharo distributions will also contain complete logs from UEFI Payload to help debug issues outside of coreboot. NOTE: UEFI Payload logs are not available on platforms with serial console redirection enabled in the firmware.","title":"Obtaining Dasharo firmware log"},{"location":"dasharo-menu-docs/boot-maintenance-mgr/","text":"Boot Maintenance Manager Boot Maintenance Manager is mainly used to manage boot options, boot timeout, next boot variable, console inputs and outputs. It also provides a way to add driver options, but it is rather rarely used. Boot Next Value is used to set which boot options should be booted after a reboot. This setting is not permanent and works only after the first reboot, then it defaults back to None . Auto Boot Time-out is used to specify the timeout in seconds how long the firmware should wait for hotkey to enter setup menu or Boot Manager Menu before booting the first priority according to boot order or Boot Next Value (if it was set before reset) Boot Options This submenu allows to manipulate the boot order and boot options in general: Add Boot Option When selecting to add a boot option, file explorer appears where one has to navigate to the desired disk, partition and file which shall be executed if the boot options is selected: NOTE: only EFI files may be used. If the file is already selected a window to set the boot option name appears: To set the name press ENTER to activate the prompt: Confirm the name (it must not be too short) with ENTER and then Commit Changes and Exit . From now on the boot options should appear on the boot options list in the Boot Manager Menu and One Time Boot menu. Delete Boot Option To delete boot options, enter Delete Boot Option submenu. Select the checkboxes which options should be removed and then Commit Changes and Exit . From now on the deleted boot options should not appear on the boot options list in the Boot Manager Menu and One Time Boot menu. Note that some boot options are auto-registered during boot, e.g. UEFI Shell, iPXE, or disks that contains /EFI/BOOT/BOOTX64.EFI file on their FAT32 partitions. To disable iPXE auto-registering, disable Network Boot in Dasharo System Features menu. Change Boot Order Boot Maintenance Manage also allows to change the boot order of the devices. PLease note that the boot order may be changed only for currently detected and registered boot options and devices. Dasharo does not yet provide fixed boot order options per interface, e.g. prioritize USB over NVMe or SATA, etc. To move the boot options priority, press ENTER when selecting the boot options list. A popup windows with the entries should show up. Use + and - on the hovered item to move it up and down, use arrows to change hovered item. If you are satisfied with the order you set, press ENTER to confirm it and then Commit Changes and Exit . The boot order should be immediately applied, it can be checked on the boot options list in the Boot Manager Menu and One Time Boot menu. Driver Options This menu is used to load additional drivers. It is used very rarely so it is not described in detail. Console Options This menu is used to manipulate EFI console variable. Typically there is no need to use it. Here one may enable/disable input and output devices. Please note that most output and input devices devices are registered automatically during boot. Changes made here will only last till next reboot. To permanently disable certain inputs one may use different setup options: USB keyboard input may be disabled by disabling whole USB stack PS/2 keyboard input may be disabled by disabling PS/2 controller WARNING : Dasharo does not yet implement any check if at least one keyboard is plugged and working. If you disable both USB stack and PS/2 controller you will not be able to control firmware boot flow (so unable to enter setup or choose boot option via Boot Manager or even enable back the keyboard inputs). Boot From File This submenu allows one to boot an arbitrary EFI file from one of the disk partitions. Selecting the entry will open the File Explorer (similarly like when adding a boot option) and one has to navigate to the file desired to be executed and press ENTER.","title":"Boot Maintenance Manager"},{"location":"dasharo-menu-docs/boot-maintenance-mgr/#boot-maintenance-manager","text":"Boot Maintenance Manager is mainly used to manage boot options, boot timeout, next boot variable, console inputs and outputs. It also provides a way to add driver options, but it is rather rarely used. Boot Next Value is used to set which boot options should be booted after a reboot. This setting is not permanent and works only after the first reboot, then it defaults back to None . Auto Boot Time-out is used to specify the timeout in seconds how long the firmware should wait for hotkey to enter setup menu or Boot Manager Menu before booting the first priority according to boot order or Boot Next Value (if it was set before reset)","title":"Boot Maintenance Manager"},{"location":"dasharo-menu-docs/boot-maintenance-mgr/#boot-options","text":"This submenu allows to manipulate the boot order and boot options in general:","title":"Boot Options"},{"location":"dasharo-menu-docs/boot-maintenance-mgr/#add-boot-option","text":"When selecting to add a boot option, file explorer appears where one has to navigate to the desired disk, partition and file which shall be executed if the boot options is selected: NOTE: only EFI files may be used. If the file is already selected a window to set the boot option name appears: To set the name press ENTER to activate the prompt: Confirm the name (it must not be too short) with ENTER and then Commit Changes and Exit . From now on the boot options should appear on the boot options list in the Boot Manager Menu and One Time Boot menu.","title":"Add Boot Option"},{"location":"dasharo-menu-docs/boot-maintenance-mgr/#delete-boot-option","text":"To delete boot options, enter Delete Boot Option submenu. Select the checkboxes which options should be removed and then Commit Changes and Exit . From now on the deleted boot options should not appear on the boot options list in the Boot Manager Menu and One Time Boot menu. Note that some boot options are auto-registered during boot, e.g. UEFI Shell, iPXE, or disks that contains /EFI/BOOT/BOOTX64.EFI file on their FAT32 partitions. To disable iPXE auto-registering, disable Network Boot in Dasharo System Features menu.","title":"Delete Boot Option"},{"location":"dasharo-menu-docs/boot-maintenance-mgr/#change-boot-order","text":"Boot Maintenance Manage also allows to change the boot order of the devices. PLease note that the boot order may be changed only for currently detected and registered boot options and devices. Dasharo does not yet provide fixed boot order options per interface, e.g. prioritize USB over NVMe or SATA, etc. To move the boot options priority, press ENTER when selecting the boot options list. A popup windows with the entries should show up. Use + and - on the hovered item to move it up and down, use arrows to change hovered item. If you are satisfied with the order you set, press ENTER to confirm it and then Commit Changes and Exit . The boot order should be immediately applied, it can be checked on the boot options list in the Boot Manager Menu and One Time Boot menu.","title":"Change Boot Order"},{"location":"dasharo-menu-docs/boot-maintenance-mgr/#driver-options","text":"This menu is used to load additional drivers. It is used very rarely so it is not described in detail.","title":"Driver Options"},{"location":"dasharo-menu-docs/boot-maintenance-mgr/#console-options","text":"This menu is used to manipulate EFI console variable. Typically there is no need to use it. Here one may enable/disable input and output devices. Please note that most output and input devices devices are registered automatically during boot. Changes made here will only last till next reboot. To permanently disable certain inputs one may use different setup options: USB keyboard input may be disabled by disabling whole USB stack PS/2 keyboard input may be disabled by disabling PS/2 controller WARNING : Dasharo does not yet implement any check if at least one keyboard is plugged and working. If you disable both USB stack and PS/2 controller you will not be able to control firmware boot flow (so unable to enter setup or choose boot option via Boot Manager or even enable back the keyboard inputs).","title":"Console Options"},{"location":"dasharo-menu-docs/boot-maintenance-mgr/#boot-from-file","text":"This submenu allows one to boot an arbitrary EFI file from one of the disk partitions. Selecting the entry will open the File Explorer (similarly like when adding a boot option) and one has to navigate to the file desired to be executed and press ENTER.","title":"Boot From File"},{"location":"dasharo-menu-docs/dasharo-system-features/","text":"Dasharo System Features When entering the Dasharo System Features menu, one may see the following submenus to appear: Dasharo Security Options This menu offers security-sensitive options like: BIOS boot medium lock - enables/disables flash protection on the vboot recovery firmware partition. Disable it if you need access to whole flash with flashrom. Enable SMM BIOS write protection - when enabled, allows only SMM code (the privileged code installed by the firmware in the system memory) to write to BIOS flash. Recommended to be enabled if Firmware setup password is set. Disable the protection if you need access to flash with flashrom. Boot menu enabled - enables/disables ability to enter boot manager menu. Enabled by default. Can be disabled, to prevent from booting from non-default boot media. Early boot DMA Protection - Enables IOMMU DMA protection early during POST. DMA protection is a feature that utilizes the IOMMU early in the boot process to prevent rogue DMA-capable devices such as PCIe add-in cards, USB4/thunderbolt devices from access to memory. This prevents a class of DMA attacks that allow for exfiltration of secrets and installation of malware early in the boot process. Keep IOMMU enabled when transfer control to OS - (only available when Early boot DMA Protection is selected) Keeps IOMMU DMA protection enabled during ExitBootServices when control is passed to the OS. If unsure or see any problems with DMA/IOMMU during OS boot, keep it disabled. NOTE: Windows may not boot if the option is enabled. Networking Options Enable network boot - the option controls if the network boot should be enabled or not. This option is disabled by default on most Dasharo supported devices. When disabled, it prevents loading network controller drivers and unregisters iPXE as boot option (iPXE disappears from Boot Manager and One Time Boot menus) USB Configuration Enable USB stack - controls loading of UEFI USB drivers, when enabled all USB drivers are loaded making USB keyboards and mass storage drives functional in the firmware (to browse setup, press hotkeys or move around bootloaders like GRUB). If disabled no USB device will work before OS is loaded (firmware will not communicate with USB devices). Enable USB Mass Storage driver - this option is blocked if USB stack is disabled. If disabled, UEFI USB Mass Storage driver is not loaded and one cannot boot from USB drives. Essentially this option controls the USB boot capability. It does not affect other devices, like USB keyboards. Intel Management Engine Options This submenu is used to access Intel Management Engine related options. Currently the only option available is Intel ME mode which allows to enable or disable Management Engine: On the right side of the window there is a help section describing the option meaning. If the window is too small, the help section may be divided and not fully shown on the screen. To scroll the help section use D or d keys to scroll down and U or u to scroll up. Intel ME can be disabled in two ways: Disabled (Soft) - when set, causes the Dasharo firmware to send ME_DISABLE command via MEI/HECI. MEI/HECI interface is being hidden from OS when ME is disabled. Disabled (HAP) - when set, causes the Dasharo firmware to set HAP bit in the flash descriptor. MEI/HECI interface is being hidden from OS when ME is disabled. HAP method is much more efficient as it halts the ME firmware execution even earlier than Soft Disable described above When the mode is set to Enabled , Dasharo enables the Intel Management engine by either sending ME_ENABLE command via MEI/HECI or clearing the HAP bit in flash descriptor, depending on the previously active ME mode. MEI/HECI device should be functional in OS when ME is enabled. Any change in the Dasharo firmware setup requires saving the changes and a platform reset (unless specified otherwise). For more information about neutering and disabling ME see also me_cleaner . NOTE: me_cleaner is not supported on all platforms! If a platform supports me_cleaner (i.e. ME version is lower or equal 11.x) it is recommended to set HAP bit and clean the ME region with me_cleaner script permanently. Chipset Configuration The submenu contains general chipset options. Currently available options: Enable PS/2 controller - enables/disables PS/2 controller on the platform. When disabled PS/2 keyboards and mice will stop working in firmware and OS. PS/2 controller will not be functional in OS. This option is not available on laptops where PS/2 is used for the integrated keyboard and possibly touchpad. Enable watchdog - controls the chipset watchdog functionality. If enabled, watchdog will be counting with the timeout specified below. The firmware automatically kicks the watchdog periodically so even without OS support, the platform will not reset itself when watchdog expires. Watchdog timeout value - watchdog timeout in seconds. Allowed range is 60-1024 seconds. The Option is only visible if watchdog is set to enabled. Power Management Options The submenu contains general power management options. Currently available options: Fan profile - Sets of the fan operation modes (defaults to Silent ): Silent - the fan will operate at lower speeds to reduce noise, Performance - the fan will operate at higher speeds, to allow for increased performance. Platform sleep type - sets the active sleep mode to be available for OS Suspend to Idle (S0ix) (default) - also known as modern standby. Select this option if using Windows. S3 sleep mode may not be working well with Windows for machines newer than 11th generation Intel Core processors. S0ix will not work properly if ME is disabled. Suspend to RAM (S3) - standard sleep mode that suspends the machine state to RAM, supported on most operating systems (except Windows on 11th generation Intel Core processors or newer).","title":"Dasharo System Features"},{"location":"dasharo-menu-docs/dasharo-system-features/#dasharo-system-features","text":"When entering the Dasharo System Features menu, one may see the following submenus to appear:","title":"Dasharo System Features"},{"location":"dasharo-menu-docs/dasharo-system-features/#dasharo-security-options","text":"This menu offers security-sensitive options like: BIOS boot medium lock - enables/disables flash protection on the vboot recovery firmware partition. Disable it if you need access to whole flash with flashrom. Enable SMM BIOS write protection - when enabled, allows only SMM code (the privileged code installed by the firmware in the system memory) to write to BIOS flash. Recommended to be enabled if Firmware setup password is set. Disable the protection if you need access to flash with flashrom. Boot menu enabled - enables/disables ability to enter boot manager menu. Enabled by default. Can be disabled, to prevent from booting from non-default boot media. Early boot DMA Protection - Enables IOMMU DMA protection early during POST. DMA protection is a feature that utilizes the IOMMU early in the boot process to prevent rogue DMA-capable devices such as PCIe add-in cards, USB4/thunderbolt devices from access to memory. This prevents a class of DMA attacks that allow for exfiltration of secrets and installation of malware early in the boot process. Keep IOMMU enabled when transfer control to OS - (only available when Early boot DMA Protection is selected) Keeps IOMMU DMA protection enabled during ExitBootServices when control is passed to the OS. If unsure or see any problems with DMA/IOMMU during OS boot, keep it disabled. NOTE: Windows may not boot if the option is enabled.","title":"Dasharo Security Options"},{"location":"dasharo-menu-docs/dasharo-system-features/#networking-options","text":"Enable network boot - the option controls if the network boot should be enabled or not. This option is disabled by default on most Dasharo supported devices. When disabled, it prevents loading network controller drivers and unregisters iPXE as boot option (iPXE disappears from Boot Manager and One Time Boot menus)","title":"Networking Options"},{"location":"dasharo-menu-docs/dasharo-system-features/#usb-configuration","text":"Enable USB stack - controls loading of UEFI USB drivers, when enabled all USB drivers are loaded making USB keyboards and mass storage drives functional in the firmware (to browse setup, press hotkeys or move around bootloaders like GRUB). If disabled no USB device will work before OS is loaded (firmware will not communicate with USB devices). Enable USB Mass Storage driver - this option is blocked if USB stack is disabled. If disabled, UEFI USB Mass Storage driver is not loaded and one cannot boot from USB drives. Essentially this option controls the USB boot capability. It does not affect other devices, like USB keyboards.","title":"USB Configuration"},{"location":"dasharo-menu-docs/dasharo-system-features/#intel-management-engine-options","text":"This submenu is used to access Intel Management Engine related options. Currently the only option available is Intel ME mode which allows to enable or disable Management Engine: On the right side of the window there is a help section describing the option meaning. If the window is too small, the help section may be divided and not fully shown on the screen. To scroll the help section use D or d keys to scroll down and U or u to scroll up. Intel ME can be disabled in two ways: Disabled (Soft) - when set, causes the Dasharo firmware to send ME_DISABLE command via MEI/HECI. MEI/HECI interface is being hidden from OS when ME is disabled. Disabled (HAP) - when set, causes the Dasharo firmware to set HAP bit in the flash descriptor. MEI/HECI interface is being hidden from OS when ME is disabled. HAP method is much more efficient as it halts the ME firmware execution even earlier than Soft Disable described above When the mode is set to Enabled , Dasharo enables the Intel Management engine by either sending ME_ENABLE command via MEI/HECI or clearing the HAP bit in flash descriptor, depending on the previously active ME mode. MEI/HECI device should be functional in OS when ME is enabled. Any change in the Dasharo firmware setup requires saving the changes and a platform reset (unless specified otherwise). For more information about neutering and disabling ME see also me_cleaner . NOTE: me_cleaner is not supported on all platforms! If a platform supports me_cleaner (i.e. ME version is lower or equal 11.x) it is recommended to set HAP bit and clean the ME region with me_cleaner script permanently.","title":"Intel Management Engine Options"},{"location":"dasharo-menu-docs/dasharo-system-features/#chipset-configuration","text":"The submenu contains general chipset options. Currently available options: Enable PS/2 controller - enables/disables PS/2 controller on the platform. When disabled PS/2 keyboards and mice will stop working in firmware and OS. PS/2 controller will not be functional in OS. This option is not available on laptops where PS/2 is used for the integrated keyboard and possibly touchpad. Enable watchdog - controls the chipset watchdog functionality. If enabled, watchdog will be counting with the timeout specified below. The firmware automatically kicks the watchdog periodically so even without OS support, the platform will not reset itself when watchdog expires. Watchdog timeout value - watchdog timeout in seconds. Allowed range is 60-1024 seconds. The Option is only visible if watchdog is set to enabled.","title":"Chipset Configuration"},{"location":"dasharo-menu-docs/dasharo-system-features/#power-management-options","text":"The submenu contains general power management options. Currently available options: Fan profile - Sets of the fan operation modes (defaults to Silent ): Silent - the fan will operate at lower speeds to reduce noise, Performance - the fan will operate at higher speeds, to allow for increased performance. Platform sleep type - sets the active sleep mode to be available for OS Suspend to Idle (S0ix) (default) - also known as modern standby. Select this option if using Windows. S3 sleep mode may not be working well with Windows for machines newer than 11th generation Intel Core processors. S0ix will not work properly if ME is disabled. Suspend to RAM (S3) - standard sleep mode that suspends the machine state to RAM, supported on most operating systems (except Windows on 11th generation Intel Core processors or newer).","title":"Power Management Options"},{"location":"dasharo-menu-docs/device-manager/","text":"Device Manager The Device Manager is a EDKII standard submenu which collects various device setups like TPM, UEFI Secure Boot, TCG OPAL Drive Password, SATA Password and others. TCG Drive Management This menu allows one to set up TCG OPAL disk password and manage other TCG OPAL feature settings. The main view of the submenu looks as follows: The submenu will list all the TCG OPAL capable disks. Selecting one of them with ENTER will cause entering the disk specific submenu: Here one can enable the TCG OPAL security feature or restore factory default with the PSID (Physical Security ID). Physical Security ID is a drive specific key which is used to revert to factory default mode. The PSID can be typically found on the sticker present on the disk. Besides the feature enablement and factory restore options there is an action interactive entry on the main TCG Drive Management page: It is used to perform TCG OPAL specific operations when the security feature is enabled. Enable/disable BlockSID will set/unset \"freeze locking\" of the drive features as requested by OS. One may also enable or disable physical presence (firmware popup confirmation of actions requested by OS) when switching BlockSID. To set up the password enter the desired disk submenu and enable the feature by selecting the checkbox. Note that not all disks support the security feature of TCG OPAL. Reset is required to apply changes. After reset you will be prompted to set admin password. When the admin password is set, more options become available for the disk: All below options require reset to apply changes. Update Drive Admin Password - to update current admin password. Prompt window appears after reset to enter current and new password Set Drive User Password - is used to set an optional user password. Secure Erase User Data - performs secure erase of the data after reset. Admin Revert to factory default and Disable - disables the admin password (prompt will no longer appear during boot o unlock the drive) and the security feature after reset. Optionally one may select to keep or discard user data. PSID Revert to factory default and Disable - in case admin password has been forgotten PSID can be used to disable the security feature and admin password after reset. This will also erase user data. Disable User - disables the user functionality (and so the user password) after reset. For more details about TCG OPAL please refer to TCG Storage Specifications and Key Management . Driver Health Manager This submenu is informational only and displays the status of drivers that install UEFI driver health protocol. Typically it is installed by 3rdparty applications such as OptionROMs on graphics devices or network controllers for example. Secure Boot Configuration This submenu allows configuring UEFI Secure Boot functionality. Enabling Secure Boot By default, Dasharo firmware doesn't have UEFI Secure Boot enabled. Additionally, keys for UEFI Secure Boot are not enrolled, as we do not make assumptions about which CA the user trusts. To enable Secure Boot for booting common OSes signed with Microsoft keys (Windows and Linux distros using the shim bootloader), select the Reset Secure Boot keys option. The Attempt Secure Boot option will now be available and selected, and Secure Boot will be used on next boot. Custom mode and key management The following keys are enrolled by default when resetting Secure Boot keys: Microsoft KEK certificate , Microsoft Signature Database (db) consisting of: Microsoft Windows Production PCA 2011 to allow Windows OS Loader to load, Microsoft Corporation UEFI CA 2011 to load OEM-approved UEFI drivers and applications (e.g. shim ), Microsoft Forbidden Signature Database (dbx) published as UEFI Revocation List File on uefi.org , Dasharo Platform Key (PK) certificate maintained by the Dasharo team. When custom application and UEFI driver signing is desired, this key may be replaced with the user's own PK. To learn more, please visit Windows Secure Boot Key Creation and Management Guidance . To use your own keys, choose Custom Mode in Secure Boot Mode : An additional entry appears below for configuring keys and certificates: Here one may delete and enroll particular keys, certificates and database signatures. TCG2 Configuration TCG2 Configuration submenu is responsible for displaying TPM 2.0 information and managing the module. The basic information displayed are the TPM device family, interface, but also information about supported hashing algorithms. It is also possible to perform various TPM2 physical presence operations ( TPM2 Operation ) and enable or disable PCR banks. The supported TPM2 operations are: Disabling or enabling Owner and Endorsement hierarchies TPM ClearControl(NO) + Clear - performs TPM clear PCR Allocation - used to enable additional PCR banks LogAllDigests - on next reboot (and only on next reboot), add digests for all supported hashing algorithms to log file ChangeEPS - clears the TPM and changes its identity For more details about the TPM operations see TCG Physical Presence Interface Specification HDD Security Configuration HDD Security Configuration allows one to set SATA disk password. Note that all SATA disks will be displayed, even these that don't support the feature. To check if the disk supports password feature, enter the specific disk submenu to see if Security Supported displays Yes : If one scrolls down a bit, more information is displayed about current state of the disk password feature: At the bottom of the page there are two checkboxes: Request to set User Password - this is the option to set the password on the disk. Requires reset, after which the prompt windows will appear to set the password. From now on the prompt will appear on each boot. Request to set Master Password - this options changes the disk master password. Master password is used to recover from forgotten User Password. Typically Master Password is provisioned during disk manufacturing and it will not be possible to change it without knowing what the master password is. To disable the User Password simply request to set the User Password again via the menu. After reset you will be asked to unlock the driver with current password and then type new password. To disable the password simply leave the field empty and confirm it twice by pressing ENTER . After that the password prompt will not appear again. Network Device List This submenu is displayed when Network Boot is enabled and the network controller driver installs the necessary UEFI protocols. The menu lists the network devices with the UEFI protocol installed. One may check out the network controller information, like MAC address, driver used and link status. Example view with MAC address blurred:","title":"Device Manager"},{"location":"dasharo-menu-docs/device-manager/#device-manager","text":"The Device Manager is a EDKII standard submenu which collects various device setups like TPM, UEFI Secure Boot, TCG OPAL Drive Password, SATA Password and others.","title":"Device Manager"},{"location":"dasharo-menu-docs/device-manager/#tcg-drive-management","text":"This menu allows one to set up TCG OPAL disk password and manage other TCG OPAL feature settings. The main view of the submenu looks as follows: The submenu will list all the TCG OPAL capable disks. Selecting one of them with ENTER will cause entering the disk specific submenu: Here one can enable the TCG OPAL security feature or restore factory default with the PSID (Physical Security ID). Physical Security ID is a drive specific key which is used to revert to factory default mode. The PSID can be typically found on the sticker present on the disk. Besides the feature enablement and factory restore options there is an action interactive entry on the main TCG Drive Management page: It is used to perform TCG OPAL specific operations when the security feature is enabled. Enable/disable BlockSID will set/unset \"freeze locking\" of the drive features as requested by OS. One may also enable or disable physical presence (firmware popup confirmation of actions requested by OS) when switching BlockSID. To set up the password enter the desired disk submenu and enable the feature by selecting the checkbox. Note that not all disks support the security feature of TCG OPAL. Reset is required to apply changes. After reset you will be prompted to set admin password. When the admin password is set, more options become available for the disk: All below options require reset to apply changes. Update Drive Admin Password - to update current admin password. Prompt window appears after reset to enter current and new password Set Drive User Password - is used to set an optional user password. Secure Erase User Data - performs secure erase of the data after reset. Admin Revert to factory default and Disable - disables the admin password (prompt will no longer appear during boot o unlock the drive) and the security feature after reset. Optionally one may select to keep or discard user data. PSID Revert to factory default and Disable - in case admin password has been forgotten PSID can be used to disable the security feature and admin password after reset. This will also erase user data. Disable User - disables the user functionality (and so the user password) after reset. For more details about TCG OPAL please refer to TCG Storage Specifications and Key Management .","title":"TCG Drive Management"},{"location":"dasharo-menu-docs/device-manager/#driver-health-manager","text":"This submenu is informational only and displays the status of drivers that install UEFI driver health protocol. Typically it is installed by 3rdparty applications such as OptionROMs on graphics devices or network controllers for example.","title":"Driver Health Manager"},{"location":"dasharo-menu-docs/device-manager/#secure-boot-configuration","text":"This submenu allows configuring UEFI Secure Boot functionality.","title":"Secure Boot Configuration"},{"location":"dasharo-menu-docs/device-manager/#tcg2-configuration","text":"TCG2 Configuration submenu is responsible for displaying TPM 2.0 information and managing the module. The basic information displayed are the TPM device family, interface, but also information about supported hashing algorithms. It is also possible to perform various TPM2 physical presence operations ( TPM2 Operation ) and enable or disable PCR banks. The supported TPM2 operations are: Disabling or enabling Owner and Endorsement hierarchies TPM ClearControl(NO) + Clear - performs TPM clear PCR Allocation - used to enable additional PCR banks LogAllDigests - on next reboot (and only on next reboot), add digests for all supported hashing algorithms to log file ChangeEPS - clears the TPM and changes its identity For more details about the TPM operations see TCG Physical Presence Interface Specification","title":"TCG2 Configuration"},{"location":"dasharo-menu-docs/device-manager/#hdd-security-configuration","text":"HDD Security Configuration allows one to set SATA disk password. Note that all SATA disks will be displayed, even these that don't support the feature. To check if the disk supports password feature, enter the specific disk submenu to see if Security Supported displays Yes : If one scrolls down a bit, more information is displayed about current state of the disk password feature: At the bottom of the page there are two checkboxes: Request to set User Password - this is the option to set the password on the disk. Requires reset, after which the prompt windows will appear to set the password. From now on the prompt will appear on each boot. Request to set Master Password - this options changes the disk master password. Master password is used to recover from forgotten User Password. Typically Master Password is provisioned during disk manufacturing and it will not be possible to change it without knowing what the master password is. To disable the User Password simply request to set the User Password again via the menu. After reset you will be asked to unlock the driver with current password and then type new password. To disable the password simply leave the field empty and confirm it twice by pressing ENTER . After that the password prompt will not appear again.","title":"HDD Security Configuration"},{"location":"dasharo-menu-docs/device-manager/#network-device-list","text":"This submenu is displayed when Network Boot is enabled and the network controller driver installs the necessary UEFI protocols. The menu lists the network devices with the UEFI protocol installed. One may check out the network controller information, like MAC address, driver used and link status. Example view with MAC address blurred:","title":"Network Device List"},{"location":"dasharo-menu-docs/overview/","text":"Dasharo menu overview This section describes the overview of the Dasharo firmware setup menu. In the subsections you will get to know: What options are available? How to use submenus and options? How the options and submenus work? Here you may watch a Dasharo menu walkthrough with commentary presenting Dasharo features. Dasharo menu guides The main menu is entered by selecting the Setup application in the Boot Manager Menu or by pressing the Setup hotkey while booting. The hotkey is shown in the top-left corner of the screen when the boot logo is displayed, for example DEL : DEL to enter Setup F11 to enter Boot Manager Menu ENTER to boot directly On certain devices like Novacustom laptops one will also be greeted with a firmware version printed on the screen (main firmware version and EC firmware version if applicable), for example: Firmware version: Dasharo (coreboot+UEFI) v1.6.0 EC firmware version: 2023-03-20_c398446 F2 to enter Setup F7 to enter Boot Manager Menu ENTER to boot directly If any error happens (firmware version is unknown, could not be read or any other error) you will get an red error string: OR In such case please follow the EC firmware update instructions for a specific board variant. Setup Main Page User Password Management Device Manager Dasharo System Features One Time Boot Boot Maintenance Manager Boot Manager Menu - entered with a different key than used for setup application. Lists all bootable options and allows one to override the boot path. Main Page The page is the main view of the firmware setup application. It contains the board model ( MS-7D25 ), installed CPU and firmware version in the top-left corner. In the top-right corner the CPU frequency and system RAM amount are shown. From the main page one may access all menus and submenus available in the firmware setup. Besides the menus there is also an option to: Change the language (currently only English is supported) Continue - execute the top first boot order priority Reset - resets the platform. The currently available menus/submenus are as follows: User Password Management - allows to set firmware setup password Device Manager - allows configuring various devices and features like: UEFI Secure Boot, TPM device, SATA and TCG OPAL password, etc. It may also contain informational menus like Driver Health Manager, Network Device List and others. Dasharo System Features - contains submenus for features specific to Dasharo products and Dasharo supported platforms One Time Boot - allows to choose which boot entry to execute. It simply lists all available boot options and allows to select one the same way as Boot Manager Menu Boot Maintenance Manager - allows to manipulate various UEFI standard variables responsible for console and boot options. One may choose which devices should be used for input and output, choose to boot an arbitrary file or modify the boot options and boot order. NOTE: not all submenus may be available on your platform. Contact Dasharo Team for more information and possible feature extension of your platform. User Password Management User Password Management menu allows one to set firmware setup admin password: The password must be a strong one. The requirements are described on the help section on the right side of the menu page. If the password is too weak it will not be accepted. Also the new password must be different from the last 5 passwords that were used before. The page shows the current status of Admin Password if it is provisioned or not. To disable the password, enter the User Password Management menu again and request to set new password. You will be asked to enter current password. When a window to provide new password pops up, leave the field empty and confirm it twice with ENTER . The password installation status on the menu page should change to Not Installed . One Time Boot When setup application is entered, one of the menus is called One Time Boot . As the name suggests it allows to override the boot just one time (not permanently). The usage principles are the same as for Boot Manager Menu . Example view of One Time Boot submenu: On the right side of the menu window, there is a DevicePath which is a UEFI-compliant path to the device or file being executed. Depending on the file/device type, these paths may be different: DevicePaths are defined in UEFI Specification . If you are interested in decoding those, read through the specification carefully. Boot Manager Menu Boot Manager Menu is an application that lists all bootable options and allows one to override the boot path. Boot Manager Menu is entered with a different key than setup application. It may be customized on your platform. The right key to use is always printed on the screen in the top-left corner, for example F11 : DEL to enter Setup F11 to enter Boot Manager Menu ENTER to boot directly After pressing the right hotkey for Boot Manager Menu, a window should pop up: On the bottom of the window there are instructions for moving and selecting entries.","title":"Overview"},{"location":"dasharo-menu-docs/overview/#dasharo-menu-overview","text":"This section describes the overview of the Dasharo firmware setup menu. In the subsections you will get to know: What options are available? How to use submenus and options? How the options and submenus work? Here you may watch a Dasharo menu walkthrough with commentary presenting Dasharo features.","title":"Dasharo menu overview"},{"location":"dasharo-menu-docs/overview/#dasharo-menu-guides","text":"The main menu is entered by selecting the Setup application in the Boot Manager Menu or by pressing the Setup hotkey while booting. The hotkey is shown in the top-left corner of the screen when the boot logo is displayed, for example DEL : DEL to enter Setup F11 to enter Boot Manager Menu ENTER to boot directly On certain devices like Novacustom laptops one will also be greeted with a firmware version printed on the screen (main firmware version and EC firmware version if applicable), for example: Firmware version: Dasharo (coreboot+UEFI) v1.6.0 EC firmware version: 2023-03-20_c398446 F2 to enter Setup F7 to enter Boot Manager Menu ENTER to boot directly If any error happens (firmware version is unknown, could not be read or any other error) you will get an red error string: OR In such case please follow the EC firmware update instructions for a specific board variant. Setup Main Page User Password Management Device Manager Dasharo System Features One Time Boot Boot Maintenance Manager Boot Manager Menu - entered with a different key than used for setup application. Lists all bootable options and allows one to override the boot path.","title":"Dasharo menu guides"},{"location":"dasharo-tools-suite/documentation/","text":"Documentation Supported hardware Dasharo Tools Suite was prepared to run on x86 platforms, but we can confirm that it boots on the following platforms: ASUS KGPE-D16, Dell OptiPlex 7010/9010, MSI PRO Z690-A DDR4 ( test report ), MSI PRO Z690-A DDR5 ( test report ), NovaCustom NV4x ( test report ), NovaCustom NS5x/7x ( test report ). Running The Dasharo Tools Suite can be started in various ways. Currently, there are two options: bootable over a network (iPXE), bootable USB stick image. The first one should always be preferred if possible, as it is the easiest one to use. Bootable over a network This section describes how to boot DTS using iPXE. Requirements Below are the requirements that must be met to run DTS over a network on the platform: Dasharo device with DTS functionality integrated, wired network connection, Secure Boot disabled , disabled BIOS lock feature (if device is already flashed with Dasharo). Launching DTS To access Dasharo Tools Suite: attach a wired network cable to the device's Ethernet port, power on the device, holding down the Boot Menu entry key, in the Boot Menu, select the iPXE Network Boot option, in the Network Boot menu, select the Dasharo Tools Suite option, the DTS menu will now appear. Bootable USB stick This section describes how to boot DTS using a USB stick. Requirements Below are the requirements that must be met to run DTS from a USB device on the platform: USB stick (at least 2GB), wired network connection, Secure Boot disabled , disabled BIOS lock feature (if device is already flashed with Dasharo), latest image from releases section. Launching DTS To access Dasharo Tools Suite: flash the downloaded image onto USB stick, you can use a cross-platform GUI installer - Etcher you can also use dd to flash from the command line gzip -cdk dts-base-image-v1.1.0.wic.gz | \\ sudo dd of = /dev/sdX bs = 16M status = progress conv = fdatasync Note: this is an example done on the v1.1.0 image. insert the USB stick into a USB in your device, boot from the USB stick, the DTS menu will now appear. Building We choose Yocto Project to prepare Dasharo Tools Suite system. DTS image can be built using publicly available sources. Thanks to publishing the build cache on cache.dasharo.com the time needed to finish the process should be significantly decreased. Prerequisites The following must be met to build DTS: Linux PC (tested on Ubuntu 20.04 LTS ), docker installed, kas-container 3.0.2 script downloaded and available in PATH , wget -O ~/bin/kas-container https://raw.githubusercontent.com/siemens/kas/3.0.2/kas-container chmod +x ~/bin/kas-container meta-dts repository cloned. mkdir yocto && cd yocto git clone https://github.com/Dasharo/meta-dts.git Build From yocto directory, run: SHELL = /bin/bash kas-container build meta-dts/kas.yml Image build takes time, so be patient, and the build's finished, you should see something similar to (tasks number may differ): Initialising tasks: 100 % | ###########################################################################################| Time: 0:00:01 Sstate summary: Wanted 2 Found 0 Missed 2 Current 931 ( 0 % match, 99 % complete ) NOTE: Executing Tasks NOTE: Tasks Summary: Attempted 2532 tasks of which 2524 didn ' t need to be rerun and all succeeded. Using the cache is enabled in kas/cache.yml file and can be disabled by removing content of that file. cat kas/cache.yml output: header: version: 11 local_conf_header: yocto-cache: | SSTATE_MIRRORS ? = \"file://.* http:// ${ LOCAL_PREMIRROR_SERVER } / ${ PROJECT_NAME } /sstate-cache/PATH\" SOURCE_MIRROR_URL ? = \"http:// ${ LOCAL_PREMIRROR_SERVER } / ${ PROJECT_NAME } /downloads\" INHERIT += \"own-mirrors\" LOCAL_PREMIRROR_SERVER ? = \"cache.dasharo.com\" PROJECT_NAME ? = \"yocto/dts\" Build image with UEFI Secure Boot support From yocto directory run: SHELL = /bin/bash kas-container build meta-dts/kas-uefi-sb.yml Image build takes time, so be patient and after build's finish you should see something similar to (the exact tasks numbers may differ): Initialising tasks: 100 % | ###########################################################################################| Time: 0:00:04 Checking sstate mirror object availability: 100 % | ###################################################################| Time: 0:00:03 Sstate summary: Wanted 892 Local 672 Mirrors 212 Missed 8 Current 1560 ( 99 % match, 99 % complete ) NOTE: Executing Tasks NOTE: Tasks Summary: Attempted 5860 tasks of which 5841 didn ' t need to be rerun and all succeeded. Image created with kas-uefi-sb.yml configuration file enable integration of UEFI Secure Boot into DTS using meta-secure-core . Building the image allow to prepare a PoC version with uses sample keys which by no mean should used in production. For user keys the script [create-user-key-store.sh](https://github.com/jiazhang0/meta-secure-core/blob/master/meta-signing-key/scripts/create-user-key-store.sh can be used but it was not tested yet. Quick start with instructions on how to use image are described in meta-efi-secure-boot . Flash Find out your device name. fdisk -l output: ( ... ) Device Boot Start End Sectors Size Id Type /dev/sdx1 * 8192 131433 123242 60 ,2M c W95 FAT32 ( LBA ) /dev/sdx2 139264 186667 47404 23 ,2M 83 Linux In this case the device name is /dev/sdx , but be aware, in the next steps, replace /dev/sdx with the right device name on your platform, or else you can damage your system! From where you ran image build type. sudo umount /dev/sdx* cd build/tmp/deploy/images/genericx86-64 Here the file dts-base-image-genericx86-64.wic.gz should be available, which is the image of DTS. To flash image, you can use the same command shown in running section . Just change the file name. Boot the platform. Disabling Secure Boot Any procedure affecting the firmware flashing should be preceded by controlling the Secure Boot status and if it is turned on, turning it off. The enabled Secure Boot will not only prevent you from operating on the firmware, but you will also not be able to launch DTS. To check the Secure Boot state: Turn off the station on which you want to test the Dasharo firmware. Turn the station on and go to the next step immediately. Hold the BIOS SETUP KEY to enter the BIOS MENU . Localize and enter the Secure Boot menu using the arrow keys and Enter. Verify that the Secure Boot Status field says Disabled - if not, deselect the Enforce Secure Boot option using the arrow keys and Enter. Change the setting of Secure Boot to Disabled and press Enter. Press the F10 key to open the dialog box. Press Enter to confirm changes and exit from the menu. After completing the steps described above, Secure Boot should be disabled. You could confirm that by repeating steps 3 - 5. Features This section describes the functionality of the Dasharo Tools Suite. These are: Dasharo zero-touch initial deployment , HCL Report , Firmware update , Local firmware update , EC transition , EC update , additional features , run commands from iPXE shell , run DTS using VentoyOS . Dasharo zero-touch initial deployment DTS can be used to flash Dasharo firmware on your hardware. To achieve this, boot DTS, choose option number 2 . After creating report with firmware dump as backup, type p to confirm the installation of Dasharo firmware. Next you will be asked two questions to confirm flashing. The first will be displayed with the detected information about the device you are using DTS on. The second will also provide the hash of Dasharo components which will then be used for flashing. You can compare them with the values listed in the supported hardware section on docs.dasharo.com. Both these questions can be accepted by typing Y . Procedure execution ends automatically on the reboot of the platform (unless it requires otherwise). After restarting the device, you can enjoy the basic version of Dasharo, which we provide for given hardware. This feature is supported on the following platforms: ASUS KGPE-D16, Dell OptiPlex 7010/9010, MSI PRO Z690-A DDR4, MSI PRO Z690-A DDR5, NovaCustom NV4x, NovaCustom NS5x/7x. HCL Report DTS allows the generation of a package with logs containing hardware information. To create one, choose option number 1 and check out the disclaimer. If you would like to send the report to our servers, please remember about connecting the ethernet cable. More information can be found in glossary . HCL Report correctness Please note DTS HCL Report assumes that your chipset is already supported by flashrom. There are also other false negative errors and unknowns, which we trying to fix to improve user experience. Always check results file to confirm the quality of your HCL report. Sample content of such file may look as follows: [OK] PCI configuration space and topology [UNKNOWN] USB devices and topology [OK] Super I/O configuration [UNKNOWN] EC configuration [ERROR] MSRs [OK] SMBIOS tables [OK] BIOS information [OK] CMOS NVRAM [UNKNOWN] Intel configuration registers [OK] GPIO configuration C header files [OK] kernel dmesg [OK] ACPI tables [UNKNOWN] Audio devices configuration [OK] CPU info [OK] I/O ports [OK] Input bus types [OK] Firmware image [OK] I2C bus [UNKNOWN] ACPI tables [OK] Touchpad information [OK] DIMMs information [ERROR] CBMEM table information [ERROR] TPM information [ERROR] AMT information [OK] ME information Results of getting data: Legend: [OK] Data get successfully [UNKNOWN] Result is unknown [ERROR] Error during getting data Please report all errors experienced while performing a dump to dasharo-issues repository. BIOS backup One of the key components of HCL Report is your BIOS backup. To prepare BIOS backup of your platform, simply run HCL Report and decide if you would like to contribute information about your hardware configuration. Please consider the following options depending on your situation: YES - If you decide to contribute, you can always get back to us and ask about BIOS backup, which we will provide after simple verification that you are the owner of the hardware. NO (default) - If you decide to not contribute, your situation depends on the boot method you used to execute DTS: Network Boot - please note that Dasharo booted over iPXE assumes no storage available, so the report, and your BIOS backup are stored in temporary memory and will not be available after reboot. Please make sure to move HCL Report to not volatile storage. This can be done using option 9) Shell , USB Boot - HCL Report and BIOS backup are saved to USB storage root directory. Firmware update DTS can be used to update Dasharo firmware. To achieve this, boot it on platform with flashed Dasharo and choose option number 5 . Next you will be asked two questions to confirm flashing. The first will be displayed with the detected information about the device you are using DTS on. The second will also provide the hash of Dasharo components which will then be used for flashing. You can compare them with the values listed in the supported hardware section on docs.dasharo.com. Both these questions can be accepted by typing Y . If you see the following warning during the process, you do not need to worry about it: Warning: Setting BIOS Control at 0xdc from 0x8b to 0x89 failed. New value is 0x8b. Procedure execution ends automatically on the reboot of the platform (unless it requires otherwise). After restarting the device, you can enjoy the updated version of Dasharo, which we provide for given hardware. Below we provide an example of updating Dasharo firmware from version v1.0.0 to v1.1.1 on MSI PRO Z690-A DDR4. DTS version v1.2.0 1 ) Dasharo HCL report - dump hardware information from this device 3 ) Restore firmware from Dasharo HCL report 4 ) Load SE keys 5 ) Update Dasharo firmware 9 ) Shell 10 ) Power off system 11 ) Reboot system Enter an option: 5 Gathering flash chip and chipset information... Flash information: vendor = \"Programmer\" name = \"Opaque flash chip\" Flash size: 32M Checking for the latest Dasharo update available... Current Dasharo version: 1 .0.0 Latest available Dasharo version: 1 .1.1 Please verify detected hardware! Board vendor: Micro-Star International Co., Ltd. System model: MS-7D25 Board model: PRO Z690-A WIFI DDR4 ( MS-7D25 ) Does it match your actual specification? ( Y | n ) y Following firmware will be used to install Dasharo Dasharo BIOS firmware: - link: https://3mdeb.com/ ( ... ) /msi_ms7d25_v1.1.1_ddr4.rom - hash: 3b438422338cf4c13abdb25823a9b2a2ad6e82fabbe0d9ed41a16a6eae1f15ff You can learn more about this release on: https://docs.dasharo.com/ Do you want to update Dasharo firmware on your hardware? ( Y | n ) y Downloading Dasharo firmware update... ########################################################################### 100.0% Checking sha256sum... /tmp/biosupdate.rom: OK Updating Dasharo firmware... This will take around 3 minutes. Please be patient and do not reset your computer, or touch keyboard! Successfully updated Dasharo firmware Syncing disks... Done. The computer will reboot automatically in 5 seconds Rebooting in 5s: 5 ... 4 ... 3 ... 2 ... 1 ... Rebooting Local firmware update To flash a local BIOS image (e.g. mounted from a USB stick), you can drop to the shell (option 9 ) and use the flashrom binary provided inside DTS directly. DANGER : Failure to use flashrom correctly may result in an unbootable device . For example, never flash an image that does not contain an Intel Firmware Descriptor (IFD) region and/or Management Engine (ME) region to the whole chip. You can use flashrom -p internal without additional parameters to double check if flashrom detects your chipset. This will not write anything. The following flashrom command will only rewrite the BIOS region: sudo flashrom -p internal --ifd -i bios -w [ path/to/your/coreboot.rom ] If flashrom outputs the following, you do not need to worry about it: Enabling flash write... Warning: Setting BIOS Control at 0xdc from 0x8b to 0x89 failed. New value is 0x8b. SPI Configuration is locked down EC transition DTS allows performing full Embedded Controller firmware transition from the proprietary vendor EC firmware to the Dasharo EC firmware. Currently, this functionality is supported on the NovaCustom NS5x/NS7x ) and NovaCustom NV4x only. Starting from DTS v1.2.0 to perform EC transition please run firmware update on the platform with proprietary vendor EC firmware. EC update DTS allows to update open-source Embedded Controller firmware to the newer version. This is how we can achieve that. Retrieve information about your current EC. system76_ectool info The output of the above-described command should contain information about the version of flashed firmware: board: clevo/ns50mu version: 2022 -08-16_c12ff1a Download the newest version of Embedded Controller firmware. Plug in power supply, without it, flashing EC is not possible as losing power may cause in damaged firmware. Flash Embedded Controller firmware internally. system76_ectool flash ec_file.rom The output of the above-described command should look as follows: file board: Ok ( \"clevo/ns50mu\" ) file version: Ok ( \"2022-08-16_c12ff1a\" ) ec board: Ok ( \"clevo/ns50mu\" ) ec version: Ok ( \"2022-08-31_cbff21b\" ) Waiting 5 seconds for all keys to be released Sync SPI Read 128K Saving ROM to backup.rom SPI Write 128K SPI Read 128K Successfully programmed SPI ROM Result: Ok (()) Sync System will shut off in 5 seconds Sync Note: this is example output, versions may differ Computer will shut down automatically. Power on your computer. Booting process may take a while. After boot, choose option number 9 to drop to Shell. Retrieve information about your updated EC. system76_ectool info The output of the above-described command should contain information about the version of flashed firmware: board: clevo/ns50mu version: 2022 -08-31_cbff21b Additional features The section below presents a list of functionalities added to DTS, which were developed at the community's request and which do not necessarily relate strictly to Dasharo. Run commands from iPXE shell Note: this functionality might not work, please see GitHub issue . It is possible to execute the bash script after Linux startup by passing it from the iPXE shell. Every script placed in /sbin/ipxe-commands will be executed automatically after startup. Here is a simple instruction on how to use that feature. Run the HTTP server in the directory which contains the DTS base image. If you build it by yourself, then it should be the meta-dts subdirectory: build/tmp/deploy/images/genericx86-64 . The easiest way to start an HTTP server is using http.server python module. $ python3 -m http.server 9000 Create a dts.ipxe bootchain file in a directory where you have an HTTP server. That file should have similar content (you need to enter the IP of your host machine in a local network). #!ipxe # kernel http://:9000/bzImage root = /dev/nfs initrd = http://:9000/dts-base-image-genericx86-64.cpio.gz initrd http://:9000/dts-base-image-genericx86-64.cpio.gz module http://:9000/custom-script /sbin/ipxe-commands mode = 755 boot Copy your custom-script script in this same directory. Enter the iPXE shell on your device and load dts.ipxe bootchain file. iPXE> dhcp Configuring ( net0 00 :0d:b9:4b:49:60 ) ...... ok iPXE> route net0: 192 .168.4.126/255.255.255.0 gw 192 .168.4.1 iPXE> chain http://192.168.4.98:9000/dts.ipxe http://192.168.4.98:9000/dts.ipxe... ok http://192.168.4.98:9000/bzImage... ok http://192.168.4.98:9000/dts-base-image-genericx86-64.cpio.gz... ok http://192.168.4.98:9000/custom-script... ok Now your custom-script script should be copied to DTS rootfs as ipxe-commands and will be executed after boot. Run DTS using VentoyOS Starting from version v1.1.1 , we provide also an ISO formatted image. Thanks to that, it can be used with VentoyOS[1]. As for now the following limitations are known. VentoyOS needs to be started in UEFI mode. Nothing can be saved on root file system, as VentoyOS boots systems in read-only mode. Please let us know if you started DTS using VentoyOS and have additional information for us. You can share them on Dasharo Matrix Workspace .","title":"Documentation"},{"location":"dasharo-tools-suite/documentation/#documentation","text":"","title":"Documentation"},{"location":"dasharo-tools-suite/documentation/#supported-hardware","text":"Dasharo Tools Suite was prepared to run on x86 platforms, but we can confirm that it boots on the following platforms: ASUS KGPE-D16, Dell OptiPlex 7010/9010, MSI PRO Z690-A DDR4 ( test report ), MSI PRO Z690-A DDR5 ( test report ), NovaCustom NV4x ( test report ), NovaCustom NS5x/7x ( test report ).","title":"Supported hardware"},{"location":"dasharo-tools-suite/documentation/#running","text":"The Dasharo Tools Suite can be started in various ways. Currently, there are two options: bootable over a network (iPXE), bootable USB stick image. The first one should always be preferred if possible, as it is the easiest one to use.","title":"Running"},{"location":"dasharo-tools-suite/documentation/#building","text":"We choose Yocto Project to prepare Dasharo Tools Suite system. DTS image can be built using publicly available sources. Thanks to publishing the build cache on cache.dasharo.com the time needed to finish the process should be significantly decreased.","title":"Building"},{"location":"dasharo-tools-suite/documentation/#disabling-secure-boot","text":"Any procedure affecting the firmware flashing should be preceded by controlling the Secure Boot status and if it is turned on, turning it off. The enabled Secure Boot will not only prevent you from operating on the firmware, but you will also not be able to launch DTS. To check the Secure Boot state: Turn off the station on which you want to test the Dasharo firmware. Turn the station on and go to the next step immediately. Hold the BIOS SETUP KEY to enter the BIOS MENU . Localize and enter the Secure Boot menu using the arrow keys and Enter. Verify that the Secure Boot Status field says Disabled - if not, deselect the Enforce Secure Boot option using the arrow keys and Enter. Change the setting of Secure Boot to Disabled and press Enter. Press the F10 key to open the dialog box. Press Enter to confirm changes and exit from the menu. After completing the steps described above, Secure Boot should be disabled. You could confirm that by repeating steps 3 - 5.","title":"Disabling Secure Boot"},{"location":"dasharo-tools-suite/documentation/#features","text":"This section describes the functionality of the Dasharo Tools Suite. These are: Dasharo zero-touch initial deployment , HCL Report , Firmware update , Local firmware update , EC transition , EC update , additional features , run commands from iPXE shell , run DTS using VentoyOS .","title":"Features"},{"location":"dasharo-tools-suite/overview/","text":"Dasharo Tools Suite Overview Dasharo Tools Suite (DTS) is a set of tools running in a minimal Linux environment to deploy, update, and maintain firmware on Dasharo-supported devices. For example, it can be used to update the firmware on a device or run the initial deployment, even when no OS is currently installed. Releases - groups information about all releases. Documentation - describes DTS functionality and information on how to run it. Reporting issues Thank you for using Dasharo Tools Suite. If you have encountered any problems with this system or would like to provide feedback for us - please open an issue on Dasharo issues . And if you have already used this system and would be interested in supporting the project, please check how to get Supporters Entrance , which ensures delivery of Dasharo firmware updates.","title":"Overview"},{"location":"dasharo-tools-suite/overview/#dasharo-tools-suite","text":"","title":"Dasharo Tools Suite"},{"location":"dasharo-tools-suite/overview/#overview","text":"Dasharo Tools Suite (DTS) is a set of tools running in a minimal Linux environment to deploy, update, and maintain firmware on Dasharo-supported devices. For example, it can be used to update the firmware on a device or run the initial deployment, even when no OS is currently installed. Releases - groups information about all releases. Documentation - describes DTS functionality and information on how to run it.","title":"Overview"},{"location":"dasharo-tools-suite/overview/#reporting-issues","text":"Thank you for using Dasharo Tools Suite. If you have encountered any problems with this system or would like to provide feedback for us - please open an issue on Dasharo issues . And if you have already used this system and would be interested in supporting the project, please check how to get Supporters Entrance , which ensures delivery of Dasharo firmware updates.","title":"Reporting issues"},{"location":"dasharo-tools-suite/releases/","text":"Release Notes Following Release Notes describe the status of Open Source Software development for Dasharo Tools Suite. For details about our release process, please read Dasharo Standard Release Process . Subscribe to Dasharo Tools Suite Newsletter v1.2.0 - 2023-05-10 Images USB bootable DTS v1.2.0 image sha256 sha256.sig DTS v1.2.0 ISO image sha256 ISO sha256.sig ISO See how to verify hash and signature on this video . It works the same way with ISO image. Changelog Please, refer to changelog stored in meta-dts repository. v1.1.1 - 2023-02-20 Images USB bootable DTS v1.1.1 image sha256 sha256.sig DTS v1.1.1 ISO image sha256 ISO sha256.sig ISO See how to verify hash and signature on this video . It works the same way with ISO image. Changelog Fixed Dasharo zero-touch initial deployment on MSI PRO Z690-A, added DDR5 target with dedicated firmware. Blocked Dasharo zero-touch initial deployment on platforms where Dasharo firmware was detected. Added couple UX improvements for Dasharo zero-touch initial deployment: added platform verification step (show detected device information), added firmware verification step (show hash of using binary), added progress bar on first instructions, used reboot as default behavior after successful flashing. Added improvements for HCL report. Added DTS ISO format image, and documentation about VentoyOS usage. Improved README of the meta-dts repository. Added service to run shell commands from iPXE . Added instructions for building PoC image with enabled UEFI Secure Boot support. v1.1.0 - 2022-11-02 Images USB bootable DTS v1.1.0 image sha256 sha256.sig Changelog Added Dasharo zero-touch initial deployment for a couple of supported platforms. Added multiple HCL report improvements, e.g. dump information about TPM, ME. Refactored Dasharo Tools Suite documentation . Added possibility to rollback using firmware dumped in HCL report. Added documentation about building Dasharo Tools Suite image . Added Github Actions to automate new version building. Added new tools: cbfstool, cbmem, futil, intelmetool (all from Dasharo coreboot fork ), binwalk , uefi-firmware-parser , mei-amt-check . Updated flashrom to version dasharo-v1.2.2 . Deploying iPXE boot artifacts on boot.dasharo.com . Sharing build cache on cache.dasharo.com . v1.0.2 - 2022-10-19 Images USB bootable DTS v1.0.2 image sha256 sha256.sig See how to verify hash and signature on this video . Changelog Added new vendor-specific menu entry, which is displayed only on supported platforms. For now, NovaCustom menu was added for NovaCustom NV4x and NovaCustom NS5x/7x laptops. DTS version is now printed in the main menu. ec_transition script now supports NovaCustom NV4x laptops and automatically download firmware used for transition both for NovaCustom NV4x NV4x and NovaCustom NS5x/7x laptops, firmware transition documentation is updated. Added kernel configuration to silence terminal logs by default (change loglevel to 1). Enabled GOOGLE_MEMCONSOLE_COREBOOT kernel configuration to ease getting firmware logs. v1.0.1 - 2022-09-02 Images USB bootable DTS v1.0.1 image sha256 sha256.sig See how to verify hash and signature on this video. Changelog Added system76_ectool to enable Embedded Controller firmware updating . Added ec_transition script, which helps with full Dasharo/Embedded Controller firmware transition for NovaCustom NS5x/7x. First public release: meta-dts-ce . v1.0.0 - 2022-08-09 Images USB bootable DTS v1.0.0 image sha256 # assuming all files have been downloaded to the same directory without # changing names sha256sum -c [ sha256 file ] Changelog Added auto-login functionality. Added user menu. Dasharo HCL Report , which adds the ability to automatically dump device information and send it to 3mdeb servers. Possibility to manually update the Dasharo firmware . Bootable via iPXE . Bootable via USB . Tested on NovaCustom NV4x, Dell OptiPlex 7010/9010.","title":"Releases"},{"location":"dasharo-tools-suite/releases/#release-notes","text":"Following Release Notes describe the status of Open Source Software development for Dasharo Tools Suite. For details about our release process, please read Dasharo Standard Release Process . Subscribe to Dasharo Tools Suite Newsletter","title":"Release Notes"},{"location":"dasharo-tools-suite/releases/#v120-2023-05-10","text":"","title":"v1.2.0 - 2023-05-10"},{"location":"dasharo-tools-suite/releases/#v111-2023-02-20","text":"","title":"v1.1.1 - 2023-02-20"},{"location":"dasharo-tools-suite/releases/#v110-2022-11-02","text":"","title":"v1.1.0 - 2022-11-02"},{"location":"dasharo-tools-suite/releases/#v102-2022-10-19","text":"","title":"v1.0.2 - 2022-10-19"},{"location":"dasharo-tools-suite/releases/#v101-2022-09-02","text":"","title":"v1.0.1 - 2022-09-02"},{"location":"dasharo-tools-suite/releases/#v100-2022-08-09","text":"","title":"v1.0.0 - 2022-08-09"},{"location":"dev-proc/documentation-guidelines/","text":"Documentation guidelines That document can be treated as an onboarding into creating and maintaining documentation in projects developed by Dasharo Team. It is a set of general rules and tips that you should have in mind while writing guides to any projects in Dasharo repositories. Table of content General rules Document type Useful tools Formatting General rules Make a plan - before starting a new document, you should know how it will look. It is good to prepare a table of content first, and then fill up planned chapters. Read twice before publish - everyone make mistakes. Before committing your changes, it is good to read this again and make sure that you do not make any typos, a dump of commands output is correct, or there are no other mistakes. Goal of document - Documentation is not written for everyone. Some documents contain only a list of commands with minor descriptions, some of them were created to describe research results, and others may be written for non-technical persons with a huge amount of data that are obvious and unnecessary to read by developers. Because of that, you should always know for who you are writing that document - it may be developers, testers, or non-technical management. Hierarchy of information - most important information should always be on top of the document. We should start with the title, short description, and table of contexts. The rest of the chapters should start with the most important one. 30/90 rule - It is good to ask your reporter or someone else to do a quick review where approx 30% of the work was done. At this moment, you probably have prepared the initial draft of the document with a table of content and some remarks about content in planned chapters. The second review should be done when 90% of the work is finished, and the document is almost done. With that workflow, you can make sure that you are on the same page with a reporter. Existing resources - We should not duplicate content that was previously described in another document. Some steps or explanations are related to a few documents, and it is not necessary to write the same again. It is good to use references to existing documents (like hyperlinks) - because of that, updating and maintenance of documentation are easier because the change in one document is related to several others. Also, if you see that a related document is outdated, it will be a much better choice to review and update them instead of writing another new one from scratch. Maintenance - documentation may be outdated after a few changes. We should keep that in mind and prepare an updated schedule. One of the ideas is to mark related documents in every pull request with technical changes. Of course, the best solution is to improve documentation with every change in code/architecture, but it is not always possible due to deadlines or lack of time. Marking documents to update in the future allows us to do that on better occasions - and we prevent situations where the reader must inform us that the documentation is highly outdated - or even useless. Archive - Projects are changing, and some topics from the past are not existing now. If the document describes the working of a non-existing mechanism, we should move it to the special folder with archived content. We can go back to that solution in the future, but it must be moved out to as not to mislead the reader. Document type Good documentation should be written in one of four modes. It can be a tutorial, how-to guide, technical reference, or explanation. These modes were proposed by Diataxis framework, and we want to follow that method in the future. Generally: Tutorials are learning-oriented, and their purpose is to take the reader by the hand through a series of steps to complete a project of some kind. It may be a getting started guide, end2end process, or preparing the working environment. How-to-guides should be written as a step list that is required to solve the problem . They are goal-oriented, which is the main difference between tutorials: how-to guides lead to solving some problems and are not focused on the learning experience. For example, building system images or modifying boot parameters. Reference guides are technical descriptions, and it is information-oriented. It is only information about some technical thing without an explanation of it in the larger context. A good example of that is a requirement list, description of functions or variables used in the program, or list of supported platforms. Explanation is a discussion focused on the understanding of some topic, like boot flow, description of specific communication protocol, or device provisioning. That document should explain the subject, not instruct how to do something. We should not create documents that are not related to these modes. Useful tools grammarly.com - online writing assistant who can improve your grammar and make the document clear. A premium account is a very useful option, but it is not a must. Core functionalities are available for free. It is highly recommended to use the Grammarly tool before committing changes. hemingwayapp.com - make your writing clear. Sometimes it catches things that are not detected by Grammarly. draw.io - we use that to prepare diagrams. paste.dasharo.com - pastebin alternative hosted by Dasharo. asciinema.org - free and open-source solution for recording terminal sessions. Sometimes - especially in more complex cases, it is good to present command sequences in this way. Formatting General rules of formatting documents: Use markdown preview to verify that document is rendering correctly. That feature is available in VS code, Github/Gitlab web IDE, and other tools. Line with code should not have more than 80 characters. To follow that rule, it is good to set the line at width 80 in your IDE. Here is how to do it in VS code. We also maintain the repository Dasharo/dev-tools-configs with editors configs used by our community. Feel free to create PR with your configuration - you can give your proposition to improve existing settings or create configs for editors that don't exist yet in our repository. A properly configurated editor simplifies correct formatting.","title":"Documentation guidelines"},{"location":"dev-proc/documentation-guidelines/#documentation-guidelines","text":"That document can be treated as an onboarding into creating and maintaining documentation in projects developed by Dasharo Team. It is a set of general rules and tips that you should have in mind while writing guides to any projects in Dasharo repositories.","title":"Documentation guidelines"},{"location":"dev-proc/documentation-guidelines/#table-of-content","text":"General rules Document type Useful tools Formatting","title":"Table of content"},{"location":"dev-proc/documentation-guidelines/#general-rules","text":"Make a plan - before starting a new document, you should know how it will look. It is good to prepare a table of content first, and then fill up planned chapters. Read twice before publish - everyone make mistakes. Before committing your changes, it is good to read this again and make sure that you do not make any typos, a dump of commands output is correct, or there are no other mistakes. Goal of document - Documentation is not written for everyone. Some documents contain only a list of commands with minor descriptions, some of them were created to describe research results, and others may be written for non-technical persons with a huge amount of data that are obvious and unnecessary to read by developers. Because of that, you should always know for who you are writing that document - it may be developers, testers, or non-technical management. Hierarchy of information - most important information should always be on top of the document. We should start with the title, short description, and table of contexts. The rest of the chapters should start with the most important one. 30/90 rule - It is good to ask your reporter or someone else to do a quick review where approx 30% of the work was done. At this moment, you probably have prepared the initial draft of the document with a table of content and some remarks about content in planned chapters. The second review should be done when 90% of the work is finished, and the document is almost done. With that workflow, you can make sure that you are on the same page with a reporter. Existing resources - We should not duplicate content that was previously described in another document. Some steps or explanations are related to a few documents, and it is not necessary to write the same again. It is good to use references to existing documents (like hyperlinks) - because of that, updating and maintenance of documentation are easier because the change in one document is related to several others. Also, if you see that a related document is outdated, it will be a much better choice to review and update them instead of writing another new one from scratch. Maintenance - documentation may be outdated after a few changes. We should keep that in mind and prepare an updated schedule. One of the ideas is to mark related documents in every pull request with technical changes. Of course, the best solution is to improve documentation with every change in code/architecture, but it is not always possible due to deadlines or lack of time. Marking documents to update in the future allows us to do that on better occasions - and we prevent situations where the reader must inform us that the documentation is highly outdated - or even useless. Archive - Projects are changing, and some topics from the past are not existing now. If the document describes the working of a non-existing mechanism, we should move it to the special folder with archived content. We can go back to that solution in the future, but it must be moved out to as not to mislead the reader.","title":"General rules"},{"location":"dev-proc/documentation-guidelines/#document-type","text":"Good documentation should be written in one of four modes. It can be a tutorial, how-to guide, technical reference, or explanation. These modes were proposed by Diataxis framework, and we want to follow that method in the future. Generally: Tutorials are learning-oriented, and their purpose is to take the reader by the hand through a series of steps to complete a project of some kind. It may be a getting started guide, end2end process, or preparing the working environment. How-to-guides should be written as a step list that is required to solve the problem . They are goal-oriented, which is the main difference between tutorials: how-to guides lead to solving some problems and are not focused on the learning experience. For example, building system images or modifying boot parameters. Reference guides are technical descriptions, and it is information-oriented. It is only information about some technical thing without an explanation of it in the larger context. A good example of that is a requirement list, description of functions or variables used in the program, or list of supported platforms. Explanation is a discussion focused on the understanding of some topic, like boot flow, description of specific communication protocol, or device provisioning. That document should explain the subject, not instruct how to do something. We should not create documents that are not related to these modes.","title":"Document type"},{"location":"dev-proc/documentation-guidelines/#useful-tools","text":"grammarly.com - online writing assistant who can improve your grammar and make the document clear. A premium account is a very useful option, but it is not a must. Core functionalities are available for free. It is highly recommended to use the Grammarly tool before committing changes. hemingwayapp.com - make your writing clear. Sometimes it catches things that are not detected by Grammarly. draw.io - we use that to prepare diagrams. paste.dasharo.com - pastebin alternative hosted by Dasharo. asciinema.org - free and open-source solution for recording terminal sessions. Sometimes - especially in more complex cases, it is good to present command sequences in this way.","title":"Useful tools"},{"location":"dev-proc/documentation-guidelines/#formatting","text":"General rules of formatting documents: Use markdown preview to verify that document is rendering correctly. That feature is available in VS code, Github/Gitlab web IDE, and other tools. Line with code should not have more than 80 characters. To follow that rule, it is good to set the line at width 80 in your IDE. Here is how to do it in VS code. We also maintain the repository Dasharo/dev-tools-configs with editors configs used by our community. Feel free to create PR with your configuration - you can give your proposition to improve existing settings or create configs for editors that don't exist yet in our repository. A properly configurated editor simplifies correct formatting.","title":"Formatting"},{"location":"dev-proc/feature-bug-fix-dev-process/","text":"Features and bug fixes development We are in favor of Test Driven Bug Fixing methodology for which process looks as follows: Create automated test that validates feature or reproduces bug - test fails at this point Pull upstream master branch to Dasharo forked repository master branch Merge master to /develop Create new branch / from /develop Commit changes to / Run test written in point 1 and make sure it pass. Run regression test suite and make sure new feature does not introduce new bugs. Submit PR to /develop","title":"Features and bug fixes development process"},{"location":"dev-proc/feature-bug-fix-dev-process/#features-and-bug-fixes-development","text":"We are in favor of Test Driven Bug Fixing methodology for which process looks as follows: Create automated test that validates feature or reproduces bug - test fails at this point Pull upstream master branch to Dasharo forked repository master branch Merge master to /develop Create new branch / from /develop Commit changes to / Run test written in point 1 and make sure it pass. Run regression test suite and make sure new feature does not introduce new bugs. Submit PR to /develop","title":"Features and bug fixes development"},{"location":"dev-proc/hcl-maintainer/","text":"Dasharo HCL Maintainer documentation This documentaintion aims to describe how to maintain Dasharo Hardware Compatibility List for CPUs, memory, mainboards and GPU. Generating entry Dasharo HCL report parsing For reports uploaded to 3mdeb cloud please use dedicated script readme. Extending list Please always sort table before publishing. In vim: Shift + V - to enter visual mode and mark whole range of entries. type : and sort u to run vim sort function on marked range and leave only unique lines. Github report Github pull request Go through standard review process for Dasharo documentation.","title":"HCL Maintainer documentation"},{"location":"dev-proc/hcl-maintainer/#dasharo-hcl-maintainer-documentation","text":"This documentaintion aims to describe how to maintain Dasharo Hardware Compatibility List for CPUs, memory, mainboards and GPU.","title":"Dasharo HCL Maintainer documentation"},{"location":"dev-proc/hcl-maintainer/#generating-entry","text":"","title":"Generating entry"},{"location":"dev-proc/hcl-maintainer/#extending-list","text":"Please always sort table before publishing. In vim: Shift + V - to enter visual mode and mark whole range of entries. type : and sort u to run vim sort function on marked range and leave only unique lines.","title":"Extending list"},{"location":"dev-proc/smbios-rules/","text":"Dasharo Product Guidelines: SMBIOS Information Introduction This document describes the guidelines for filling in the SMBIOS fields in devices supported by Dasharo. It is meant to be used primarily as a reference for Dasharo developers. BIOS Information (Type 0) Vendor field The Vendor field, for firmware with release date after 13 January 2022, is set as follows: 3mdeb For firmware with release date before 13 January 2022: 3mdeb Embedded Systems Consulting BIOS Version field The BIOS Version string is defined as follows: Dasharo ([ major_framework ] + [ minor_framework ]) v [ version ] major_framework refers to the primary framework in which the firmware is developed, e.g. coreboot or UEFI . minor_framework is the secondary framework, a supporting component for the primary framework, e.g. a coreboot payload. May not always be used, e.g. if edk2 is used as the primary framework. version means version according to official Dasharo Versioning documentation. For TianoCore UEFIPayloadPkg , we use the simpler and more recognizable UEFI name. Examples: Dasharo (coreboot+UEFI) v1.0.0 - for coreboot-based builds with TianoCore UEFIPayload Dasharo (coreboot+SeaBIOS) v1.0.0 - for coreboot-based builds with SeaBIOS payload Dasharo (coreboot+Heads) v1.0.0 - for coreboot-based builds with Heads payload Dasharo (UEFI) v1.0.0 - for plain edk2-based builds System Information (Type 1) Devices with an existing BIOS implementation In this case, set all the fields that are relevant (excluding BIOS version and vendor) to the same values as the stock firmware. To obtain SMBIOS values from the stock firmware, either: Obtain the fwdump-docker logs from 3mdeb cloud Run dmidecode -t 1 on the machine itself Devices with no existing BIOS implementation In the case where the device does not have an existing supported BIOS or the client chooses to use different SMBIOS fields (e.g. to make it easier to differentiate devices), refer to the SMBIOS specification v3.5.0 .","title":"Dasharo Product Guidelines: SMBIOS Information"},{"location":"dev-proc/smbios-rules/#dasharo-product-guidelines-smbios-information","text":"","title":"Dasharo Product Guidelines: SMBIOS Information"},{"location":"dev-proc/smbios-rules/#introduction","text":"This document describes the guidelines for filling in the SMBIOS fields in devices supported by Dasharo. It is meant to be used primarily as a reference for Dasharo developers.","title":"Introduction"},{"location":"dev-proc/smbios-rules/#bios-information-type-0","text":"","title":"BIOS Information (Type 0)"},{"location":"dev-proc/smbios-rules/#system-information-type-1","text":"","title":"System Information (Type 1)"},{"location":"dev-proc/source-code-structure/","text":"Source code structure Every repository forked and maintained by Dasharo Release Team has following branch structure: master - follows upstream project master branch /release - contains all code releases for given , list of supported platforms is in Hardware Compatibility List section /rel_vX.Y.Z - release branch for version X.Y.Z /develop - contains most recent development and is periodically synced with master branch / - tracks development of platform specific feature = _ if platform is supported by coreboot, otherwise we use common sense and available information about hardware. Remotes It is assumed that upstream repository is cloned and remote named dasharo is added later. This has to be done in order to pull git submodules from upstream repository so they don't have to be kept on Dasharo's repository. This can be done like this: git clone https://review.coreboot.org/coreboot.git cd coreboot git submodule update --init --checkout git remote add dasharo git@github.com:Dasharo/coreboot.git If everything was done properly, this is expected state of remotes: git remote -v dasharo git@github.com:Dasharo/coreboot.git ( fetch ) dasharo git@github.com:Dasharo/coreboot.git ( push ) origin https://review.coreboot.org/coreboot.git ( fetch ) origin https://review.coreboot.org/coreboot.git ( push ) Tags Dasharo Release tags in git repository use format: _vX.Y.Z New platform support Branch for new platform should be created from most recent master branch tag. If there is justified need to create support for new board at arbitrary non-tagged commit developer should mark this commit with _v0.0.0 tag. Force-pushes rules Force-pushes to /rel_vX.Y.Z , /develop or / are forbidden with following exceptions: rebasing - when some other PR is merged to target branch before our does, or when upstream's master introduces the same fixes that our branch would squashing - to not produce unnecessary \"fix indentation\" or \"add missing braces\" commits to the history (re-)signing commits (both -S and -s) - shouldn't happen, but if it does happen it would be better to have it fixed by original author than the person that tries to upstream it some time later. Force-pushes to /release branches are unconditionally forbidden. Merging guidelines We want to keep the history linear. The rebase merging strategy is desired. Merge commits in the code repositories are not allowed. The rebase strategy should be the only one available in the GitHub web UI. It is, however, strongly advised not to use GitHub web UI to perform code merges. The signed-off tends to be dropped (even when using the rebase strategy), which is problematic for some projects (e.g. it makes the coreboot lint checks fail after merging from the UI). The procedure of merging is as follows: Review the code in GitHub. Make sure to receive at least one Approve in the review process. Make sure that all change requests are resolved. Merge the branch using git CLI. In case of merging the feature branch into develop branch it may look as follows: git fetch dasharo git checkout dasharo//develop -b /develop git merge --ff-only dasharo// git push dasharo /develop This should automatically trigger closing the MR in the GitHub web UI. The remote branch can be safely deleted after this process. git push dasharo --delete / Note that the merging may fail if the source (in this case: feature ) branch is not properly rebased on top of the target (in this case: develop ) branch. In such a case, one must rebase the source branch first: git checkout dasharo// git checkout -b / git rebase dasharo// git push -f dasharo /","title":"Source code structure"},{"location":"dev-proc/source-code-structure/#source-code-structure","text":"Every repository forked and maintained by Dasharo Release Team has following branch structure: master - follows upstream project master branch /release - contains all code releases for given , list of supported platforms is in Hardware Compatibility List section /rel_vX.Y.Z - release branch for version X.Y.Z /develop - contains most recent development and is periodically synced with master branch / - tracks development of platform specific feature = _ if platform is supported by coreboot, otherwise we use common sense and available information about hardware.","title":"Source code structure"},{"location":"dev-proc/source-code-structure/#remotes","text":"It is assumed that upstream repository is cloned and remote named dasharo is added later. This has to be done in order to pull git submodules from upstream repository so they don't have to be kept on Dasharo's repository. This can be done like this: git clone https://review.coreboot.org/coreboot.git cd coreboot git submodule update --init --checkout git remote add dasharo git@github.com:Dasharo/coreboot.git If everything was done properly, this is expected state of remotes: git remote -v dasharo git@github.com:Dasharo/coreboot.git ( fetch ) dasharo git@github.com:Dasharo/coreboot.git ( push ) origin https://review.coreboot.org/coreboot.git ( fetch ) origin https://review.coreboot.org/coreboot.git ( push )","title":"Remotes"},{"location":"dev-proc/source-code-structure/#tags","text":"Dasharo Release tags in git repository use format: _vX.Y.Z","title":"Tags"},{"location":"dev-proc/source-code-structure/#new-platform-support","text":"Branch for new platform should be created from most recent master branch tag. If there is justified need to create support for new board at arbitrary non-tagged commit developer should mark this commit with _v0.0.0 tag.","title":"New platform support"},{"location":"dev-proc/source-code-structure/#force-pushes-rules","text":"Force-pushes to /rel_vX.Y.Z , /develop or / are forbidden with following exceptions: rebasing - when some other PR is merged to target branch before our does, or when upstream's master introduces the same fixes that our branch would squashing - to not produce unnecessary \"fix indentation\" or \"add missing braces\" commits to the history (re-)signing commits (both -S and -s) - shouldn't happen, but if it does happen it would be better to have it fixed by original author than the person that tries to upstream it some time later. Force-pushes to /release branches are unconditionally forbidden.","title":"Force-pushes rules"},{"location":"dev-proc/source-code-structure/#merging-guidelines","text":"We want to keep the history linear. The rebase merging strategy is desired. Merge commits in the code repositories are not allowed. The rebase strategy should be the only one available in the GitHub web UI. It is, however, strongly advised not to use GitHub web UI to perform code merges. The signed-off tends to be dropped (even when using the rebase strategy), which is problematic for some projects (e.g. it makes the coreboot lint checks fail after merging from the UI). The procedure of merging is as follows: Review the code in GitHub. Make sure to receive at least one Approve in the review process. Make sure that all change requests are resolved. Merge the branch using git CLI. In case of merging the feature branch into develop branch it may look as follows: git fetch dasharo git checkout dasharo//develop -b /develop git merge --ff-only dasharo// git push dasharo /develop This should automatically trigger closing the MR in the GitHub web UI. The remote branch can be safely deleted after this process. git push dasharo --delete / Note that the merging may fail if the source (in this case: feature ) branch is not properly rebased on top of the target (in this case: develop ) branch. In such a case, one must rebase the source branch first: git checkout dasharo// git checkout -b / git rebase dasharo// git push -f dasharo /","title":"Merging guidelines"},{"location":"dev-proc/standard-release-process/","text":"Standard Release Process Following procedure is generic description of release process of firmware for supported hardware platforms. Precise steps and any difference from standard process are described in platform specific documentation. Description here is, intentionally, Open Source Firmware framework agnostics and should be maintained in that way. Process steps Checkout new branch /rel_vX.Y.Z from recent commit on /release - to understand versioning scheme please read Versioning section Merge current /develop to /rel_vX.Y.Z Run platform regression test suite Fix all required issues and repeat point 3 until fixed - this doesn't mean all tests pass, this mean that approved set passed If results are accepted merge it to /release branch Add tag, which should trigger CI and publish binaries. Tag should be annotated and signed. For example: git tag -a -s -m \"_vX.Y.Z\" _vX.Y.Z Merge release branch to develop","title":"Standard Release Process"},{"location":"dev-proc/standard-release-process/#standard-release-process","text":"Following procedure is generic description of release process of firmware for supported hardware platforms. Precise steps and any difference from standard process are described in platform specific documentation. Description here is, intentionally, Open Source Firmware framework agnostics and should be maintained in that way.","title":"Standard Release Process"},{"location":"dev-proc/standard-release-process/#process-steps","text":"Checkout new branch /rel_vX.Y.Z from recent commit on /release - to understand versioning scheme please read Versioning section Merge current /develop to /rel_vX.Y.Z Run platform regression test suite Fix all required issues and repeat point 3 until fixed - this doesn't mean all tests pass, this mean that approved set passed If results are accepted merge it to /release branch Add tag, which should trigger CI and publish binaries. Tag should be annotated and signed. For example: git tag -a -s -m \"_vX.Y.Z\" _vX.Y.Z Merge release branch to develop","title":"Process steps"},{"location":"dev-proc/versioning/","text":"Versioning Dasharo Releases are versioned using Semantic Versioning and Keep A Changelog to document changes introduced in new releases. Major version zero (0.y.z) is for initial development and may not support all Dasharo Quality Criteria. The only way to map Dasharo Version to version of Open Source Firmware framework or other components included in Dasharo Release is through release notes. Link to Dasharo Release Notes for your hardware platform can be found in menu on the left side (Supported Hardware->Hardware Model->Releases). Dasharo Supporters releases Dasharo Supporters receive firmware updates more frequently than the community. Number of updates per year depends on the number of Dasharo Subscriptions sold and the availability of other funding (e.g., NLNet, corporate sponsors, community donations) but is less than 2 updates per year. Dasharo Supporters updates are characterized by a changing patch version ( z ). Fixes and features introduced in Dasharo Supporters releases will also be available later in community releases. In short, being a Dasharo Supporter gives an early access to the newest features and fixes. Community releases Community releases are built and published once a year. Each community release has a zero patch version ( x.y.0 ) and the only changing number is the minor version y . Signing keys In Dasharo we use following rules for keys: GPG RSA 4096 for signing and authentication and subkey for encryption There few types of naming conventions, which define Real Name field and chain of trust schemes: Software: Real Name: open-source software release signing key Signing key: 3mdeb Open Source Software Master Key Firmware: Real Name: open-source firmware release signing key Signing key: 3mdeb Dasharo Master Key PC Engines (firmware exception): Real Name: PC Engines open-source firmware release signing key Signing key: 3mdeb Open Source Firmware Master Key Dasharo firmware produced by 3mdeb: Real Name: Dasharo release compatible with signing key Signing key: 3mdeb Dasharo Master Key For Dasharo firmware produced by 3mdeb on customer's behalf: Real Name: Dasharo open-source firmware for signing key Signing key: 3mdeb Dasharo Master Key typically is in form or just if we release firmware for whole line of products which can be support in one binary e.g. PC Engines. Examples: Dell OptiPlex 7010/9010 ASUS KGPE-D16 MSI MS7D25 NovaCustom Tuxedo Most recent status should be reflected in 3mdeb-secpack repository.","title":"Versioning"},{"location":"dev-proc/versioning/#versioning","text":"Dasharo Releases are versioned using Semantic Versioning and Keep A Changelog to document changes introduced in new releases. Major version zero (0.y.z) is for initial development and may not support all Dasharo Quality Criteria. The only way to map Dasharo Version to version of Open Source Firmware framework or other components included in Dasharo Release is through release notes. Link to Dasharo Release Notes for your hardware platform can be found in menu on the left side (Supported Hardware->Hardware Model->Releases).","title":"Versioning"},{"location":"dev-proc/versioning/#dasharo-supporters-releases","text":"Dasharo Supporters receive firmware updates more frequently than the community. Number of updates per year depends on the number of Dasharo Subscriptions sold and the availability of other funding (e.g., NLNet, corporate sponsors, community donations) but is less than 2 updates per year. Dasharo Supporters updates are characterized by a changing patch version ( z ). Fixes and features introduced in Dasharo Supporters releases will also be available later in community releases. In short, being a Dasharo Supporter gives an early access to the newest features and fixes.","title":"Dasharo Supporters releases"},{"location":"dev-proc/versioning/#community-releases","text":"Community releases are built and published once a year. Each community release has a zero patch version ( x.y.0 ) and the only changing number is the minor version y .","title":"Community releases"},{"location":"dev-proc/versioning/#signing-keys","text":"In Dasharo we use following rules for keys: GPG RSA 4096 for signing and authentication and subkey for encryption There few types of naming conventions, which define Real Name field and chain of trust schemes: Software: Real Name: open-source software release signing key Signing key: 3mdeb Open Source Software Master Key Firmware: Real Name: open-source firmware release signing key Signing key: 3mdeb Dasharo Master Key PC Engines (firmware exception): Real Name: PC Engines open-source firmware release signing key Signing key: 3mdeb Open Source Firmware Master Key Dasharo firmware produced by 3mdeb: Real Name: Dasharo release compatible with signing key Signing key: 3mdeb Dasharo Master Key For Dasharo firmware produced by 3mdeb on customer's behalf: Real Name: Dasharo open-source firmware for signing key Signing key: 3mdeb Dasharo Master Key typically is in form or just if we release firmware for whole line of products which can be support in one binary e.g. PC Engines. Examples: Dell OptiPlex 7010/9010 ASUS KGPE-D16 MSI MS7D25 NovaCustom Tuxedo Most recent status should be reflected in 3mdeb-secpack repository.","title":"Signing keys"},{"location":"ecosystem/overview/","text":"Ecosystem Overview Dasharo ecosystem contain multiple components on various levels of organization. This section overview role of every component. Open Source Firmware Community - semi-organised collections of contributors to projects related to embedded firmware. Dasharo project contributors are part of OSF community. Development - Dasharo Development describes processes which Embedded Firmware Team uses for the development of Dasharo Modules, which are sometimes custom services, but most of the time ready to use productised services, Open Core or SaaS. Production - Dasharo Production describes the process of putting together Dasharo Modules according to specific requirements. In this section we describe development infrastructure, build environment, CI/CD and build publishing methods. We also cover how production interacts with Dasharo Transparent Validation System. Customer Infrastructure - Some customers may have the need of replicating part of Dasharo Production process and infrastructure in their own environment, which leads to repositories synchronization, different CI/CD setup and other needs. This section describes interaction with Customer Infrastructure and which part of Dasharo Production is deployable on the customer site. Transparent Validation - Dasharo Transparent Validation (DTV) is a set of software, firmware and hardware components with the goal of simplifying and improving long term maintenance of Dasharo firmware. In this section we introduce components which belong to DTV. Testing Infrastructure - Part of Dasharo Transparent Validation responsible for scheduling automated testing, publishing test results and interacting with Dasharo Production in the area of release candidate quality confirmation.","title":"Overview"},{"location":"ecosystem/overview/#ecosystem-overview","text":"Dasharo ecosystem contain multiple components on various levels of organization. This section overview role of every component. Open Source Firmware Community - semi-organised collections of contributors to projects related to embedded firmware. Dasharo project contributors are part of OSF community. Development - Dasharo Development describes processes which Embedded Firmware Team uses for the development of Dasharo Modules, which are sometimes custom services, but most of the time ready to use productised services, Open Core or SaaS. Production - Dasharo Production describes the process of putting together Dasharo Modules according to specific requirements. In this section we describe development infrastructure, build environment, CI/CD and build publishing methods. We also cover how production interacts with Dasharo Transparent Validation System. Customer Infrastructure - Some customers may have the need of replicating part of Dasharo Production process and infrastructure in their own environment, which leads to repositories synchronization, different CI/CD setup and other needs. This section describes interaction with Customer Infrastructure and which part of Dasharo Production is deployable on the customer site. Transparent Validation - Dasharo Transparent Validation (DTV) is a set of software, firmware and hardware components with the goal of simplifying and improving long term maintenance of Dasharo firmware. In this section we introduce components which belong to DTV. Testing Infrastructure - Part of Dasharo Transparent Validation responsible for scheduling automated testing, publishing test results and interacting with Dasharo Production in the area of release candidate quality confirmation.","title":"Ecosystem Overview"},{"location":"ecosystem/roadmap/","text":"Roadmap Each features on below roadmap should be placed in public issue tracker, so it can be publicly referenced. Some places where issues can be discussed: Dasharo Github issues repo especially issues tagged enhancement . coreboot issues tracker edk2 bugzilla Backlog TrenchBoot Roadmap firmware related issues. Dasharo Reference OS on USB stick to simplify firmware deployment fwupd/LVFS for firmware deployment ipxe for firmware deployment","title":"Roadmap"},{"location":"ecosystem/roadmap/#roadmap","text":"Each features on below roadmap should be placed in public issue tracker, so it can be publicly referenced. Some places where issues can be discussed: Dasharo Github issues repo especially issues tagged enhancement . coreboot issues tracker edk2 bugzilla","title":"Roadmap"},{"location":"ecosystem/roadmap/#backlog","text":"TrenchBoot Roadmap firmware related issues. Dasharo Reference OS on USB stick to simplify firmware deployment fwupd/LVFS for firmware deployment ipxe for firmware deployment","title":"Backlog"},{"location":"guides/dasharo-reviewers-guide/","text":"Dasharo Reviewers Guide Based on reviews of Dasharo compatible with MSI Z690-A DDR4/DDR5, we created the following guide to explain the performance gap between MSI proprietary and Dasharo open-source firmware, but in the long run, the same discoveries can apply to other Dasharo and open-source firmware solutions. Introduction During the 23+ years of coreboot's existence, one aspect that has never been in-depth tested is how its performance compares against proprietary firmware solutions that run on the same hardware platform. The lack of performance testing is because, for most of the interested parties, the selling point of coreboot was the transparency of being open-source, and this rarely made direct comparisons about other features or functionality. Historically, most of what we could find about coreboot performance involves the lower POST times claims, but there needs to be more information regarding its runtime performance as measured in benchmarks, which is a significant point that end users are interested in. Sadly, we need more internal resources and the necessary field experience to conduct such exhaustive benchmark testing. Several significant findings came from third-party benchmarks and community reports, which is enough to know our current standing. Professional hardware reviewers should be better at performing and analyzing measures than we are. Why We Ask To Fine Tune Settings In general, we found out in our limited benchmarking that performance out-of-the-box with Dasharo is measurably lower than performance with MSI proprietary firmware, in the order of 6-8% on the benchmarked Core i5 12600K. Lower performance was quickly tracked down to MSI using, by default, certain processor operating parameters that are quite different from the values stated on the Intel datasheets, resulting in alterations of the processor behavior that allows it to sustain Turbo Boost with higher clock speeds and for longer periods than otherwise possible, and thus appear to perform better overall. After normalizing across both MSI proprietary firmware and Dasharo, the values we found were different, and the benchmark difference was reduced to around 2% (21:19- 29:00) . We also found several review websites that have already written articles and analysis about this matter. Mainboard vendors use default values above those specified by Intel (technically overclocking) to produce better performance results in benchmarks ( AnandTech , TechSpot , VideoCardz , Gamers Nexus about cheating , GamersNexus about MSI default settings , GamersNexus Z490 YouTube Review , TechPowerUp , Tom's Hardware ). Depending on whom you ask, using aggressive values by default can be seen either as a convenience, since the end user gets more performance without having to know how to configure the firmware, or as a form of cheating, due to the end user usually having no idea about these changes and that they are overclocking out-of-the-box. As for the time being, we're sticking to Intel specification default values; these mainboard vendors' custom optimizations hurts us because it makes the difference look much bigger than it is. What we want to showcase is how Dasharo (for this MSI port, coreboot + EDKII UefiPayloadPkg) performance compares against the proprietary firmware codebase. The only way to do so accurately is by ensuring that the hardware operating values are the same in both Dasharo and the original firmware so that the performance differences are not due to higher processor clock speeds thanks to higher Power Limits, unlimited Turbo Boost times, or similar tricks. Note that we are okay with out-of-the-box comparisons, but that wouldn't be directly an apples-to-apples comparison of the performance of both firmware codebases, which is our point. Thus, to make it fair, the hardware has to be tweaked to run with the same operating values on both. As you can't change values on Dasharo unless you're willing to recompile (or ask for a custom build with tweaked values), the easiest way is by bringing MSI firmware values down to Dasharo/Intel levels. Find Your Processor Intel Default Parameters So far we've found six processor-configurable parameters that differ significantly: PL1, PL2, PL1 Tau, ICCMAX, DC_LL, and AC_LL. coreboot uses the values found on two sections of the Intel 12th Generation Intel Core Processors Datasheet (Volume 1 of 2). You will have to check the datasheet to find the proper values for your processor so that you can manually input them onto MSI firmware. In the case of MSI firmware default values, we found no public information, so we only know how it autoconfigures the processors we tested. Note that on the datasheet, Intel doesn't mention processor models by name/number but instead classifies them by amount of P+E cores and Base Power TDP, so first, you have to check these two values from Intel Ark for your processor model, then check on the Datasheet tables what matches both classes to get the Intel default values for the configurable parameters. Here are examples covering the 12400, 12600K, 12900K and 12900KS ( Processor Line Thermal and Power - Package Turbo Specifications (S / HX - Processor Lines) - S-Processor Line LGA ) from this section of datasheet: 12400 6+0 Core 65W PL1 = 65W PL2 = 117W PL1 Tau = 28s 12600K 6+4 Core 125W PL1 = 125W PL2 = 150W PL1 Tau = 56s 12900K 8+8 Core 125W PL1 = 125W PL2 = 241W PL1 Tau = 56s 12900KS 8+8 Core 150W PL1 = 150W PL2 = 241W PL1 Tau = 56s VCCCORE DC Specifications - Processor VCCCORE Active and Idle Mode DC Voltage and Current Specifications - Segment S-Processor Line from this section of datasheet: 12400 S-Processor Line (65W) 6+0 -Core ICCMAX = 151A DC_LL/AC_LL = 1.7 m\u03a9 (170) 12600K S-Processor Line (125W) 6+4 -Core ICCMAX = 175A DC_LL/AC_LL = 1.7 m\u03a9 (170) 12900K S-Processor Line (125W) 8+8 -Core ICCMAX = 280A DC_LL/AC_LL = 1.1 m\u03a9 (110) 12900KS S-Processor Line (150W) 8+8 -Core ICCMAX = 280A DC_LL/AC_LL = 1.1 m\u03a9 (110) 1 On S-Processor Line, AC_LL is the same as DC_LL. For reference, on a 12600K, the MSI 1.70 firmware on Auto with CPU Cooler Tuning set to Boxed Cooler (lowest values for auto-configuration) uses the following values vs. Dasharo/Intel defaults: MSI BIOS 1.70 PL1 = 241W PL2 = 241W PL1 Tau = 56s ICCMAX = 250A DC_LL/AC_LL = 80 Dasharo 1.1.0 PL1 = 125W PL2 = 241W PL1 Tau = 56s ICCMAX = 175A DC_LL/AC_LL = 170 Configure MSI Firmware With Intel Default Parameters After you have found your processor model values, you can input them on MSI firmware. Most likely, you want to start from default settings. Enter MSI Firmware, and change the following: Settings Menu (Left Panel) -> Save & Exit Restore Defaults (Confirm Yes) Save Changes and Reboot (Confirm Yes) After the power off/on cycle, enter MSI firmware again, change the following values, then repeat Save Changes and Reboot: OC Menu (Left Panel) -> Advanced CPU Configuration Enhanced Turbo: Disabled (This is MSI name for Multi Core Enhancement) Long Duration Power Limit(W): PL1 Long Duration Maintained(s): PL1 Tau Short Duration Power Limit(W): PL2 CPU Current Limit (A): ICCMAX CPU Lite Load Control: Advanced (Required to input DC_LL and AC_LL as numbers instead of \"Modes\") CPU AC Loadline: AC_LL CPU DC Loadline: DC_LL Miscellaneous Comments Since you can software flash Dasharo and flash MSI firmware again on the same system, you likely want to use the same computer to test both firmware so that no temperature or clock speeds difference could attribute to different pressure on heatsink mounting or silicon lottery. MSI firmware bases its default (Auto) PL1, PL2, and ICCMAX values on the CPU Cooler Tuning set. When using Restore Defaults on a 12600K, this setting defaults to Water Cooler, which allows for technically unlimited PL1 and PL2 (4095W). Even the Boxed Cooler setting configures the 12600K to 241W PL1 and 241W PL2. Thus, you must manually set the individual values for controlled results. So far, the setting that most affected benchmark scores are AC_LL and DC_LL. PL1, PL2 and ICCMAX are limiting. They are only meaningful if the processor gets limited by them, which would depend on the processor model (some have more headroom than others. PL1 is 125W for both 6+4 12600K and 8+8 12900K, the latter would be severely more limited), whereas the other two values are always in effect. On the tested 12600K, the effect of the significantly lower values of AC_LL on DC_LL that MSI uses is a rather massive difference of 20 Watts in power consumption (as reported by ThrottleStop and HWiNFO, and also by lower processor temperatures) when running Cinebench R23. Thus, with MSI values (whenever on MSI or a custom Dasharo build with those), the 12600K doesn't even reach the PL1 limit, allowing it to maintain the highest Turbo Boost clock speeds infinitely, whereas, on Dasharo (or MSI with Intel default values), the extra power consumption makes it to go beyond PL1, eventually throttling back to slower clocks to keep under PL1. LCC (Loadline Calibration Control) is also present in another menu as CPU Loadline Calibration Control, but we left it at Auto. We need to find out if changes in CPU Lite Load Control / CPU AC Loadline / CPU DC Loadline change it or if LCC operates the same regardless of changes to the previous options. The most critical performance-related bug we found in Dasharo involves benchmarking Single Thread applications on Windows 11. With Dasharo, Windows 11 CPU Scheduler likes to move threads around between P and E cores, whereas MSI firmware on the same scenario instead always favors P cores. Such behavior significantly affects the scores of Single-Threaded benchmarks and makes them highly variable depending on which core type a thread spent most of its time. There may be MSRs (Model Specific Registers) related to Intel Thread Director that we aren't aware of that manages this. The only workaround found is to set CPU Affinity manually, which can be performed automatically with Process Lasso, with the bonus of using Forced Mode to continuously re-apply the CPU Affinity settings, as some applications, including Cinebench, like to change them when you start to run the benchmark. Of course, this will not happen on P core, only models like 12400. We did not test manual affinity tested on Linux. Dasharo currently doesn't support manually changing the memory clock speeds, and it will default to the highest standard JEDEC profile supported by the installed memory modules. MSI firmware also defaults to JEDEC profiles, so out-of-the-box, they're matched at memory configuration, thus not a problem. Many enthusiast-grade DDR4 modules use 3200 MHz (maximum supported by Alder Lake-S) or higher and have that clock speed as an XMP profile, whereas the standard JEDEC profile could be just 2133 or 2400 MHz. In most cases, a 3200 MHz DDR4 module will run at lower speeds than expected. There are modules rated for JEDEC 3200 MHz 22-22-22 @ 1.2V that should work in both Dasharo and MSI firmware, in case you're interested in testing this. It is also possible to force Dasharo to use an XMP profile if you're willing to recompile or use a custom build. There are a lot of other settings and MSRs (Model Specific Registers) that we have yet to test. We track the progress of that effort in this issue. Public Alder Lake FSP Integration Guide documents how to set these settings On or Off, but there are few details about how they change the Processor behavior. The remaining 2% of performance will come from matching all these settings. On the public datasheet, there is no DC_LL for the 8+8 150W class, only 8+8 125W, but we can confirm from alternate sources that this is the correct value. \u21a9","title":"Dasharo Reviewers Guide"},{"location":"guides/dasharo-reviewers-guide/#dasharo-reviewers-guide","text":"Based on reviews of Dasharo compatible with MSI Z690-A DDR4/DDR5, we created the following guide to explain the performance gap between MSI proprietary and Dasharo open-source firmware, but in the long run, the same discoveries can apply to other Dasharo and open-source firmware solutions.","title":"Dasharo Reviewers Guide"},{"location":"guides/dasharo-reviewers-guide/#introduction","text":"During the 23+ years of coreboot's existence, one aspect that has never been in-depth tested is how its performance compares against proprietary firmware solutions that run on the same hardware platform. The lack of performance testing is because, for most of the interested parties, the selling point of coreboot was the transparency of being open-source, and this rarely made direct comparisons about other features or functionality. Historically, most of what we could find about coreboot performance involves the lower POST times claims, but there needs to be more information regarding its runtime performance as measured in benchmarks, which is a significant point that end users are interested in. Sadly, we need more internal resources and the necessary field experience to conduct such exhaustive benchmark testing. Several significant findings came from third-party benchmarks and community reports, which is enough to know our current standing. Professional hardware reviewers should be better at performing and analyzing measures than we are.","title":"Introduction"},{"location":"guides/dasharo-reviewers-guide/#why-we-ask-to-fine-tune-settings","text":"In general, we found out in our limited benchmarking that performance out-of-the-box with Dasharo is measurably lower than performance with MSI proprietary firmware, in the order of 6-8% on the benchmarked Core i5 12600K. Lower performance was quickly tracked down to MSI using, by default, certain processor operating parameters that are quite different from the values stated on the Intel datasheets, resulting in alterations of the processor behavior that allows it to sustain Turbo Boost with higher clock speeds and for longer periods than otherwise possible, and thus appear to perform better overall. After normalizing across both MSI proprietary firmware and Dasharo, the values we found were different, and the benchmark difference was reduced to around 2% (21:19- 29:00) . We also found several review websites that have already written articles and analysis about this matter. Mainboard vendors use default values above those specified by Intel (technically overclocking) to produce better performance results in benchmarks ( AnandTech , TechSpot , VideoCardz , Gamers Nexus about cheating , GamersNexus about MSI default settings , GamersNexus Z490 YouTube Review , TechPowerUp , Tom's Hardware ). Depending on whom you ask, using aggressive values by default can be seen either as a convenience, since the end user gets more performance without having to know how to configure the firmware, or as a form of cheating, due to the end user usually having no idea about these changes and that they are overclocking out-of-the-box. As for the time being, we're sticking to Intel specification default values; these mainboard vendors' custom optimizations hurts us because it makes the difference look much bigger than it is. What we want to showcase is how Dasharo (for this MSI port, coreboot + EDKII UefiPayloadPkg) performance compares against the proprietary firmware codebase. The only way to do so accurately is by ensuring that the hardware operating values are the same in both Dasharo and the original firmware so that the performance differences are not due to higher processor clock speeds thanks to higher Power Limits, unlimited Turbo Boost times, or similar tricks. Note that we are okay with out-of-the-box comparisons, but that wouldn't be directly an apples-to-apples comparison of the performance of both firmware codebases, which is our point. Thus, to make it fair, the hardware has to be tweaked to run with the same operating values on both. As you can't change values on Dasharo unless you're willing to recompile (or ask for a custom build with tweaked values), the easiest way is by bringing MSI firmware values down to Dasharo/Intel levels.","title":"Why We Ask To Fine Tune Settings"},{"location":"guides/dasharo-reviewers-guide/#find-your-processor-intel-default-parameters","text":"So far we've found six processor-configurable parameters that differ significantly: PL1, PL2, PL1 Tau, ICCMAX, DC_LL, and AC_LL. coreboot uses the values found on two sections of the Intel 12th Generation Intel Core Processors Datasheet (Volume 1 of 2). You will have to check the datasheet to find the proper values for your processor so that you can manually input them onto MSI firmware. In the case of MSI firmware default values, we found no public information, so we only know how it autoconfigures the processors we tested. Note that on the datasheet, Intel doesn't mention processor models by name/number but instead classifies them by amount of P+E cores and Base Power TDP, so first, you have to check these two values from Intel Ark for your processor model, then check on the Datasheet tables what matches both classes to get the Intel default values for the configurable parameters. Here are examples covering the 12400, 12600K, 12900K and 12900KS ( Processor Line Thermal and Power - Package Turbo Specifications (S / HX - Processor Lines) - S-Processor Line LGA ) from this section of datasheet: 12400 6+0 Core 65W PL1 = 65W PL2 = 117W PL1 Tau = 28s 12600K 6+4 Core 125W PL1 = 125W PL2 = 150W PL1 Tau = 56s 12900K 8+8 Core 125W PL1 = 125W PL2 = 241W PL1 Tau = 56s 12900KS 8+8 Core 150W PL1 = 150W PL2 = 241W PL1 Tau = 56s VCCCORE DC Specifications - Processor VCCCORE Active and Idle Mode DC Voltage and Current Specifications - Segment S-Processor Line from this section of datasheet: 12400 S-Processor Line (65W) 6+0 -Core ICCMAX = 151A DC_LL/AC_LL = 1.7 m\u03a9 (170) 12600K S-Processor Line (125W) 6+4 -Core ICCMAX = 175A DC_LL/AC_LL = 1.7 m\u03a9 (170) 12900K S-Processor Line (125W) 8+8 -Core ICCMAX = 280A DC_LL/AC_LL = 1.1 m\u03a9 (110) 12900KS S-Processor Line (150W) 8+8 -Core ICCMAX = 280A DC_LL/AC_LL = 1.1 m\u03a9 (110) 1 On S-Processor Line, AC_LL is the same as DC_LL. For reference, on a 12600K, the MSI 1.70 firmware on Auto with CPU Cooler Tuning set to Boxed Cooler (lowest values for auto-configuration) uses the following values vs. Dasharo/Intel defaults: MSI BIOS 1.70 PL1 = 241W PL2 = 241W PL1 Tau = 56s ICCMAX = 250A DC_LL/AC_LL = 80 Dasharo 1.1.0 PL1 = 125W PL2 = 241W PL1 Tau = 56s ICCMAX = 175A DC_LL/AC_LL = 170","title":"Find Your Processor Intel Default Parameters"},{"location":"guides/dasharo-reviewers-guide/#configure-msi-firmware-with-intel-default-parameters","text":"After you have found your processor model values, you can input them on MSI firmware. Most likely, you want to start from default settings. Enter MSI Firmware, and change the following: Settings Menu (Left Panel) -> Save & Exit Restore Defaults (Confirm Yes) Save Changes and Reboot (Confirm Yes) After the power off/on cycle, enter MSI firmware again, change the following values, then repeat Save Changes and Reboot: OC Menu (Left Panel) -> Advanced CPU Configuration Enhanced Turbo: Disabled (This is MSI name for Multi Core Enhancement) Long Duration Power Limit(W): PL1 Long Duration Maintained(s): PL1 Tau Short Duration Power Limit(W): PL2 CPU Current Limit (A): ICCMAX CPU Lite Load Control: Advanced (Required to input DC_LL and AC_LL as numbers instead of \"Modes\") CPU AC Loadline: AC_LL CPU DC Loadline: DC_LL","title":"Configure MSI Firmware With Intel Default Parameters"},{"location":"guides/dasharo-reviewers-guide/#miscellaneous-comments","text":"Since you can software flash Dasharo and flash MSI firmware again on the same system, you likely want to use the same computer to test both firmware so that no temperature or clock speeds difference could attribute to different pressure on heatsink mounting or silicon lottery. MSI firmware bases its default (Auto) PL1, PL2, and ICCMAX values on the CPU Cooler Tuning set. When using Restore Defaults on a 12600K, this setting defaults to Water Cooler, which allows for technically unlimited PL1 and PL2 (4095W). Even the Boxed Cooler setting configures the 12600K to 241W PL1 and 241W PL2. Thus, you must manually set the individual values for controlled results. So far, the setting that most affected benchmark scores are AC_LL and DC_LL. PL1, PL2 and ICCMAX are limiting. They are only meaningful if the processor gets limited by them, which would depend on the processor model (some have more headroom than others. PL1 is 125W for both 6+4 12600K and 8+8 12900K, the latter would be severely more limited), whereas the other two values are always in effect. On the tested 12600K, the effect of the significantly lower values of AC_LL on DC_LL that MSI uses is a rather massive difference of 20 Watts in power consumption (as reported by ThrottleStop and HWiNFO, and also by lower processor temperatures) when running Cinebench R23. Thus, with MSI values (whenever on MSI or a custom Dasharo build with those), the 12600K doesn't even reach the PL1 limit, allowing it to maintain the highest Turbo Boost clock speeds infinitely, whereas, on Dasharo (or MSI with Intel default values), the extra power consumption makes it to go beyond PL1, eventually throttling back to slower clocks to keep under PL1. LCC (Loadline Calibration Control) is also present in another menu as CPU Loadline Calibration Control, but we left it at Auto. We need to find out if changes in CPU Lite Load Control / CPU AC Loadline / CPU DC Loadline change it or if LCC operates the same regardless of changes to the previous options. The most critical performance-related bug we found in Dasharo involves benchmarking Single Thread applications on Windows 11. With Dasharo, Windows 11 CPU Scheduler likes to move threads around between P and E cores, whereas MSI firmware on the same scenario instead always favors P cores. Such behavior significantly affects the scores of Single-Threaded benchmarks and makes them highly variable depending on which core type a thread spent most of its time. There may be MSRs (Model Specific Registers) related to Intel Thread Director that we aren't aware of that manages this. The only workaround found is to set CPU Affinity manually, which can be performed automatically with Process Lasso, with the bonus of using Forced Mode to continuously re-apply the CPU Affinity settings, as some applications, including Cinebench, like to change them when you start to run the benchmark. Of course, this will not happen on P core, only models like 12400. We did not test manual affinity tested on Linux. Dasharo currently doesn't support manually changing the memory clock speeds, and it will default to the highest standard JEDEC profile supported by the installed memory modules. MSI firmware also defaults to JEDEC profiles, so out-of-the-box, they're matched at memory configuration, thus not a problem. Many enthusiast-grade DDR4 modules use 3200 MHz (maximum supported by Alder Lake-S) or higher and have that clock speed as an XMP profile, whereas the standard JEDEC profile could be just 2133 or 2400 MHz. In most cases, a 3200 MHz DDR4 module will run at lower speeds than expected. There are modules rated for JEDEC 3200 MHz 22-22-22 @ 1.2V that should work in both Dasharo and MSI firmware, in case you're interested in testing this. It is also possible to force Dasharo to use an XMP profile if you're willing to recompile or use a custom build. There are a lot of other settings and MSRs (Model Specific Registers) that we have yet to test. We track the progress of that effort in this issue. Public Alder Lake FSP Integration Guide documents how to set these settings On or Off, but there are few details about how they change the Processor behavior. The remaining 2% of performance will come from matching all these settings. On the public datasheet, there is no DC_LL for the 8+8 150W class, only 8+8 125W, but we can confirm from alternate sources that this is the correct value. \u21a9","title":"Miscellaneous Comments"},{"location":"guides/logo-customization/","text":"Boot logo replacement instructions Introduction The logo displayed at boot can be customized according to the client's preferences. For this, we have created a script that automates the process of replacing the logo. Prerequisites The image file must fulfill a number of requirements: Bitmap (BMP file) Recommended resolution up to 577\u00d7432, but can be higher if it fits in the BOOTSPLASH region. indexed or 24bit RGB colors uncompressed preferably containing a simple logo on a black background with no additional padding. make sure it is properly formatted. To be sure, use the command: convert -background None custom_logo.bmp BMP3:logo.bmp Replace logo in an existing image For devices supporting persistent bootlogo, it's possible to replace the logo without rebuilding firmware from scratch. You only need the firmware image and cbfstool . Obtain cbfstool source code (skip if you've already cloned the coreboot source): git clone https://github.com/Dasharo/coreboot.git Build and install cbfstool: cd coreboot/util/cbfstool git checkout 912a262b7bf7cb49544f90cdb5c632b658918893 make sudo make install Remove the existing logo from the firmware image (replace [path] with the path to your firmware binary): cbfstool [ path ] remove -r BOOTSPLASH -n logo.bmp Add your desired bootlogo to the firmware image (replace [path] with the path to your firmware image and [logo] with the path to the logo): cbfstool [ path ] add -f [ logo ] -r BOOTSPLASH -n logo.bmp -t raw -c lzma Now you can flash the updated firmware image as usual. If you're not updating firmware and just changing the logo, only the BOOTSPLASH region needs to be updated. For example: sudo flashrom -p internal --fmap -i BOOTSPLASH -w [ path ]","title":"Logo customization"},{"location":"guides/logo-customization/#boot-logo-replacement-instructions","text":"","title":"Boot logo replacement instructions"},{"location":"guides/logo-customization/#introduction","text":"The logo displayed at boot can be customized according to the client's preferences. For this, we have created a script that automates the process of replacing the logo.","title":"Introduction"},{"location":"guides/logo-customization/#prerequisites","text":"The image file must fulfill a number of requirements: Bitmap (BMP file) Recommended resolution up to 577\u00d7432, but can be higher if it fits in the BOOTSPLASH region. indexed or 24bit RGB colors uncompressed preferably containing a simple logo on a black background with no additional padding. make sure it is properly formatted. To be sure, use the command: convert -background None custom_logo.bmp BMP3:logo.bmp","title":"Prerequisites"},{"location":"guides/logo-customization/#replace-logo-in-an-existing-image","text":"For devices supporting persistent bootlogo, it's possible to replace the logo without rebuilding firmware from scratch. You only need the firmware image and cbfstool . Obtain cbfstool source code (skip if you've already cloned the coreboot source): git clone https://github.com/Dasharo/coreboot.git Build and install cbfstool: cd coreboot/util/cbfstool git checkout 912a262b7bf7cb49544f90cdb5c632b658918893 make sudo make install Remove the existing logo from the firmware image (replace [path] with the path to your firmware binary): cbfstool [ path ] remove -r BOOTSPLASH -n logo.bmp Add your desired bootlogo to the firmware image (replace [path] with the path to your firmware image and [logo] with the path to the logo): cbfstool [ path ] add -f [ logo ] -r BOOTSPLASH -n logo.bmp -t raw -c lzma Now you can flash the updated firmware image as usual. If you're not updating firmware and just changing the logo, only the BOOTSPLASH region needs to be updated. For example: sudo flashrom -p internal --fmap -i BOOTSPLASH -w [ path ]","title":"Replace logo in an existing image"},{"location":"guides/vboot-signing/","text":"Dasharo vboot signing Introduction Verified Boot is a method of verifying that the firmware compents haven't been tampered with. It uses cryptographic signatures to determine whether the firmware comes from trusted source. This document covers the procedure for generating vboot keys and configuring the coreboot build system to sign the binaries with the generated keys. Prerequisites Functional Docker installation follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Clone dasharo-tools repository git clone https://github.com/Dasharo/dasharo-tools.git Generating keys Make sure that you are in the dasharo-tools repository Generate the keys with the following command: ./vboot/generate_keys keys The keys will be created in the directory $PWD/keys , i.e. in the keys subdirectory in your current directory. Signing image without rebuilding This is the default procedure that should be followed by users downloading firmware from the Release section, who wishes to use their own keys for vboot. Make sure that you are in the dasharo-tools repository Be sure you have generated the keys as in Generate keys section. Assuming you have generated keys to the keys/ directory: ./vboot/resign keys For example: ./vboot/resign protectli_vault_cml_v1.0.16_resigned.rom keys The successful output can look like this: ... INFO: sign_bios_at_end: BIOS image does not have FW_MAIN_B. Signing only FW_MAIN_A - import root_key from /.../keys/root_key.vbpubk: success - import recovery_key from /.../keys/recovery_key.vbpubk: success successfully saved new image to: /.../protectli_vault_cml_v1.0.16_resigned.rom The /.../protectli_vault_cml_v1.0.16.rom was resigned and saved as: /.../protectli_vault_cml_v1.0.16_resigned.rom Now the image will be signed with your own keys. Be sure to save the keys in a safe location, because you will need them to sign each firmware update. Otherwise, the firmware updates to RW partitions will not be executed by vboot. Adding keys to the coreboot config This procedure is only meant for developers or when you are rebuilding firmware by yourself. In the root of the coreboot tree, execute the following command: make nconfig Navigate to Security -> Verified Boot (vboot) -> Vboot keys and enter the paths to the keys in the appropriate fields. Exit nconfig by pressing Esc repeatedly and pressing Enter when prompted to save the configuration. Now, rebuild coreboot with this config to generate images signed with the chosen vboot keys.","title":"Firmware signing for vboot"},{"location":"guides/vboot-signing/#dasharo-vboot-signing","text":"","title":"Dasharo vboot signing"},{"location":"guides/vboot-signing/#introduction","text":"Verified Boot is a method of verifying that the firmware compents haven't been tampered with. It uses cryptographic signatures to determine whether the firmware comes from trusted source. This document covers the procedure for generating vboot keys and configuring the coreboot build system to sign the binaries with the generated keys.","title":"Introduction"},{"location":"guides/vboot-signing/#prerequisites","text":"Functional Docker installation follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Clone dasharo-tools repository git clone https://github.com/Dasharo/dasharo-tools.git","title":"Prerequisites"},{"location":"guides/vboot-signing/#generating-keys","text":"Make sure that you are in the dasharo-tools repository Generate the keys with the following command: ./vboot/generate_keys keys The keys will be created in the directory $PWD/keys , i.e. in the keys subdirectory in your current directory.","title":"Generating keys"},{"location":"guides/vboot-signing/#signing-image-without-rebuilding","text":"This is the default procedure that should be followed by users downloading firmware from the Release section, who wishes to use their own keys for vboot. Make sure that you are in the dasharo-tools repository Be sure you have generated the keys as in Generate keys section. Assuming you have generated keys to the keys/ directory: ./vboot/resign keys For example: ./vboot/resign protectli_vault_cml_v1.0.16_resigned.rom keys The successful output can look like this: ... INFO: sign_bios_at_end: BIOS image does not have FW_MAIN_B. Signing only FW_MAIN_A - import root_key from /.../keys/root_key.vbpubk: success - import recovery_key from /.../keys/recovery_key.vbpubk: success successfully saved new image to: /.../protectli_vault_cml_v1.0.16_resigned.rom The /.../protectli_vault_cml_v1.0.16.rom was resigned and saved as: /.../protectli_vault_cml_v1.0.16_resigned.rom Now the image will be signed with your own keys. Be sure to save the keys in a safe location, because you will need them to sign each firmware update. Otherwise, the firmware updates to RW partitions will not be executed by vboot.","title":"Signing image without rebuilding"},{"location":"guides/vboot-signing/#adding-keys-to-the-coreboot-config","text":"This procedure is only meant for developers or when you are rebuilding firmware by yourself. In the root of the coreboot tree, execute the following command: make nconfig Navigate to Security -> Verified Boot (vboot) -> Vboot keys and enter the paths to the keys in the appropriate fields. Exit nconfig by pressing Esc repeatedly and pressing Enter when prompted to save the configuration. Now, rebuild coreboot with this config to generate images signed with the chosen vboot keys.","title":"Adding keys to the coreboot config"},{"location":"osf-trivia-list/dasharo/","text":"Frequenty Asked Questions about Dasharo What is Dasharo? Dasharo is registered trademark and product developed by 3mdeb . Dasharo is an open-source firmware distribution focusing on: carefully selected hardware platforms , zero-touch initial deployment , clean and simple code , long-term maintenance , professional support , transparent validation , extensive and structured documentation , privacy-respecting implementation , liberty for the owners and trustworthiness for all . Dasharo consists of productized services , set of open-source repositories , and quality control which help to provide scalable, modular, easy to combine open-source BIOS, UEFI, and firmware solutions. It offers the components that are needed to develop and maintain a high quality, and modular firmware, for the stability and security of your platform. For individuals Dasharo provides optional features in subscription model called Supporters Entrance . Why 3mdeb created Dasharo? 3mdeb created Dasharo to establish a recognized brand with a proven history of successful firmware integrations. Dasharo aims to deliver added value to customers and the community as an open-source firmware distribution, such as transparent validation, long-term maintenance, bleeding-edge integration for modern hardware, and other products requested by the community and customers. 3mdeb has been providing services related to open-source firmware for years and has been asked multiple times by various parties to create a recognized brand. Therefore, the creation of Dasharo was a move to fulfill that need and establish a marketing vehicle to deliver value to customers. In addition, 3mdeb plans to provide a camp for all coreboot refugees, including platforms moved to branches due to the need for code evolution, such as Intel Intel Quark SoC deprecation and LEGACY_SMP_INIT & RESOURCE_ALLOCATOR_V3 . We want to provide solutions for those requiring long-term maintenance and firmware support. More elaborate explanation of our position you can find below . Dasharo typically supports fully open platforms like Raptor Computing Systems Talos II family, ASUS KGPE-D16 , and other which are not as open but provide modern computing experience, such as MSI PRO Z690-A DDR4/DDR5 . The goal is to provide a reliable, secure, and scalable firmware solution for a wide range of platforms and applications, aligning with the vision of a new golden age of computing advocated by experts in computer architecture. What Dasharo provides? Dasharo has 10 rules that govern the production and release of firmware within its ecosystem. Dasharo rules define what we deliver with every release. These rules are: Every release of firmware produced by Dasharo Ecosystem must contain source code , binary, SHA256 hash, and Dasharo cryptographic signature of that hash. Dasharo Universe contains structured documentation for key activities related to open-source firmware life-cycle: initial deployment, update and recovery. Cryptographic keys hierarchy should be followed: CEO/Founder (GPG fingerint: E030 9B2D 85A6 7E84 6329 E34B B2EE 71E9 67AA 9E4C ) which signs 3mdeb Master Key (GPG fingerint: 1B57 85C2 965D 84CF 85D1 652B 4AFD 81D9 7BD3 7C54 ) which signs 3mdeb Dasharo Master Key (GPG fingerint: 0D5F 6F1D A800 329E B7C5 97A2 ABE1 D0BC 6627 8008 ) which signs Customer Open Source Firmware Release x.y Signing Key (e.g. Novacustom Open Source Firmware Release 1.0 Signing Key) or dedicated 3mdeb keys to given platform. Keys can be found in 3mdeb-secpack repository. Every release of firmware produced by Dasharo Ecosystem must have an attached test report according to requirements. Every test should be described by test specification documentation. Customer-specific Dasharo validation procedures are delivered with the release notes directly to the customer and does not have to be publicly available. Every firmware produced by Dasharo Ecosystem use Semantic Versioning 2.0.0 compatible versioning scheme. For details please check description . Every firmware produced by Dasharo Ecosystem should use Keep A Changelog 1.0.0 compatible scheme as changelog format. Every Dasharo firmware release should be delivered with integrity and signature verification procedures. Every Dasharo firmware release must contain a detailed description of components and links to the range of code changes since the last release. Dasharo Ecosystem uses open-source software to create and maintain its firmware solutions, and the company strives to maintain transparency in its processes and procedures. These 10 rules are designed to ensure that every release of firmware produced by Dasharo Ecosystem is reliable, secure, and meets the needs of customers and the community. By following these rules, Dasharo Ecosystem provides a consistent and high-quality firmware solution for a wide range of platforms and applications. What is Dasharo binary blob policy? Modern x86 platforms' firmware requires closed source blobs to be integrated into the image to properly initialize the silicon. The ecosystem is shifting towards designs and technologies with a lot of small microcontrollers and intellectual property (IP) blocks specialized in a very thin range of tasks. Those microcontrollers and IP blocks typically require firmware blobs as well. Some of the blobs are clearly visible, some may be obfuscated and hidden inside the silicon or other firmware blobs (e.g. Intel Management Engine region contains multiple other blobs besides the ME firmware - more about Intel ME blob ). So Dasharo's binary blob policy is as follows: Integrate only the necessary amount of blobs required for proper platform operation and minimize the amount of blobs that are optional whenever possible by providing open equivalent implementations or removing them if there is no functional impact on the platform operation. Ultimately the blobs should be attested and properly documented. Dasharo Team is trying to achieve it by working on firmware SBOMs . Dasharo also works without blobs on platforms that allow that. For example, ASUS KGPE-D16 can run without any blobs (officially there is no PSP on that hardware, and Opteron 6200 series CPUs can run without microcode patches). There is also a libre, POWER9-based server/workstation Talos II by Raptor Computing Systems, which also do not use any binary blobs, however it is more expensive than x86 platforms. Why Dasharo? Open-source firmware ecosystem problems Every open-source project has its own internal dynamics, history and politics. We are always looking for a solution that endorse non-aggression principle and peaceful coexistence, which hopefully will allow everyone to compete based on the same rules. We believe that market is big enough for all players and, if not we should make market bigger, not fight for every possible piece causing collateral damage. Eventually, in the community, we are all human beings, including all our good and bad features. In some cases, sympathy and antipathy cause unexpected dynamics. This impacts every community. We also should be aware that the open-source ecosystem is a place of OPSEC and PSYWAR techniques use, which leads to redirecting energy and resources into directions that make open-source community activity less competitive. In our opinion, massive energy is wasted in the open-source firmware community because of incorrect focus, like religious flame wars about philosophical principles, security paranoia without having an idea of threat modeling, or revolutionary ideas and plans for how to overthrow multibillion-dollar industry overlords. Although we may enjoy discussion during Dasharo open-source firmware vPubs during everyday job would like to focus on delivering value to those who can vote by choosing open-source firmware/hardware/ISA based product to help change the computer industry. Overall there is no economy around open-source firmware, and nobody seems to care much about that. It impacts the upstreaming process, the number of contributors, and reviewers. There are huge players with their own interests, small open-source firmware vendors like 3mdeb and community members essentially working for free. Without middle-size companies standing behind open-source firmware-based products, not much will change. To fill the space between big players and small boutique dev companies, we have to have products with the volume on the market because the hardware market understands only sales volumes, nothing else. We want to work on changing the above paradigms or at least improve the state-of-the-art relation in the community to the level where threats will have a reasonably small impact. We believe that open-source firmware is a critical tool, which should be used consciously to ensure privacy and liberty. What is open-source firmware distribution? Dasharo is 3mdeb's firmware distribution and all its components are open-source. We provide releases in binary form. As you know in most cases on x86 for firmware to be useful it has to cooperate with closed blobs. In all binary releases we are making sure we provide information where all components are coming from. Dasharo works without blobs on platforms that allow that. When we are saying Dasharo open-source firmware distribution we mean code that is delivered by 3mdeb that is open-source. We have no influence on the code provided by 3rd parties (e.g. FSP, ME, GbE etc.). In coreboot community there was some controversy about calling Dasharo open-source firmware distribution (for details please check gerrit review ). We respect coreboot community opinion, so we agreed that in case of coreboot documentation it would be better to use open-source based firmware distribution. It doesn't mean we agree with that decision: Definitions and rules used in coreboot documentation review are not clear. Rules seem not to be applied equally to all contributors of coreboot distribution . Why Dasharo is not called coreboot firmware distribution? While the coreboot is now the default open-source framework for Dasharo, we do not want to limit Dasharo to one framework. We also expect another firmware frameworks to be a base for Dasharo, such as U-Boot , oreboot , Slim Bootloader , or pure EDK II . Moreover, coreboot is not enough in most cases for booting modern computer. Most Dasharo flavors are currently based on coreboot with EDK II payload, but we also have coreboot with skiboot/heads payload, and we expect more flavors to appear in the future. What value Dasharo provides in comparison to coreboot? Dasharo is open-source firmware distribution based on coreboot and other open-source firmware frameworks (e.g. Tianocore EDKII ), you can think about Dasharo and coreboot relation in the same way as you think about Debian/Ubuntu/RedHat and Linux. That means it can provide better cost-effectiveness, security, transparency and customizability than proprietary alternative. There are seven characterestics of Dasharo: carefully selected hardware platforms , zero-touch initial deployment , clean and simple code , long-term maintenance , professional support , transparent validation , extensive and structured documentation , privacy-respecting implementation , liberty for the owners , trustworthiness for all . Dasharo Zero-Touch Initial Deployment Documentation supported hardware provides information about initial deployment, updates and recovery procedures. Developed by Dasharo Team Dasharo Tools Suite (DTS) operating system supports users by automating the deployment process, which helps reducing errors and inconsistencies, and make sure the firmware can be further updated to new version without any problems. DTS also provides controlled and secure environment for initial deployment and update of firmware, reducing the risk of tampering or unauthorized changes. Dasharo Zero-Touch Initial Deployment is smooth, effortless and user-friendly process, which reduces user frustration and improves satisfaction. Use of DTS largely improves firmware adoption, hardware compatibility reporting and binary blobs transmission, as well as recovery. For more details about zero-touch initial deployment please read relevant DTS documentation . Dasharo Clean and Simple Code Dasharo is an open-source distribution project with a simple code structure described in detail here . While the project benefits from the simplicity of the coreboot source code, it is continuously researching and improving its development process and tools to provide a superior experience for developers. One example of this ongoing work is the improvements made to fork maintenance, currently being tracked in this issue on the Dasharo GitHub repository. The project also explores the concept of a bootstrapable toolchain, discussed in the build process section of the project documentation. Dasharo Long Term Maintenance We provide long term maintenance - coreboot community for various reasons, do not merge some patches, because of understaffing, lack of reviewers. Some changes have long way to upstream, we maintain those patches and make them work before those will go upstrea. If ever, we are committed to maintain platforms which are moved to branch in coreboot. Firmware update - we are registered consultants for fwupd/LVFS and enable customers and community platforms, so they can get seamless firmware update in Linux. Dasharo Professional Support Dasharo Support coming in form of three following packages: Dasharo Community Support (DCP) - donation driven development. Dasharo Support Package (DSP) - annual firmware support package. Dasharo Enterprise Package (DEP) - custom SLA, corporate and open roadmap alignment advisroy. The Dasharo Community Support Program is an open-source firmware support initiative that leverages the expertise of community members and developers to improve firmware solutions for a range of hardware models. Platforms in scope of the program should comply with Dasharo quality criteria, which we slowly gather in Dasharo Certification Program . 3mdeb supports and maintains DCP-approved firmware through Dasharo Support Package (DSP) and Dasharo Enterprise Package (DEP). These packages offer essential services like porting to new platforms, developing device drivers, debugging, and fixing bugs. Companies can rely on 3mdeb's expertise to ensure their systems remain secure, up-to-date, and reliable. If you are interested in our services please contact us here . Dasharo Transparent Validation We provide transparent validation results - coreboot in itself provide no guarantees around release quality and do not provide binary distribution (for reference please check coreboot project scope , we provide those in scope of validation we perform. Dasharo Trustworthiness for All We provide ready to use binaries with GPG based signing scheme that improve verification where firmware coming from. What are the differences between the official coreboot repository and the Dasharo repository? Dasharo focuses on specific platforms listed in supported hardware section of Dasharo Universe documentation. Dasharo repository contains release tags which are associated with Dasharo Certification Program providing certain quality criteria including test results. We always trying to minimize delta, but sometimes it can be up to 5k SLOC (or more I guess e.g. Talos II coreboot support). What is Dasharo Certification Program? The Dasharo Certification Program (DCP) is a highly specialized certification program that benchmarks open-source firmware ecosystem deliverables. The program ensures that firmware is stable, secure, and dependable while aligning with the Dasharo values. DCP encourages developers to create their version of Dasharo or contribute to the Dasharo project or coreboot upstream, enabling them to leverage the power of open-source development to create custom firmware tailored to their specific needs based on years of Dasharo quality assurance results. The program's rigorous certification process entails comprehensive testing in the Dasharo Certification Lab, ensuring that the firmware binary meets the strict standards established by the program. By aligning with the Dasharo values, the certification program improves the overall posture of the open-source firmware ecosystem, making it long-term maintainable, sustainable, and trustworthy and providing specific service level agreements and warranties to commercial customers and the community. What is DCP-approved firmware? The Dasharo-certified firmware provides long-term maintenance over ten years after the CPU microarchitecture release, which means that OEM, ODM, hardware vendors, and other companies can rely on the firmware for a long time without worrying about end-of-life issues. Moreover, DCP-approved firmware vendors must provide professional support channels to ensure that other business entities can rely on those channels for long-term support regarding firmware and software. The validation process for DCP firmware is transparent. Test results and bug reports are always publicly available, allowing the community to continually identify issues and improve the firmware. However, in case of a security embargo, the results can be kept under a strict but well-defined policy, ensuring the security of the firmware. Future work These future goals align with the values of privacy, liberty, and trustworthiness in the context of firmware development and the broader tech industry. We would like to implement following features as part of Dasharo Certification Program: Privacy-respecting implementation : By working on solutions that allow users to deactivate potentially malicious components, like ME or PSP, the firmware will respect user privacy and help mitigate data privacy concerns. This approach gives users more control over their devices and reduces the risk of unauthorized access or surveillance. Discussion and more detail in dedicated issue . Liberty for the owners : Respecting the liberty of hardware owners to repair and transfer ownership without risking the leak of personally identifiable data is crucial. This approach supports the right-to-repair movement and ensures that users maintain control over their personal information even when they modify or pass on their devices. Discussion and more detail in dedicated issue . Trustworthiness for all : By publishing known good measurements for each boot phase and storing those measurements in tamper-resistant mediums, such as TPM, during the boot process will increase security and confidence in the firmware. Users and other stakeholders can verify that the firmware executed during the boot process is genuine and uncompromised by making reference measurements publicly available. Discussion and more detail in dedicated issue . Why there is no AMD mainboard supported in Dasharo ? Unfortunately, from the perspective of a small open-source firmware vendor, it isn't easy to work with AMD. Despite our experience with AMD SoCs since 2016, we could not yet deliver Dasharo for a modern (Zen core-based) platform. We're trying hard, but Intel has a better ecosystem for open-source firmware development. The reason for that state may be because AMD is in a rush, and they are understaffed in all areas compared to their success. We've been doing AMD open-source firmware development for 6+ years, including our yearly reports of open-source firmware status at FOSDEM, but the level of support for small volume firmware development companies is not yet at the level of competition. AGESA distribution was a problem in the past, but we solved that, and Dasharo for AMD is possible. Because Dynamic Root of Trust can work without blob, we favor AMD, but we can't do anything without a partner who can sponsor the development effort. We are on the market of open-source firmware vendors, not hardware vendors. Can you port Dasharo to my mainboard? There are other versions of the same questions: Dasharo supports mainboard X; I have mainboard Y (or X'). Can you teach me how to port Dasharo to my mainboard? Can you help me port Dasharo to my mainboard? TL;DR: No, we can't. In Dasharo, we support only carefully selected targets. The answer to that question requires understanding many aspects of the open-source firmware business we learned over the years. The critical point is that we can't help to port arbitrary targets. Hardware has to be carefully selected to bring the most benefits to the open-source firmware community and improve the sustainability of the ecosystem. Random hardware porting lead to an unmaintainable stack of platforms that no one adapts in scale, which does not lead to market change in the correct direction. Lack of commercial adoption is part of coreboot problems as a project, and we would like to avoid this mistake. We have strict criteria based on various aspects explained in Dasharo Community Support section. Dasharo Team tries to select platforms with long-term availability potential. Because we are fully responsible for hardware that we enable in open-source firmware ecosystem, our releases have to pass the Dasharo Certification criteria. The whole effort is relatively expensive and, in most cases, not feasible for enabling one platform. That's why in most cases, our customers are OEM/ODM, angel investors, or communities that need reasonable quantities of hardware (>200pcs). If the board comes with variants with minimal differences required for support in an open-source firmware stack, and one of the variants is part of the Dasharo Support Package, Dasharo Enterprise Package, or Dasharo Community Support, there is a chance to put that hardware on the relevant roadmap. In such a case, don't hesitate to contact us; we will see what we can do. However, the community member who requested support for the platform should also offer their help in validating the firmware and maintenance. That kind of request will be more than welcome from active community members. New members should consider ways to help us to gain a reputation that can lead to influencing Dasharo Community Supported roadmap.","title":"Dasharo"},{"location":"osf-trivia-list/dasharo/#frequenty-asked-questions-about-dasharo","text":"","title":"Frequenty Asked Questions about Dasharo"},{"location":"osf-trivia-list/dasharo/#what-is-dasharo","text":"Dasharo is registered trademark and product developed by 3mdeb . Dasharo is an open-source firmware distribution focusing on: carefully selected hardware platforms , zero-touch initial deployment , clean and simple code , long-term maintenance , professional support , transparent validation , extensive and structured documentation , privacy-respecting implementation , liberty for the owners and trustworthiness for all . Dasharo consists of productized services , set of open-source repositories , and quality control which help to provide scalable, modular, easy to combine open-source BIOS, UEFI, and firmware solutions. It offers the components that are needed to develop and maintain a high quality, and modular firmware, for the stability and security of your platform. For individuals Dasharo provides optional features in subscription model called Supporters Entrance .","title":"What is Dasharo?"},{"location":"osf-trivia-list/dasharo/#why-3mdeb-created-dasharo","text":"3mdeb created Dasharo to establish a recognized brand with a proven history of successful firmware integrations. Dasharo aims to deliver added value to customers and the community as an open-source firmware distribution, such as transparent validation, long-term maintenance, bleeding-edge integration for modern hardware, and other products requested by the community and customers. 3mdeb has been providing services related to open-source firmware for years and has been asked multiple times by various parties to create a recognized brand. Therefore, the creation of Dasharo was a move to fulfill that need and establish a marketing vehicle to deliver value to customers. In addition, 3mdeb plans to provide a camp for all coreboot refugees, including platforms moved to branches due to the need for code evolution, such as Intel Intel Quark SoC deprecation and LEGACY_SMP_INIT & RESOURCE_ALLOCATOR_V3 . We want to provide solutions for those requiring long-term maintenance and firmware support. More elaborate explanation of our position you can find below . Dasharo typically supports fully open platforms like Raptor Computing Systems Talos II family, ASUS KGPE-D16 , and other which are not as open but provide modern computing experience, such as MSI PRO Z690-A DDR4/DDR5 . The goal is to provide a reliable, secure, and scalable firmware solution for a wide range of platforms and applications, aligning with the vision of a new golden age of computing advocated by experts in computer architecture.","title":"Why 3mdeb created Dasharo?"},{"location":"osf-trivia-list/dasharo/#what-dasharo-provides","text":"Dasharo has 10 rules that govern the production and release of firmware within its ecosystem. Dasharo rules define what we deliver with every release. These rules are: Every release of firmware produced by Dasharo Ecosystem must contain source code , binary, SHA256 hash, and Dasharo cryptographic signature of that hash. Dasharo Universe contains structured documentation for key activities related to open-source firmware life-cycle: initial deployment, update and recovery. Cryptographic keys hierarchy should be followed: CEO/Founder (GPG fingerint: E030 9B2D 85A6 7E84 6329 E34B B2EE 71E9 67AA 9E4C ) which signs 3mdeb Master Key (GPG fingerint: 1B57 85C2 965D 84CF 85D1 652B 4AFD 81D9 7BD3 7C54 ) which signs 3mdeb Dasharo Master Key (GPG fingerint: 0D5F 6F1D A800 329E B7C5 97A2 ABE1 D0BC 6627 8008 ) which signs Customer Open Source Firmware Release x.y Signing Key (e.g. Novacustom Open Source Firmware Release 1.0 Signing Key) or dedicated 3mdeb keys to given platform. Keys can be found in 3mdeb-secpack repository. Every release of firmware produced by Dasharo Ecosystem must have an attached test report according to requirements. Every test should be described by test specification documentation. Customer-specific Dasharo validation procedures are delivered with the release notes directly to the customer and does not have to be publicly available. Every firmware produced by Dasharo Ecosystem use Semantic Versioning 2.0.0 compatible versioning scheme. For details please check description . Every firmware produced by Dasharo Ecosystem should use Keep A Changelog 1.0.0 compatible scheme as changelog format. Every Dasharo firmware release should be delivered with integrity and signature verification procedures. Every Dasharo firmware release must contain a detailed description of components and links to the range of code changes since the last release. Dasharo Ecosystem uses open-source software to create and maintain its firmware solutions, and the company strives to maintain transparency in its processes and procedures. These 10 rules are designed to ensure that every release of firmware produced by Dasharo Ecosystem is reliable, secure, and meets the needs of customers and the community. By following these rules, Dasharo Ecosystem provides a consistent and high-quality firmware solution for a wide range of platforms and applications.","title":"What Dasharo provides?"},{"location":"osf-trivia-list/dasharo/#what-is-dasharo-binary-blob-policy","text":"Modern x86 platforms' firmware requires closed source blobs to be integrated into the image to properly initialize the silicon. The ecosystem is shifting towards designs and technologies with a lot of small microcontrollers and intellectual property (IP) blocks specialized in a very thin range of tasks. Those microcontrollers and IP blocks typically require firmware blobs as well. Some of the blobs are clearly visible, some may be obfuscated and hidden inside the silicon or other firmware blobs (e.g. Intel Management Engine region contains multiple other blobs besides the ME firmware - more about Intel ME blob ). So Dasharo's binary blob policy is as follows: Integrate only the necessary amount of blobs required for proper platform operation and minimize the amount of blobs that are optional whenever possible by providing open equivalent implementations or removing them if there is no functional impact on the platform operation. Ultimately the blobs should be attested and properly documented. Dasharo Team is trying to achieve it by working on firmware SBOMs . Dasharo also works without blobs on platforms that allow that. For example, ASUS KGPE-D16 can run without any blobs (officially there is no PSP on that hardware, and Opteron 6200 series CPUs can run without microcode patches). There is also a libre, POWER9-based server/workstation Talos II by Raptor Computing Systems, which also do not use any binary blobs, however it is more expensive than x86 platforms.","title":"What is Dasharo binary blob policy?"},{"location":"osf-trivia-list/dasharo/#why-dasharo","text":"","title":"Why Dasharo?"},{"location":"osf-trivia-list/dasharo/#what-is-open-source-firmware-distribution","text":"Dasharo is 3mdeb's firmware distribution and all its components are open-source. We provide releases in binary form. As you know in most cases on x86 for firmware to be useful it has to cooperate with closed blobs. In all binary releases we are making sure we provide information where all components are coming from. Dasharo works without blobs on platforms that allow that. When we are saying Dasharo open-source firmware distribution we mean code that is delivered by 3mdeb that is open-source. We have no influence on the code provided by 3rd parties (e.g. FSP, ME, GbE etc.). In coreboot community there was some controversy about calling Dasharo open-source firmware distribution (for details please check gerrit review ). We respect coreboot community opinion, so we agreed that in case of coreboot documentation it would be better to use open-source based firmware distribution. It doesn't mean we agree with that decision: Definitions and rules used in coreboot documentation review are not clear. Rules seem not to be applied equally to all contributors of coreboot distribution .","title":"What is open-source firmware distribution?"},{"location":"osf-trivia-list/dasharo/#why-dasharo-is-not-called-coreboot-firmware-distribution","text":"While the coreboot is now the default open-source framework for Dasharo, we do not want to limit Dasharo to one framework. We also expect another firmware frameworks to be a base for Dasharo, such as U-Boot , oreboot , Slim Bootloader , or pure EDK II . Moreover, coreboot is not enough in most cases for booting modern computer. Most Dasharo flavors are currently based on coreboot with EDK II payload, but we also have coreboot with skiboot/heads payload, and we expect more flavors to appear in the future.","title":"Why Dasharo is not called coreboot firmware distribution?"},{"location":"osf-trivia-list/dasharo/#what-value-dasharo-provides-in-comparison-to-coreboot","text":"Dasharo is open-source firmware distribution based on coreboot and other open-source firmware frameworks (e.g. Tianocore EDKII ), you can think about Dasharo and coreboot relation in the same way as you think about Debian/Ubuntu/RedHat and Linux. That means it can provide better cost-effectiveness, security, transparency and customizability than proprietary alternative. There are seven characterestics of Dasharo: carefully selected hardware platforms , zero-touch initial deployment , clean and simple code , long-term maintenance , professional support , transparent validation , extensive and structured documentation , privacy-respecting implementation , liberty for the owners , trustworthiness for all .","title":"What value Dasharo provides in comparison to coreboot?"},{"location":"osf-trivia-list/dasharo/#what-are-the-differences-between-the-official-coreboot-repository-and-the-dasharo-repository","text":"Dasharo focuses on specific platforms listed in supported hardware section of Dasharo Universe documentation. Dasharo repository contains release tags which are associated with Dasharo Certification Program providing certain quality criteria including test results. We always trying to minimize delta, but sometimes it can be up to 5k SLOC (or more I guess e.g. Talos II coreboot support).","title":"What are the differences between the official coreboot repository and the Dasharo repository?"},{"location":"osf-trivia-list/dasharo/#what-is-dasharo-certification-program","text":"The Dasharo Certification Program (DCP) is a highly specialized certification program that benchmarks open-source firmware ecosystem deliverables. The program ensures that firmware is stable, secure, and dependable while aligning with the Dasharo values. DCP encourages developers to create their version of Dasharo or contribute to the Dasharo project or coreboot upstream, enabling them to leverage the power of open-source development to create custom firmware tailored to their specific needs based on years of Dasharo quality assurance results. The program's rigorous certification process entails comprehensive testing in the Dasharo Certification Lab, ensuring that the firmware binary meets the strict standards established by the program. By aligning with the Dasharo values, the certification program improves the overall posture of the open-source firmware ecosystem, making it long-term maintainable, sustainable, and trustworthy and providing specific service level agreements and warranties to commercial customers and the community.","title":"What is Dasharo Certification Program?"},{"location":"osf-trivia-list/dasharo/#what-is-dcp-approved-firmware","text":"The Dasharo-certified firmware provides long-term maintenance over ten years after the CPU microarchitecture release, which means that OEM, ODM, hardware vendors, and other companies can rely on the firmware for a long time without worrying about end-of-life issues. Moreover, DCP-approved firmware vendors must provide professional support channels to ensure that other business entities can rely on those channels for long-term support regarding firmware and software. The validation process for DCP firmware is transparent. Test results and bug reports are always publicly available, allowing the community to continually identify issues and improve the firmware. However, in case of a security embargo, the results can be kept under a strict but well-defined policy, ensuring the security of the firmware.","title":"What is DCP-approved firmware?"},{"location":"osf-trivia-list/dasharo/#why-there-is-no-amd-mainboard-supported-in-dasharo","text":"Unfortunately, from the perspective of a small open-source firmware vendor, it isn't easy to work with AMD. Despite our experience with AMD SoCs since 2016, we could not yet deliver Dasharo for a modern (Zen core-based) platform. We're trying hard, but Intel has a better ecosystem for open-source firmware development. The reason for that state may be because AMD is in a rush, and they are understaffed in all areas compared to their success. We've been doing AMD open-source firmware development for 6+ years, including our yearly reports of open-source firmware status at FOSDEM, but the level of support for small volume firmware development companies is not yet at the level of competition. AGESA distribution was a problem in the past, but we solved that, and Dasharo for AMD is possible. Because Dynamic Root of Trust can work without blob, we favor AMD, but we can't do anything without a partner who can sponsor the development effort. We are on the market of open-source firmware vendors, not hardware vendors.","title":"Why there is no AMD mainboard supported in Dasharo ?"},{"location":"osf-trivia-list/dasharo/#can-you-port-dasharo-to-my-mainboard","text":"There are other versions of the same questions: Dasharo supports mainboard X; I have mainboard Y (or X'). Can you teach me how to port Dasharo to my mainboard? Can you help me port Dasharo to my mainboard? TL;DR: No, we can't. In Dasharo, we support only carefully selected targets. The answer to that question requires understanding many aspects of the open-source firmware business we learned over the years. The critical point is that we can't help to port arbitrary targets. Hardware has to be carefully selected to bring the most benefits to the open-source firmware community and improve the sustainability of the ecosystem. Random hardware porting lead to an unmaintainable stack of platforms that no one adapts in scale, which does not lead to market change in the correct direction. Lack of commercial adoption is part of coreboot problems as a project, and we would like to avoid this mistake. We have strict criteria based on various aspects explained in Dasharo Community Support section. Dasharo Team tries to select platforms with long-term availability potential. Because we are fully responsible for hardware that we enable in open-source firmware ecosystem, our releases have to pass the Dasharo Certification criteria. The whole effort is relatively expensive and, in most cases, not feasible for enabling one platform. That's why in most cases, our customers are OEM/ODM, angel investors, or communities that need reasonable quantities of hardware (>200pcs). If the board comes with variants with minimal differences required for support in an open-source firmware stack, and one of the variants is part of the Dasharo Support Package, Dasharo Enterprise Package, or Dasharo Community Support, there is a chance to put that hardware on the relevant roadmap. In such a case, don't hesitate to contact us; we will see what we can do. However, the community member who requested support for the platform should also offer their help in validating the firmware and maintenance. That kind of request will be more than welcome from active community members. New members should consider ways to help us to gain a reputation that can lead to influencing Dasharo Community Supported roadmap.","title":"Can you port Dasharo to my mainboard?"},{"location":"osf-trivia-list/deployment/","text":"Deployment Deployment section of Dasharo Knowledge Base FAQ considers topic of open-source firmware deployment, which may include operations of reading and writing SPI NOR flash, as well as binary modifications. If you can't find the answer to your questions feel free to contact us through Community Channels or submit issue through Dasharo Github . Flashrom Following sections explain how to deal with most common flashrom problem. How to install flashrom ? Install flashrom v1.1 or newer with your distribution's package manager if you don't have it installed yet. If your distro doesn't provide flashrom or provides an outdated one, you can build it yourself using this instruction . Or compile recent version of flashrom: sudo apt install libpci-dev libftdi-dev libusb-1.0-0-dev git clone https://github.com/flashrom/flashrom.git cd flashrom sudo make install Perform dry run to detect the problems early Most of the problems can be detected early and avoided without attempting to flash the firmware. You may check for most of the errors described here by doing a dry run (not passing any firmware binary): sudo flashrom -p internal In below sections there are example errors that you may find in the output of above command. Could not get I/O privileges (Operation not permitted) If you see a flashrom error like this: ERROR: Could not get I/O privileges (Operation not permitted). You need to be root. Error: Programmer initialization failed. It means you have insufficient privileges to perform initialization. Please use sudo before flashrom command. /dev/mem mmap failed: Operation not permitted /dev/mem mmap failed: Operation not permitted FAILED! FATAL ERROR! Error: Programmer initialization failed. Linux kernel restricts access to IOMEM. To fix that add iomem=relaxed to the kernel command line. Recommended way to fix the problem: Edit /etc/default/grub : GRUB_CMDLINE_LINUX = \"iomem=relaxed\" Update GRUB2 config with: sudo update-grub2 Alternatively, if previous command doesn't work: sudo grub-mkconfig -o /boot/grub/grub.cfg Reboot and try flashrom command again Other method: Edit grub.cfg in /boot/grub/ : linux /boot/vmlinuz-4.15.0-115-generic ro quiet iomem = relaxed Reboot and try flashrom command again Last resort you can try to modify boot option runtime. YMMV: If your computer uses BIOS for booting, then hold down the Shift , or if your computer uses UEFI for booting, press Esc several times, while GRUB is loading to get the boot menu. And, after getting a GRUB menu, press E on a boot entry to append iomem=relaxed to kernel command line and press Ctrl + X or F10 to boot. Although this setting is temporary and will last only during the next boot, this way is faster and a customer doesn't need to re-generate anything. Please note having it as a temporary setting maybe is slightly better for security (there's a reason why it's disabled by default) . If the above does not resolve the problem, the kernel may be compiled with strict devmem, which prohibits accessing the IOMEM. You should then take different Linux system. Transaction error between offset ... ? SPI Configuration is locked down. FREG0: Flash Descriptor region (0x00000000-0x00000fff) is read-only. FREG2: Management Engine region (0x00005000-0x005fffff) is locked. Not all flash regions are freely accessible by flashrom. This is most likely due to an active ME. Please see https://flashrom.org/ME for details. At least some flash regions are read protected. You have to use a flash layout and include only accessible regions. For write operations, you'll additionally need the --noverify-all switch. See manpage for more details. Enabling hardware sequencing due to multiple flash chips detected. OK. Found Programmer flash chip \"Opaque flash chip\" (12288 kB, Programmer-specific) mapped at physical address 0x0000000000000000. Reading flash... Transaction error between offset 0x00005000 and 0x0000503f (= 0x00005000 + 63)! Read operation failed! FAILED. Most probably it means problem lays in ME not allowing to read its region. One of the method to mitigate the issues is to put ME in Manufacturing Mode. Such operation depends on ME version, SPI flash layout and platform design. Detail information you should find in sections dedicated to given hardware. To access documentation for supported hardware please go to Hardware Compatibility List . Please note we consider further mitigations in Dasharo Roadmap . WARNING: No chipset found If you see the following in the flashrom output: WARNING: No chipset found. Flash detection will most likely fail. No EEPROM/flash device found. Note: flashrom can never write if the flash chip isn't found automatically. that means your flashrom version is incorrect. Follow the procedure for building the right flashrom is described in Build flashrom section in the Initial deployment documentation . Chip write protection enabled If you see anything like this in the flashrom output (or similar, the hex number may differ): PR0: Warning: 0x001c0000-0x01ffffff is read-only. That means you did not disable BIOS boot medium lock correctly. GO back to firmware setup and disable the option as described in Prerequisites . Flashrom update procedure containing --ifd -i bios parameters will fails if you do not disable the protection. The procedure using the --fmap -i RW_SECTION_A -i RW_SECTION_B parameters is not affected. Warning: BIOS region SMM protection is enabled! If you see anything like this in the flashrom output (or similar, the hex number may differ): Warning: BIOS region SMM protection is enabled! Warning: Setting Bios Control at 0xdc from 0xaa to 0x89 failed. New value is 0xaa. Any attempt to flash the firmware will fail. That means you did not disable Enable SMM BIOS write protection option correctly. Go back to firmware setup and disable the option as described in Prerequisites . How to use flashrom to backup vendor BIOS? It is always a good idea to backup the original BIOS of your hardware, before switching to open-source firmware. Boot Dasharo Tools Suite Choose option 9) Shell. Read content of SPI NOR flash: flashrom -p internal -r bios_backup_`date +%Y%m%d`.bin flashrom v1.2-551-gf47ff31 on Linux 5.10.0-9-amd64 (x86_64) flashrom is free software, get the source code at https://flashrom.org Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns). Found chipset \"Intel Q77\". Enabling flash write... SPI Configuration is locked down. The Flash Descriptor Override Strap-Pin is set. Restrictions implied by the Master Section of the flash descriptor are NOT in effect. Please note that Protected Range (PR) restrictions still apply. Enabling hardware sequencing due to multiple flash chips detected. OK. Found Programmer flash chip \"Opaque flash chip\" (12288 kB, Programmer-specific) mapped at physical address 0x0000000000000000. Reading flash... done. If you face any issues, please refer to the troubleshooting section for hardware platform.","title":"Deployment"},{"location":"osf-trivia-list/deployment/#deployment","text":"Deployment section of Dasharo Knowledge Base FAQ considers topic of open-source firmware deployment, which may include operations of reading and writing SPI NOR flash, as well as binary modifications. If you can't find the answer to your questions feel free to contact us through Community Channels or submit issue through Dasharo Github .","title":"Deployment"},{"location":"osf-trivia-list/deployment/#flashrom","text":"Following sections explain how to deal with most common flashrom problem.","title":"Flashrom"},{"location":"osf-trivia-list/deployment/#how-to-use-flashrom-to-backup-vendor-bios","text":"It is always a good idea to backup the original BIOS of your hardware, before switching to open-source firmware. Boot Dasharo Tools Suite Choose option 9) Shell. Read content of SPI NOR flash: flashrom -p internal -r bios_backup_`date +%Y%m%d`.bin flashrom v1.2-551-gf47ff31 on Linux 5.10.0-9-amd64 (x86_64) flashrom is free software, get the source code at https://flashrom.org Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns). Found chipset \"Intel Q77\". Enabling flash write... SPI Configuration is locked down. The Flash Descriptor Override Strap-Pin is set. Restrictions implied by the Master Section of the flash descriptor are NOT in effect. Please note that Protected Range (PR) restrictions still apply. Enabling hardware sequencing due to multiple flash chips detected. OK. Found Programmer flash chip \"Opaque flash chip\" (12288 kB, Programmer-specific) mapped at physical address 0x0000000000000000. Reading flash... done. If you face any issues, please refer to the troubleshooting section for hardware platform.","title":"How to use flashrom to backup vendor BIOS?"},{"location":"osf-trivia-list/dts/","text":"Dasharo Tools Suite What is Dasharo Tools Suite Supporters Entrance Dasharo Tools Suite Supporters Entrance (DTS SE) is an extended version of DTS provided to Dasharo Supporters via the Supporters Entrance subscription . DTS is like a swiss army knife for Dasharo firmware: you can execute initial deployment, firmware update and even dump machine logs for debugging and development support. But with SE you could get updates for your own, customized build configurations. How to get Dasharo Tools Suite Supporters Entrance? DTS SE is available only to Dasharo Supporters for personal use. Commercial use of DTS SE should be discussed directly with 3mdeb or Dasharo Team . In general there are three ways to support us: I have more time than money and I can code Please help us develop Dasharo influence on open-source firmware market and spread the word about it. There are multiple ways to do that: Join Dasharo Matrix Community and support other members of community Join Dasharo open-source firmware vPub or other related event organized by 3mdeb or Dasharo Team. Write a Google review Follow us on social media and help spreading the word about Dasharo. Contribute documentation, test results, Dasharo Hardware Compatibility List Reports To get access to DTS SE you should contact 3mdeb or Dasharo Team and prove your contribution regarding above areas of support and influence. If it would be meaningful we would be glad to give you access to DTS SE for a year. I have more time than money and I can't code Please contribute ideas for new features, review documentation and help testing bug fixes. If you would like to pursue that path please contact us on Dasharo - General Matrix channel to agree on scope of contribution to avoid any potential collision with other developers. To get access to DTS SE you should contact 3mdeb or Dasharo Team with links to your contribution and we would be glad to provide one year of DTS SE updates. I have more money than time Please donate using one of available methods and contact 3mdeb or Dasharo Team to let us know about your donation. Minimal donating to access DTS SE with one year update support is 60EUR.","title":"Dasharo Tools Suite"},{"location":"osf-trivia-list/dts/#dasharo-tools-suite","text":"","title":"Dasharo Tools Suite"},{"location":"osf-trivia-list/dts/#what-is-dasharo-tools-suite-supporters-entrance","text":"Dasharo Tools Suite Supporters Entrance (DTS SE) is an extended version of DTS provided to Dasharo Supporters via the Supporters Entrance subscription . DTS is like a swiss army knife for Dasharo firmware: you can execute initial deployment, firmware update and even dump machine logs for debugging and development support. But with SE you could get updates for your own, customized build configurations.","title":"What is Dasharo Tools Suite Supporters Entrance"},{"location":"osf-trivia-list/dts/#how-to-get-dasharo-tools-suite-supporters-entrance","text":"DTS SE is available only to Dasharo Supporters for personal use. Commercial use of DTS SE should be discussed directly with 3mdeb or Dasharo Team . In general there are three ways to support us:","title":"How to get Dasharo Tools Suite Supporters Entrance?"},{"location":"osf-trivia-list/introduction/","text":"Open Source Firmware Trivia Questions List (OSFTQL) Goal of following questions list is to provide answers to terribly trivial topics or questions that were asked and answered gazillion times. We believe to move forward with so limited resources we have to stop wasting community precious time on something we agree on, but move forward with discussion. Other role of this list is to create taxonomy of OSF trivia questions for community and Dasharo customers, to avoid repeating explanation of topics which most of community already agree on.","title":"Introduction"},{"location":"osf-trivia-list/introduction/#open-source-firmware-trivia-questions-list-osftql","text":"Goal of following questions list is to provide answers to terribly trivial topics or questions that were asked and answered gazillion times. We believe to move forward with so limited resources we have to stop wasting community precious time on something we agree on, but move forward with discussion. Other role of this list is to create taxonomy of OSF trivia questions for community and Dasharo customers, to avoid repeating explanation of topics which most of community already agree on.","title":"Open Source Firmware Trivia Questions List (OSFTQL)"},{"location":"osf-trivia-list/me/","text":"Introduction Until Nehalem (ME version 6) it was possible to remove ME firmware completely. Starting with Nehalem, ME firmware can't be completely removed. If ME firmware is missing, the PC will not boot at all Earlier ME versions left a 30 minute grace period for recovering from a bad flash, but this is no longer true Three methods to reduce ME's capabilities have been found: neutering , disabling and soft-disabling . Removing non-essential portions of the ME's firmware is commonly referred to as neutering ME Setting a bit in the Flash Descriptor which acts as a kill-switch which tells ME to hang after initialization is usually what we mean by disabling ME Neutering ME Neutralizing ME: removing non-essential portions of the ME's firmware Also called \"neutering\" Not initially designed by Intel Method discovered by Nicola Corna of the me_cleaner project Removes all modules other than those required for platform init Modules left in ME 6.0 - 10.x: ROMP , BUP Modules left in ME >= 11.x: rbe , kernel , syslib , bup , sometimes also mfs A neutered ME will initialize hardware, then throw an error due to missing firmware This sometimes results in power management issues Therefore it's not recommended in production without extensive testing Functions provided by ME will no longer be operational ME >= v11.x: Sometimes mfs also needs to be preserved. mfs is responsible for some of the hardware initialization. Why is it possible? The FPT is not signed, has just a checksum The partitions are individually signed The offset and size of each partition are saved in each FPT entry Source: Intel ME myths and reality, Igor Skochinsky & Nicola Corna Soft-disabling ME It's also possible to put ME into a soft-disabled state by sending a HECI SET_ME_DISABLE or HMRFPO_ENABLE message BIOS needs to send these messages ME will stay disabled until a corresponding ENABLE message is sent Functional ME firmware must be present Usually what the \"Disable ME\" option in some BIOSes does Also offered as an option when buying some laptops (e.g. Dell) HAP / AltMeDisable bit (aka disabling ME) Method discovered in 2017 by Positive Technologies. Initially introduced by Intel for government/intelligence purposes. Not even the US government trusts ME entirely! Also supported by the me_cleaner project Involves setting an undocumented, secret bit in the Flash Descriptor which acts as a kill-switch for the ME AltMeDisable on ME versions < 11.x HAP (High Assurance Platform) on ME versions >= 11.x Leaves ME in a stopped state, lets it shut down gracefully instead of erroring out - This can help prevent issues with power management that may arise from disabling the ME - Supported by some OEMs 3mdeb official statement Whenever it is possible 3mdeb try to minimize impact of (CS)ME/SPS/TXE or any other firmware residing on peripheral or built-in CPUs.","title":"Intel ME/CSME"},{"location":"osf-trivia-list/me/#introduction","text":"Until Nehalem (ME version 6) it was possible to remove ME firmware completely. Starting with Nehalem, ME firmware can't be completely removed. If ME firmware is missing, the PC will not boot at all Earlier ME versions left a 30 minute grace period for recovering from a bad flash, but this is no longer true Three methods to reduce ME's capabilities have been found: neutering , disabling and soft-disabling . Removing non-essential portions of the ME's firmware is commonly referred to as neutering ME Setting a bit in the Flash Descriptor which acts as a kill-switch which tells ME to hang after initialization is usually what we mean by disabling ME","title":"Introduction"},{"location":"osf-trivia-list/me/#neutering-me","text":"Neutralizing ME: removing non-essential portions of the ME's firmware Also called \"neutering\" Not initially designed by Intel Method discovered by Nicola Corna of the me_cleaner project Removes all modules other than those required for platform init Modules left in ME 6.0 - 10.x: ROMP , BUP Modules left in ME >= 11.x: rbe , kernel , syslib , bup , sometimes also mfs A neutered ME will initialize hardware, then throw an error due to missing firmware This sometimes results in power management issues Therefore it's not recommended in production without extensive testing Functions provided by ME will no longer be operational ME >= v11.x: Sometimes mfs also needs to be preserved. mfs is responsible for some of the hardware initialization.","title":"Neutering ME"},{"location":"osf-trivia-list/me/#why-is-it-possible","text":"The FPT is not signed, has just a checksum The partitions are individually signed The offset and size of each partition are saved in each FPT entry Source: Intel ME myths and reality, Igor Skochinsky & Nicola Corna","title":"Why is it possible?"},{"location":"osf-trivia-list/me/#soft-disabling-me","text":"It's also possible to put ME into a soft-disabled state by sending a HECI SET_ME_DISABLE or HMRFPO_ENABLE message BIOS needs to send these messages ME will stay disabled until a corresponding ENABLE message is sent Functional ME firmware must be present Usually what the \"Disable ME\" option in some BIOSes does Also offered as an option when buying some laptops (e.g. Dell)","title":"Soft-disabling ME"},{"location":"osf-trivia-list/me/#hap-altmedisable-bit-aka-disabling-me","text":"Method discovered in 2017 by Positive Technologies. Initially introduced by Intel for government/intelligence purposes. Not even the US government trusts ME entirely! Also supported by the me_cleaner project Involves setting an undocumented, secret bit in the Flash Descriptor which acts as a kill-switch for the ME AltMeDisable on ME versions < 11.x HAP (High Assurance Platform) on ME versions >= 11.x Leaves ME in a stopped state, lets it shut down gracefully instead of erroring out - This can help prevent issues with power management that may arise from disabling the ME - Supported by some OEMs","title":"HAP / AltMeDisable bit (aka disabling ME)"},{"location":"osf-trivia-list/me/#3mdeb-official-statement","text":"Whenever it is possible 3mdeb try to minimize impact of (CS)ME/SPS/TXE or any other firmware residing on peripheral or built-in CPUs.","title":"3mdeb official statement"},{"location":"osf-trolling-list/build_process/","text":"[OSFI001] Build process [OSFI0010] There is no healthy OSF without reproducible builds What are the reproducible builds? Reproducible Builds and a lot of its aspects is well explained on the linked website. Why are reproducible builds crucial OSF? This is because knowing hashes of firmware components, we can calculate expected TPM PCRs values. By knowing good PCR values and being able to predict further values after firmware update, we are gaining the following advantages: We can easily confirm if the firmware is valid by reading TPM PCRs and compare to reference integrity measures (RIM), RIM can be calculated by build exactly the same version of OSF. NOTE : Please note that depending on your threat model using TPM chip with closed source firmware implementation may lead to solution which is not trustworthy. Process of replying measurements provided in TPM Event Log is simpler because we can easily obtain software and confirm hashes used during PCR extension the process was valid and the same as produced by the software build process Looking for bugs by using bisection is easier since being able to build every commit of software in a reproducible manner give us confidence that there would be no change in behavior between 2 consecutive builds Consistent behavior for given hash can be confirmed by test results tied to given hash in that way users looking at test results may expect exactly the same behavior for firmware binaries with the same hash Long term maintenance should be easier if firmware build would be reproducible over a long time, because often happen some firmware land in industrial applications, e.g., robots, trains, smart city infrastructure, if the bug will be detected after a long time; it is important to have tools and be able to confirm the same binary can be generated in the future. If we know given toolchain reproduce binary bit by bit we are sure it also reproduces software/firmware behavior. In that light making small incremental improvement using a toolchain that gives reproducible results give us higher the chance that we will not introduce uncontrolled change in behavior and code the change will be reflected by the compilation process without affecting previous software behavior. [OSFI0011] Docker containers as build systems \"considered harmful.\" Docker containers for a couple of last years become the default method for providing reproducible runtime environment for software as well those started to be very useful for developers to transfer exact configuration for building given software stack. We wrote about the usefulness of Docker containers in embedded software development environment on 3mdeb blog . After a long time of using Docker containers for embedded software development and build environments we noticed problems for long time maintenance and reproducibility. coreboot-sdk problems The example can be coreboot-sdk used for building coreboot project . A good summary of the problem was provided by Thrilleratplay in guix-docker repo : Currently, the coreboot build environment, coreboot-sdk , uses a Debian docker base image. To install additional required packages, apt-get update must be run. The resulting Docker image is hosted in the Docker hub repository to be retrieved at any time in the future. However, at any time in the future, building the same docker file will generate a different image based on the latest packages used in apt-get. Over time, as packages are updated due to bug, security or feature improvements, the docker image's provenance in the docker hub repository becomes increasingly difficult, if not impossible, to audit and reproduce. Some more detailed notes related to coreboot-sdk issues are presented below. There is no meaningful versioning of SDK [1] - at some point, there was versioning 1.32-53, now switched to git SHA. Both seemed to have no meaning and were released at arbitrary points in time. The result is that it is hard to find which version of SDK works with the coreboot tree version. Validation of coreboot-sdk is not sufficient - for example, recently, python fixes were merged [2] , somehow this change passed all QA checks, but SeaBIOS use python (not python2 or python3) and all builds using this version of SDK that compile SeaBIOS fail. coreboot-sdk is based on moving target Debian sid. It is close to impossible to build the same Docker images at 2 different points in time. coreboot-sdk enforce given version of ACPI spec - this may not always be a good thing to use the most recent compiler and update code accordingly since it can easily break OSes. Why we care? Whenever we deliver code or service to community or customer, we provide build environment which, for the sake of quality user support, should be stable. CI pipelines rely on those containers. Replacing docker image in CI pipeline whenever something change defeat the purpose of having automation and increase maintenance cost significantly and increase maintenance cost significantly Requirements for OSF dev and build process Open-source firmware development and build environment SHOULD have: * meaningful release process * meaningful validation process, at least basic build system and dev env capabilities should be tested * meaningful revisions with a clear explanation of what software stack can be build with what version of dev and build system, a description should include side-spec compliance, e.g., ACPI, SMBIOS, UEFI, etc. * reproducible process that works across systems and in the long run * signature, so anyone can identify where build and dev env coming from and if it is trustworthy Ideas for solving the above issues Docker images are not reproducible - this is a known fact, and if we are extremely serious about stability, security and quality, we should stop using a not reproducible build environment. Of course, there is some work making Docker images reproducible, but it opens Pandora's box [3] of Yocto or Buildroot. Another path could be Nix or Guix, which is currently pursued in the community OSFW #guix-buildstack channel this is a private channel; feel free to ping anyone from 3mdeb Team to join. coreboot toolchain is built by its own build system, which would be hard to couple with Dockerfile or something else. Docker images can be signed using docker trust commands as described here . Other idea would be to use wget and dpkg -i for every needed package in Dockerfile that create base image for reproducible toolchain. Of course that means quite extensive dependency management, but maybe simplicity is worth the effort. It is also possible to maintain VMs per given coreboot (or other OSF) version. That may mean long term VM image compatibility issues as well as problems with making sure images would work with various hypervisor versions. It is even more complex if multiple OS should be supported. VMs also have quite big overhead in terms of performance I'm not tracking all activity in the community, so some claims may be plain wrong. Please let me know what I miss when I'm wrong.","title":"Firmware build process"},{"location":"osf-trolling-list/build_process/#osfi001-build-process","text":"","title":"[OSFI001] Build process"},{"location":"osf-trolling-list/build_process/#osfi0010-there-is-no-healthy-osf-without-reproducible-builds","text":"","title":"[OSFI0010] There is no healthy OSF without reproducible builds"},{"location":"osf-trolling-list/build_process/#osfi0011-docker-containers-as-build-systems-considered-harmful","text":"Docker containers for a couple of last years become the default method for providing reproducible runtime environment for software as well those started to be very useful for developers to transfer exact configuration for building given software stack. We wrote about the usefulness of Docker containers in embedded software development environment on 3mdeb blog . After a long time of using Docker containers for embedded software development and build environments we noticed problems for long time maintenance and reproducibility.","title":"[OSFI0011] Docker containers as build systems \"considered harmful.\""},{"location":"osf-trolling-list/jsm_documentation/","text":"Jira Service Management client procedure Dasharo Support Package If you are interested in starting cooperation using the Support Package, it is the perfect time to start. The Support Package will help us allocate resources and a secure timeline for your needs. To ensure that we can provide comprehensive assistance with your current products and future new developments, we encourage you to choose our new Support Package for more streamlined cooperation, guaranteed availability, and quick, on-time delivery. Why should you add requests to Jira Service Management? JSM allows you to easily keep track of the status of individual requests. Each new request you add means analysis and pricing of task execution. This conversation will take place on JSM. Progress on the request will also be reported using JSM. Before you raise your first request Remember to provide a list of email addresses of people that need access to the portal. It's required to prepare the organization, where requested people will automatically receive updates on the ticket statuses. How to add a request Raising requests using the portal To add a new request using the web service: Go to portal and select the project. Select a type of request and provide the required data. You can also add attachments by dragging and dropping them into any part of the web page, or by clicking the Browse button. When you are ready to send the request, click Send. Your request is created and awaits our response. Raising requests using email If you prefer raising a request using email, you can do this by sending a message to special email address generated for the project. The email address will be provided to you by separate message. Communication through the Jira Service Desk You can always add a comment to the request and attach files. You can do it directly from the JSM request page or using email simply by replying to the email thread. We'll also add comments, questions and quotations in the comment section. What happens after you raise a request We'll soon let you know about the cost and what solutions are proposed. You'll also receive information on which requests will be resolved in the next release. Process and request statuses The diagram below presents what the workflow of JSM requests looks like. Open - your request is created and visible for us, but we didn't start working on it yet. Analysis - our team is analyzing your request. We will soon let you know what will be the cost of resolving this request. Waiting for the client - your action is required to continue working on the request. Most of the time it will be: acceptance of the estimated effort need for additional clarification. Note that the request with this status is waiting for your response. Delaying a response will result with lack of progress being made on the request. Approved - you have accepted the cost, and we will soon start working to resolve the request. Rejected - you have rejected the cost of resolving the request, and we will not work on this request. In progress - we are actively working on the request. On hold - the progress on resolving the request has been paused, and the work may be resumed in the future. Closed - the request has been resolved, but there was no work to be done or work was stopped due to: the client's decision feasibility study showed 0% success rate other Done - the request is resolved, and work has been completed. Support budget After completing the requests, you'll receive information about the state of your support budget by email (by default two times a month). SLAs Our team aims to provide the best support experience. We want you to always be up to date on the status of your request. We are doing our best to reply on your request in less that 36 hours.","title":"Jira Service Management"},{"location":"osf-trolling-list/jsm_documentation/#jira-service-management-client-procedure","text":"","title":"Jira Service Management client procedure"},{"location":"osf-trolling-list/jsm_documentation/#dasharo-support-package","text":"If you are interested in starting cooperation using the Support Package, it is the perfect time to start. The Support Package will help us allocate resources and a secure timeline for your needs. To ensure that we can provide comprehensive assistance with your current products and future new developments, we encourage you to choose our new Support Package for more streamlined cooperation, guaranteed availability, and quick, on-time delivery.","title":"Dasharo Support Package"},{"location":"osf-trolling-list/jsm_documentation/#why-should-you-add-requests-to-jira-service-management","text":"JSM allows you to easily keep track of the status of individual requests. Each new request you add means analysis and pricing of task execution. This conversation will take place on JSM. Progress on the request will also be reported using JSM.","title":"Why should you add requests to Jira Service Management?"},{"location":"osf-trolling-list/jsm_documentation/#before-you-raise-your-first-request","text":"Remember to provide a list of email addresses of people that need access to the portal. It's required to prepare the organization, where requested people will automatically receive updates on the ticket statuses.","title":"Before you raise your first request"},{"location":"osf-trolling-list/jsm_documentation/#how-to-add-a-request","text":"","title":"How to add a request"},{"location":"osf-trolling-list/jsm_documentation/#process-and-request-statuses","text":"The diagram below presents what the workflow of JSM requests looks like. Open - your request is created and visible for us, but we didn't start working on it yet. Analysis - our team is analyzing your request. We will soon let you know what will be the cost of resolving this request. Waiting for the client - your action is required to continue working on the request. Most of the time it will be: acceptance of the estimated effort need for additional clarification. Note that the request with this status is waiting for your response. Delaying a response will result with lack of progress being made on the request. Approved - you have accepted the cost, and we will soon start working to resolve the request. Rejected - you have rejected the cost of resolving the request, and we will not work on this request. In progress - we are actively working on the request. On hold - the progress on resolving the request has been paused, and the work may be resumed in the future. Closed - the request has been resolved, but there was no work to be done or work was stopped due to: the client's decision feasibility study showed 0% success rate other Done - the request is resolved, and work has been completed.","title":"Process and request statuses"},{"location":"osf-trolling-list/jsm_documentation/#support-budget","text":"After completing the requests, you'll receive information about the state of your support budget by email (by default two times a month).","title":"Support budget"},{"location":"osf-trolling-list/jsm_documentation/#slas","text":"Our team aims to provide the best support experience. We want you to always be up to date on the status of your request. We are doing our best to reply on your request in less that 36 hours.","title":"SLAs"},{"location":"osf-trolling-list/trusted_computing/","text":"[OSFI002] Trusted computing [OSFI0020] CRTM what it stand for? According to TCG Glossary v1.1 rev1.0 published in 2017 correct definition is: The instructions executed by the platform when it acts as the RTM. [Formerly described as \u201cCore Root of Trust for Measurement\u201d. Code Root of Trust for Measurement is the preferred expansion.] This acronym expansion is preferred. Not every one agree with that expansion of CRTM abbreviation. What do you think?","title":"Trusted Computing"},{"location":"osf-trolling-list/trusted_computing/#osfi002-trusted-computing","text":"","title":"[OSFI002] Trusted computing"},{"location":"osf-trolling-list/trusted_computing/#osfi0020-crtm-what-it-stand-for","text":"According to TCG Glossary v1.1 rev1.0 published in 2017 correct definition is: The instructions executed by the platform when it acts as the RTM. [Formerly described as \u201cCore Root of Trust for Measurement\u201d. Code Root of Trust for Measurement is the preferred expansion.] This acronym expansion is preferred. Not every one agree with that expansion of CRTM abbreviation. What do you think?","title":"[OSFI0020] CRTM what it stand for?"},{"location":"projects/trenchboot-aem-v2/","text":"Trenchboot as Anti Evil Maid Abstract As Qubes OS users, promoters, and developers, we understand how essential it is to be aware of the latest developments in maintaining the security of your favorite operating system. We're excited to share our plans to integrate the TrenchBoot Project into Qubes OS's new Anti-Evil Maid (AEM) implementation. As you may know, traditional firmware security measures like UEFI Secure Boot and measured boot, even with a Static Root of Trust (SRT), may only sometimes be enough to ensure a completely secure environment for your operating system. Compromised firmware may allow for the injection of malicious software into your system, making it difficult to detect. To overcome these limitations, many silicon vendors have started implementing Dynamic Root of Trust (DRT) technologies to establish a secure environment for operating system launch and integrity measurements. We're excited to take advantage of these advancements through integration with the TrenchBoot Project . The usage of DRT technologies like Intel Trusted Execution Technology (TXT) or AMD Secure Startup becomes more and more significant, for example, Dynamic Root of Trust for Measurement (DRTM) requirements of Microsoft Secured Core PCs . In open-source projects, DRTM hasn't found its place yet, but that gradually changes. The demand on having firmware independent Roots of Trust is increasing and projects that satisfy this demand are growing, for instance, TrenchBoot . TrenchBoot is a framework that allows individuals and projects to build security engines to perform launch integrity actions for their systems. The framework builds upon Boot Integrity Technologies (BITs) that establish one or more Roots of Trust (RoT) from which a degree of confidence that integrity actions were not subverted is derived. The project has grown a lot thanks to the previous NLnet NGI0 PET grant and now it looks for further expansion into extensive use of the DRT technologies in open-source and security-oriented operating systems like Qubes OS . Qubes OS Anti Evil Maid (AEM) software heavily depends on the availability of the DRTM technologies to prevent the Evil Maid attacks . However, the project hasn't evolved much since the beginning of 2018 and froze on the support of TPM 1.2 with Intel TXT in legacy boot mode (BIOS). This effectively limits the usage of this security software to older Intel machines only. TPM 1.2 implemented SHA1 hashing algorithm which is nowadays considered weak in the era of forever-increasing computer performance and quantum computing. The solution to this problem comes with a newer TPM 2.0 with more agile cryptographic algorithms and SHA256 implementation by default. Qubes OS AEM software suffers from the following: Lack of TPM 2.0 support to handle more secure hashes and safer design of the TPM firmware according to a newer specification. Qubes OS AEM has never supported any AMD processors with AMD Secure Startup technology. Implementing AMD support would make a huge impact and broaden the usage of DRTM technologies. The initial AEM implementation relied on the Trusted Boot project , Intel's reference implementation of Intel TXT. It had never any plans to support AMD processors. TrenchBoot is filling this gap supporting both Intel and AMD hardware which makes it an ideal target to replace Trusted Boot in Qubes OS AEM implementation. Furthermore, the project grant would be used to implement the missing pieces in the Qubes OS AEM software to cover the AMD and Intel support for both TPM 1.2 and TPM 2.0. Compare your own project with existing or historical efforts 3mdeb is a licensed provider for quality coreboot consulting services for 7 years. We are well-known in the open-source community for maintaining firmware of the PC Engines APU series platform for over 7-years. Delivering high-quality firmware releases each month and providing technical support on PC Engines and OPNSense forums. 3mdeb embedded systems developers are experienced engineers accustomed to operating systems development. Our developers have contributed to the fwupd support for Qubes OS . 3mdeb is also regularly co-organizing mini-conference events with Qubes OS maintainer Marek Marczykowski-G\u00f3recki where various topics related to Qubes OS security are discussed. Among them, the Anti Evil Maid was frequently presented by 3mdeb engineers: Anti Evil Maid for Intel coreboot-based platform Anti Evil Maid for modern AMD UEFI-based platform 3mdeb, with financial support from Qubes OS, developed a proof of concept replacing Trusted Boot with TrenchBoot on Intel hardware with TPM 1.2. Qubes OS and 3mdeb already tested a new solution with Qubes OS Anti Evil Maid, which is available for community use. The result of this solution can be seen in the published blog post that concludes the first phase of integrating TrenchBoot Anti Evil Maid for Qubes OS. The numbering of the next phases of the project will commence with number 2 in order to maintain consistency with the work already completed in phase 1 . The following application describes the remaining work required to have production quality adoption in one of the most popular secure operating system on the market. What are the significant technical challenges you expect to solve First of all Qubes OS AEM software consists of software packages providing Trusted Boot and the Qubes OS TPM scripts . These software packages would need to replace the Trusted Boot with TrenchBoot supported GRUB2 and Xen. Secondly, the TPM scripts require adding support for TPM 2.0 equivalent functionality. AEM requires access to non-volatile RAM inside TPM which is defined differently in the TPM 2.0 specification compared to TPM 1.2. Another challenge would be to update the TrenchBoot components for AMD platforms to the recent boot protocol, which will allow AMD platforms to take advantage of the QubesOS AEM feature, and TrenchBoot. Requested support Phase 2 - TPM 2.0 support in Qubes OS AEM (Intel hardware): Implement support for TPM 2.0 module in Xen Required to measure Dom0 kernel and initial ram disk before they are executed. Implement support for TPM 2.0 event log in Xen Required to log the Dom0 kernel and initial ram disk hashes to the TPM event log. The event log could be used for future system attestation. Implement parallel CPU cores bring-up for DRTM launch Currently the CPU cores are being woken up in parallel, but later they are hacked to be waiting in a queue. If any interrupt would come at that time, it could be a serious danger. It has to be fixed as soon as possible, as required by Intel TXT specification. Integrate TPM 2.0 software stack into Qubes OS Dom0 Extend the AEM scripts to detect TPM version on the platform While AEM fully supports TPM 1.2 there is no support for TPM 2.0 at all. When the TPM family is determined the script should use the appropriate software stack for given TPM. The task implements the AEM TPM 1.2 equivalent functionalities using TPM 2.0 software stack and as a result allowing the use of TPM 2.0 with Qubes OS AEM. It will require implementing the access to TPM 2.0 NVRAM, sealing and unsealing the secret data and generating TOTP. Extend the AEM scripts to use appropriate software stack for TPM 2.0 Currently, only TPM 1.2 is supported in Qubes OS AEM service code. The 3 items above will ensure the necessary software for TPM 2.0 is available and AEM scripts executed early from the initrd can detect which TPM family is present on the platform and use appropriate software stack and functions. TPM 1.2 and TPM 2.0 software stacks are not compatible so the scripts themselves must use proper API for given TPM and its respective software stack. Update Qubes OS AEM documentation Test the solution on Intel hardware with TPM 1.2 and 2.0 using legacy boot mode Phase 3 - Update to the newest TrenchBoot boot protocol: Code rebase onto the most recent work implementing Secure Launch protocol being upstreamed to Linux and GRUB The current state of TrenchBoot support has diverged with what was developed for QubesOS AEM for Intel hardware with TPM 1.2. The task aims to update the work and align with the TrenchBoot boot protocol being upstreamed to GRUB and Linux kernel. Xen shall take similar approach as Linux kernel in terms of DRTM launch. Test the solution on Intel hardware with TPM 1.2 and TPM 2.0 using legacy boot mode Phase 4 - AMD support for Qubes OS AEM with TrenchBoot: Update the Secure Kernel Loader (formerly LandingZone) package support for QubesOS Since the initial work done by 3mdeb engineers for AMD AEM in Qubes OS a lot of time has passed and Secure Kernel Loader - SKL (formerly Landing Zone) has improved a lot and added new features. SKL is an open-source module written by TrenchBoot developers required by AMD Secure Startup technology to perform DRTM launch. The task aims to refresh the previous work and update the SKL package for Qubes OS to the newest revision. TrenchBoot Secure Kernel Loader (SKL) improvements for AMD server CPUs with multiple nodes While SKL was extensively tested on System on Chip and single CPU platforms, it was not much tested on workstation/server segment CPUs which are more complex. For example one server CPU package may contain two independent CPUs inside called nodes. Each node will enable protection on the SKL during DRTM execution. This protection has to be disabled on each node when TrenchBoot DRTM tasks are done. The task implements the correct support for server CPUs in TrenchBoot SKL. Update TrenchBoot boot protocol for AMD in GRUB2 Some work to implement TrenchBoot support for Qubes OS on AMD hardware has been done. GRUB2 with TrenchBoot support has been added to Qubes building system on 3mdeb fork . The task aims to update the work and align with the TrenchBoot boot protocol being upstreamed to GRUB2 and Linux kernel. Update TrenchBoot boot protocol for AMD in Secure Kernel Loader The task aims to update the TrenchBoot boot protocol for AMD platforms in Secure Kernel Loader and align with the TrenchBoot boot protocol being upstreamed to GRUB2 and Linux kernel. Test the solution on AMD hardware with TPM 2.0 and TPM 1.2 with legacy boot mode Projects or organizations relevant to this project before? Qubes OS Xen Hypervisor GNU GRUB TrenchBoot Invisible Things Lab Apertus Solutions Oracle 3mdeb The ecosystem of the project 3mdeb has a good relationship with the maintainers of relevant projects which will participate in review of the work: Marek Marczykowski-G\u00f3recki (Invisible Things Lab CTO) - Qubes OS maintainer Andrew Cooper (Citrix) - Xen Hypervisor Maintainer Daniel Kiper (Oracle) - GRUB2 Maintainer Daniel Smith (Apertus Solutions) - TrenchBoot founder and maintainer Review Further reviews and suggestions are welcome. You can do it in two ways: using Giscus on the bottom of this page contributing to this repository directly via Pull Request","title":"TrenchBoot Anti Evil Maid (current plan - v2)"},{"location":"projects/trenchboot-aem-v2/#trenchboot-as-anti-evil-maid","text":"","title":"Trenchboot as Anti Evil Maid"},{"location":"projects/trenchboot-aem-v2/#abstract","text":"As Qubes OS users, promoters, and developers, we understand how essential it is to be aware of the latest developments in maintaining the security of your favorite operating system. We're excited to share our plans to integrate the TrenchBoot Project into Qubes OS's new Anti-Evil Maid (AEM) implementation. As you may know, traditional firmware security measures like UEFI Secure Boot and measured boot, even with a Static Root of Trust (SRT), may only sometimes be enough to ensure a completely secure environment for your operating system. Compromised firmware may allow for the injection of malicious software into your system, making it difficult to detect. To overcome these limitations, many silicon vendors have started implementing Dynamic Root of Trust (DRT) technologies to establish a secure environment for operating system launch and integrity measurements. We're excited to take advantage of these advancements through integration with the TrenchBoot Project . The usage of DRT technologies like Intel Trusted Execution Technology (TXT) or AMD Secure Startup becomes more and more significant, for example, Dynamic Root of Trust for Measurement (DRTM) requirements of Microsoft Secured Core PCs . In open-source projects, DRTM hasn't found its place yet, but that gradually changes. The demand on having firmware independent Roots of Trust is increasing and projects that satisfy this demand are growing, for instance, TrenchBoot . TrenchBoot is a framework that allows individuals and projects to build security engines to perform launch integrity actions for their systems. The framework builds upon Boot Integrity Technologies (BITs) that establish one or more Roots of Trust (RoT) from which a degree of confidence that integrity actions were not subverted is derived. The project has grown a lot thanks to the previous NLnet NGI0 PET grant and now it looks for further expansion into extensive use of the DRT technologies in open-source and security-oriented operating systems like Qubes OS . Qubes OS Anti Evil Maid (AEM) software heavily depends on the availability of the DRTM technologies to prevent the Evil Maid attacks . However, the project hasn't evolved much since the beginning of 2018 and froze on the support of TPM 1.2 with Intel TXT in legacy boot mode (BIOS). This effectively limits the usage of this security software to older Intel machines only. TPM 1.2 implemented SHA1 hashing algorithm which is nowadays considered weak in the era of forever-increasing computer performance and quantum computing. The solution to this problem comes with a newer TPM 2.0 with more agile cryptographic algorithms and SHA256 implementation by default. Qubes OS AEM software suffers from the following: Lack of TPM 2.0 support to handle more secure hashes and safer design of the TPM firmware according to a newer specification. Qubes OS AEM has never supported any AMD processors with AMD Secure Startup technology. Implementing AMD support would make a huge impact and broaden the usage of DRTM technologies. The initial AEM implementation relied on the Trusted Boot project , Intel's reference implementation of Intel TXT. It had never any plans to support AMD processors. TrenchBoot is filling this gap supporting both Intel and AMD hardware which makes it an ideal target to replace Trusted Boot in Qubes OS AEM implementation. Furthermore, the project grant would be used to implement the missing pieces in the Qubes OS AEM software to cover the AMD and Intel support for both TPM 1.2 and TPM 2.0.","title":"Abstract"},{"location":"projects/trenchboot-aem-v2/#compare-your-own-project-with-existing-or-historical-efforts","text":"3mdeb is a licensed provider for quality coreboot consulting services for 7 years. We are well-known in the open-source community for maintaining firmware of the PC Engines APU series platform for over 7-years. Delivering high-quality firmware releases each month and providing technical support on PC Engines and OPNSense forums. 3mdeb embedded systems developers are experienced engineers accustomed to operating systems development. Our developers have contributed to the fwupd support for Qubes OS . 3mdeb is also regularly co-organizing mini-conference events with Qubes OS maintainer Marek Marczykowski-G\u00f3recki where various topics related to Qubes OS security are discussed. Among them, the Anti Evil Maid was frequently presented by 3mdeb engineers: Anti Evil Maid for Intel coreboot-based platform Anti Evil Maid for modern AMD UEFI-based platform 3mdeb, with financial support from Qubes OS, developed a proof of concept replacing Trusted Boot with TrenchBoot on Intel hardware with TPM 1.2. Qubes OS and 3mdeb already tested a new solution with Qubes OS Anti Evil Maid, which is available for community use. The result of this solution can be seen in the published blog post that concludes the first phase of integrating TrenchBoot Anti Evil Maid for Qubes OS. The numbering of the next phases of the project will commence with number 2 in order to maintain consistency with the work already completed in phase 1 . The following application describes the remaining work required to have production quality adoption in one of the most popular secure operating system on the market.","title":"Compare your own project with existing or historical efforts"},{"location":"projects/trenchboot-aem-v2/#what-are-the-significant-technical-challenges-you-expect-to-solve","text":"First of all Qubes OS AEM software consists of software packages providing Trusted Boot and the Qubes OS TPM scripts . These software packages would need to replace the Trusted Boot with TrenchBoot supported GRUB2 and Xen. Secondly, the TPM scripts require adding support for TPM 2.0 equivalent functionality. AEM requires access to non-volatile RAM inside TPM which is defined differently in the TPM 2.0 specification compared to TPM 1.2. Another challenge would be to update the TrenchBoot components for AMD platforms to the recent boot protocol, which will allow AMD platforms to take advantage of the QubesOS AEM feature, and TrenchBoot.","title":"What are the significant technical challenges you expect to solve"},{"location":"projects/trenchboot-aem-v2/#requested-support","text":"Phase 2 - TPM 2.0 support in Qubes OS AEM (Intel hardware): Implement support for TPM 2.0 module in Xen Required to measure Dom0 kernel and initial ram disk before they are executed. Implement support for TPM 2.0 event log in Xen Required to log the Dom0 kernel and initial ram disk hashes to the TPM event log. The event log could be used for future system attestation. Implement parallel CPU cores bring-up for DRTM launch Currently the CPU cores are being woken up in parallel, but later they are hacked to be waiting in a queue. If any interrupt would come at that time, it could be a serious danger. It has to be fixed as soon as possible, as required by Intel TXT specification. Integrate TPM 2.0 software stack into Qubes OS Dom0 Extend the AEM scripts to detect TPM version on the platform While AEM fully supports TPM 1.2 there is no support for TPM 2.0 at all. When the TPM family is determined the script should use the appropriate software stack for given TPM. The task implements the AEM TPM 1.2 equivalent functionalities using TPM 2.0 software stack and as a result allowing the use of TPM 2.0 with Qubes OS AEM. It will require implementing the access to TPM 2.0 NVRAM, sealing and unsealing the secret data and generating TOTP. Extend the AEM scripts to use appropriate software stack for TPM 2.0 Currently, only TPM 1.2 is supported in Qubes OS AEM service code. The 3 items above will ensure the necessary software for TPM 2.0 is available and AEM scripts executed early from the initrd can detect which TPM family is present on the platform and use appropriate software stack and functions. TPM 1.2 and TPM 2.0 software stacks are not compatible so the scripts themselves must use proper API for given TPM and its respective software stack. Update Qubes OS AEM documentation Test the solution on Intel hardware with TPM 1.2 and 2.0 using legacy boot mode Phase 3 - Update to the newest TrenchBoot boot protocol: Code rebase onto the most recent work implementing Secure Launch protocol being upstreamed to Linux and GRUB The current state of TrenchBoot support has diverged with what was developed for QubesOS AEM for Intel hardware with TPM 1.2. The task aims to update the work and align with the TrenchBoot boot protocol being upstreamed to GRUB and Linux kernel. Xen shall take similar approach as Linux kernel in terms of DRTM launch. Test the solution on Intel hardware with TPM 1.2 and TPM 2.0 using legacy boot mode Phase 4 - AMD support for Qubes OS AEM with TrenchBoot: Update the Secure Kernel Loader (formerly LandingZone) package support for QubesOS Since the initial work done by 3mdeb engineers for AMD AEM in Qubes OS a lot of time has passed and Secure Kernel Loader - SKL (formerly Landing Zone) has improved a lot and added new features. SKL is an open-source module written by TrenchBoot developers required by AMD Secure Startup technology to perform DRTM launch. The task aims to refresh the previous work and update the SKL package for Qubes OS to the newest revision. TrenchBoot Secure Kernel Loader (SKL) improvements for AMD server CPUs with multiple nodes While SKL was extensively tested on System on Chip and single CPU platforms, it was not much tested on workstation/server segment CPUs which are more complex. For example one server CPU package may contain two independent CPUs inside called nodes. Each node will enable protection on the SKL during DRTM execution. This protection has to be disabled on each node when TrenchBoot DRTM tasks are done. The task implements the correct support for server CPUs in TrenchBoot SKL. Update TrenchBoot boot protocol for AMD in GRUB2 Some work to implement TrenchBoot support for Qubes OS on AMD hardware has been done. GRUB2 with TrenchBoot support has been added to Qubes building system on 3mdeb fork . The task aims to update the work and align with the TrenchBoot boot protocol being upstreamed to GRUB2 and Linux kernel. Update TrenchBoot boot protocol for AMD in Secure Kernel Loader The task aims to update the TrenchBoot boot protocol for AMD platforms in Secure Kernel Loader and align with the TrenchBoot boot protocol being upstreamed to GRUB2 and Linux kernel. Test the solution on AMD hardware with TPM 2.0 and TPM 1.2 with legacy boot mode","title":"Requested support"},{"location":"projects/trenchboot-aem-v2/#projects-or-organizations-relevant-to-this-project-before","text":"Qubes OS Xen Hypervisor GNU GRUB TrenchBoot Invisible Things Lab Apertus Solutions Oracle 3mdeb","title":"Projects or organizations relevant to this project before?"},{"location":"projects/trenchboot-aem-v2/#the-ecosystem-of-the-project","text":"3mdeb has a good relationship with the maintainers of relevant projects which will participate in review of the work: Marek Marczykowski-G\u00f3recki (Invisible Things Lab CTO) - Qubes OS maintainer Andrew Cooper (Citrix) - Xen Hypervisor Maintainer Daniel Kiper (Oracle) - GRUB2 Maintainer Daniel Smith (Apertus Solutions) - TrenchBoot founder and maintainer","title":"The ecosystem of the project"},{"location":"projects/trenchboot-aem-v2/#review","text":"Further reviews and suggestions are welcome. You can do it in two ways: using Giscus on the bottom of this page contributing to this repository directly via Pull Request","title":"Review"},{"location":"projects/trenchboot-aem/","text":"Trenchboot as Anti Evil Maid This is out of date and left here as a reference. Please use the current version of the plan for up-to-date information Abstract The firmware is the heart of the security of a given system and should always be up-to-date to maintain the computer's security. However, being up to date does not prevent the firmware vulnerabilities from appearing. The Static Root of Trust (SRT) like Unified Extensible Firmware Interface (UEFI) Secure Boot and measured boot provided by the firmware is not always sufficient to establish a secure environment for an operating system. If the firmware is compromised, it could inject malicious software into operating system components and prevent the machine owner from detecting it. Silicon vendors implement alternative technologies to establish a Dynamic Root of Trust (DRT) to provide a secure environment for operating system launch and integrity measurements. Either from SRT or DRT, these integrity measurements can be used for operating system attestation. However, DRT technologies are designed to provide the ability to establish a secure environment for integrity measurements at any arbitrary point of time instead of relying on the firmware, which requires machine reset to establish the aforementioned secure environment. The usage of DRT technologies like Intel Trusted Execution Technology (TXT) or AMD Secure Startup becomes more and more significant, for example, Dynamic Root of Trust for Measurement (DRTM) requirements of Microsoft Secured Core PCs . DRTM hasn't found its place in open-source projects yet, but that gradually changes. The demand on having firmware independent Roots of Trust is increasing, and projects that satisfy this demand are growing, for instance, TrenchBoot . TrenchBoot is a framework that allows individuals and projects to build security engines to perform launch integrity actions for their systems. The framework builds upon Boot Integrity Technologies (BITs) that establish one or more Roots of Trust (RoT) from which a degree of confidence that integrity actions were not subverted is derived. The project has grown a lot thanks to the previous NLnet NGI0 PET grant and now it looks for further expansion into extensive use of the DRT technologies in open-source and security-oriented operating systems like Qubes OS . Qubes OS Anti Evil Maid (AEM) software heavily depends on the availability of the DRTM technologies to prevent the Evil Maid attacks . However, the project hasn't evolved much since the beginning of 2018 and froze on the support of TPM 1.2 with Intel TXT in legacy boot mode (BIOS). Because of that, the usage of this security software is effectively limited to older Intel machines only. TPM 1.2 implemented SHA1 hashing algorithm, which is nowadays considered weak in the era of forever-increasing computer performance and quantum computing. The solution to this problem comes with a newer TPM 2.0 with more agile cryptographic algorithms and SHA256 implementation by default. Qubes OS AEM software suffers from the following: Lack of TPM 2.0 support to handle more secure hashes and safer design of the TPM firmware according to a newer specification. Lack of UEFI mode support. All modern systems boot in UEFI mode only. Legacy boot modes are being deprecated and dropped from the PC firmware. The AEM usage is not possible on most if not all modern machines. Qubes OS AEM has never supported AMD processors with AMD Secure Startup technology. Implementing AMD support would make a significant impact and broaden the usage of DRTM technologies. The initial AEM implementation relied on the Trusted Boot , Intel's reference implementation of Intel TXT. It never had any plans to support AMD processors. TrenchBoot is filling this gap, supporting both Intel and AMD hardware which makes it an ideal target to replace Trusted Boot in Qubes OS AEM implementation. Furthermore, the project grant would be used to implement the missing pieces in the Qubes OS AEM software to cover the AMD and Intel support for both TPM 1.2 and TPM 2.0. Compare your own project with existing or historical efforts 3mdeb is a licensed provider for quality coreboot consulting services since 2016. We are well-known in the open-source community for maintaining the firmware of the PC Engines APU series platform since 2016. Delivering high-quality firmware releases each month and providing technical support on PC Engines and OPNSense forums. 3mdeb embedded systems developers are experienced engineers accustomed to operating systems development. Our developers have contributed to the fwupd support for Qubes OS . 3mdeb is also regularly co-organizing mini-conference events with Qubes OS maintainer Marek Marczykowski-G\u00f3recki, where various topics related to Qubes OS security are discussed. Among them, the Anti Evil Maid was frequently presented by 3mdeb engineers: Anti Evil Maid for Intel coreboot-based platform Anti Evil Maid for modern AMD UEFI-based platform A similar approach was already tried by Assured Information Security (AIS) to boot Xen in UEFI mode with Intel TXT DRTM technology . However, this is only a tiny portion of the work covered by our proposal. Additionally, Qubes OS does not launch using Xen.efi like in the AIS work but uses Multiboot2 protocol with GRUB2 instead, making this approach unusable. Moreover, the Xen.efi approach is much more complex and assumes usage of Trusted Boot, limiting the feature to Intel hardware only. What are the significant technical challenges you expect to solve First of all, Qubes OS AEM software consists of software packages providing Trusted Boot and the Qubes OS TPM scripts . These software packages would need to replace the Trusted Boot with TrenchBoot supported GRUB2 and Xen. Secondly, the TPM scripts require adding support for TPM 2.0 equivalent functionality. AEM requires access to non-volatile RAM inside TPM, which is defined differently in the TPM 2.0 specification compared to TPM 1.2. Another challenge would be to make Xen possible to boot in UEFI boot mode without Boot Services defined in UEFI specification. Boot Services are a set of functions exposed in UEFI structures that are used to help with handling the boot process. However, the main principle of DRTM technologies is to not depend on any external code that is not a part of the operating system software to be executed after DRTM. UEFI Boot Services are a part of the firmware of which DRTM tries to be independent. The whole security concept of DRTM depends on cutting the ties with firmware. Thus the work includes implementing the capability in Xen not to use the UEFI Boot Services, which GRUB2 would terminate before DRTM is executed. Xen also contains an option not to use the UEFI Runtime Services. Runtime Services is a set of functions available throughout the whole machine lifetime, which means some firmware functionalities are available even when the operating system is launched. Removing the Boot Services from Xen brings certain drawbacks to the system because the Boot Services hold essential information like memory map, TPM event log, graphics framebuffer, etc. This information must be extracted by GRUB before Boot Services are terminated and passed to the Xen. The proposed solution is to pass this information via the Multiboot2 tags defined in the specification for this particular Boot Services information. Another challenge would be to get the work merged in the upstream repositories. It would ensure the long-term support and maintenance of the solution and availability. Providing software packages to be used out of the box is crucial for technology availability. Requested support Phase 1: TrenchBoot Intel TXT and TPM 1.2 support Add TPM 1.2 support for Intel TXT in TrenchBoot GRUB2 The TrenchBoot support hasn't been implemented and verified with TPM 1.2 on Intel TXT path. This requirement ensures that the TPM 1.2 is also supported for older Intel hardware with Intel TXT. Xen Secure Launch - Intel TXT support in Xen for TrenchBoot Due to the requirements of Intel TXT and how it is utilized, it is impossible to use the Xen boot protocols defined in the UEFI or Multiboot2 specifications. This task aims to create a custom Intel TXT entry point for Xen, which would hand off to the standard Multiboot2 entry point and enable the direct launch of Xen by GRUB via DRTM on Intel hardware. Additionally, there is no support for launching Xen with Intel TXT other than Trusted Boot. It has to be ported from Trusted Boot specific code: constructing MLE header waking up APs restoring MTRRs reserving the TXT memory reenabling SMIs handling TXT shutdown and S3 resume/suspend TPM event log finding Test the solution on Intel hardware with TPM 1.2 with legacy boot mode Phase 2 - Qubes OS AEM TPM 2.0 support: Extend the AEM scripts to detect TPM version on the platform As TPM 1.2 and TPM 2.0 use different software stacks and tools, it is necessary to distinguish the TPM module family and use the appropriate software. The task will implement the logic to distinguish the TPM families. Extend the AEM scripts to use the appropriate software stack for TPM 2.0 While AEM fully supports TPM 1.2, there is no support for TPM 2.0 at all. When the TPM family is determined, the script should use the appropriate software stack for the given TPM. The task implements the AEM TPM 1.2 equivalent functionalities using TPM 2.0 software stack and as a result allowing the use of TPM 2.0 with Qubes OS AEM. It will require implementing the access to TPM 2.0 NVRAM, sealing and unsealing the secret data, and generating TOTP. Test the solution on Intel hardware with TPM 2.0 with legacy boot mode Phase 3 - Qubes OS AEM AMD support: Rebase and refresh TrenchBoot GRUB2 for QubesOS Some work to implement TrenchBoot support for Qubes OS on AMD hardware has been done. GRUB2 with TrenchBoot support has been added to Qubes building system on 3mdeb fork The task aims to refresh the work and align with the upstream Qubes OS GRUB2 repository Clean up the Secure Kernel Loader (formerly LandingZone) package support for QubesOS Since the initial work done by 3mdeb engineers for AMD AEM in Qubes OS, a lot of time has passed, and Secure Kernel Loader - SKL (formerly Landing Zone) has improved a lot and added new features. SKL is an open-source module written by TrenchBoot developers required by AMD Secure Startup technology to perform DRTM launch. The task aims to refresh the previous work and update the SKL package for Qubes OS to the newest revision. TrenchBoot Secure Kernel Loader (SKL) improvements for AMD server CPUs with multiple nodes While SKL was extensively tested on System on Chip and single CPU platforms, it was not tested on workstation/server segment CPUs which are more complex. For example, one server CPU package may contain two independent CPUs inside called nodes. Each node will enable protection on the SKL during DRTM execution, and this protection must be disabled on each node when TrenchBoot DRTM tasks are done. The task implements the correct support for server CPUs in TrenchBoot SKL. Test the solution on AMD hardware with TPM 2.0 and TPM 1.2 with legacy boot mode Phase 4 - Xen UEFI boot mode with DRTM: TrenchBoot support for UEFI boot mode for AMD in GRUB While TrenchBoot DRTM was extensively tested on Intel hardware with UEFI firmware and Linux, it was not on AMD platforms. This task ensures that DRTM works with UEFI boot mode on AMD processors in GRUB2 and Linux without UEFI Boot Services. TrenchBoot support for UEFI boot mode in Xen When UEFI boot mode with TrenchBoot is working with GRUB2 and Linux, all that is missing to fully support AMD and Intel hardware with Qubes OS AEM is the Xen support to boot in UEFI mode without Boot Services. This requires a significant amount of work to ensure that all information that Xen would obtain from UEFI Boot Services would still be available. The information has to be passed by GRUB2 to Xen via Multiboot2 protocol: EFI memory map Framebuffer information PCI devices information with their option ROMs Additionally \"EFI boot services not terminated\" Multiboot2 tag must not be passed to Xen by GRUB2 on DRTM launch when GRUB2 will terminate Boot Services. Xen should detect such situations and act according to the state of Boot Services. Xen will be implemented to: parse the EFI memory map, framebuffer information, and PCI devices information passed by GRUB2 do not expose the \"EFI boot services\" Multiboot2 tag indicating that Xen can be executed without UEFI Boot Services presence allocate the memory space for the trampoline used to launch other processors or use the allocation done by GRUB2 if necessary do not go error path when Boot Services are not present and skip all calls to UEFI Boot Services by using the information provided by GRUB2 Test the solution on AMD and Intel hardware with TPM 2.0 and TPM 1.2 with legacy and UEFI boot mode Projects or organizations relevant to this project before? Qubes OS Xen Hypervisor GNU GRUB TrenchBoot Invisible Things Lab Apertus Solutions Oracle 3mdeb The ecosystem of the project 3mdeb has a good relationship with the maintainers of relevant projects which will participate in the review of the work: Marek Marczykowski-G\u00f3recki (Invisible Things Lab CTO) - Qubes OS maintainer Andrew Cooper (Citrix) - Xen Hypervisor Maintainer Daniel Kiper (Oracle) - GRUB2 Maintainer Daniel Smith (Apertus Solutions) - TrenchBoot founder and maintainer Review Further reviews and suggestions are welcome. You can do it in two ways: using Giscus on the bottom of this page contributing to this repository directly via Pull Request","title":"TrenchBoot Anti Evil Maid (previoius plan - v1)"},{"location":"projects/trenchboot-aem/#trenchboot-as-anti-evil-maid","text":"This is out of date and left here as a reference. Please use the current version of the plan for up-to-date information","title":"Trenchboot as Anti Evil Maid"},{"location":"projects/trenchboot-aem/#abstract","text":"The firmware is the heart of the security of a given system and should always be up-to-date to maintain the computer's security. However, being up to date does not prevent the firmware vulnerabilities from appearing. The Static Root of Trust (SRT) like Unified Extensible Firmware Interface (UEFI) Secure Boot and measured boot provided by the firmware is not always sufficient to establish a secure environment for an operating system. If the firmware is compromised, it could inject malicious software into operating system components and prevent the machine owner from detecting it. Silicon vendors implement alternative technologies to establish a Dynamic Root of Trust (DRT) to provide a secure environment for operating system launch and integrity measurements. Either from SRT or DRT, these integrity measurements can be used for operating system attestation. However, DRT technologies are designed to provide the ability to establish a secure environment for integrity measurements at any arbitrary point of time instead of relying on the firmware, which requires machine reset to establish the aforementioned secure environment. The usage of DRT technologies like Intel Trusted Execution Technology (TXT) or AMD Secure Startup becomes more and more significant, for example, Dynamic Root of Trust for Measurement (DRTM) requirements of Microsoft Secured Core PCs . DRTM hasn't found its place in open-source projects yet, but that gradually changes. The demand on having firmware independent Roots of Trust is increasing, and projects that satisfy this demand are growing, for instance, TrenchBoot . TrenchBoot is a framework that allows individuals and projects to build security engines to perform launch integrity actions for their systems. The framework builds upon Boot Integrity Technologies (BITs) that establish one or more Roots of Trust (RoT) from which a degree of confidence that integrity actions were not subverted is derived. The project has grown a lot thanks to the previous NLnet NGI0 PET grant and now it looks for further expansion into extensive use of the DRT technologies in open-source and security-oriented operating systems like Qubes OS . Qubes OS Anti Evil Maid (AEM) software heavily depends on the availability of the DRTM technologies to prevent the Evil Maid attacks . However, the project hasn't evolved much since the beginning of 2018 and froze on the support of TPM 1.2 with Intel TXT in legacy boot mode (BIOS). Because of that, the usage of this security software is effectively limited to older Intel machines only. TPM 1.2 implemented SHA1 hashing algorithm, which is nowadays considered weak in the era of forever-increasing computer performance and quantum computing. The solution to this problem comes with a newer TPM 2.0 with more agile cryptographic algorithms and SHA256 implementation by default. Qubes OS AEM software suffers from the following: Lack of TPM 2.0 support to handle more secure hashes and safer design of the TPM firmware according to a newer specification. Lack of UEFI mode support. All modern systems boot in UEFI mode only. Legacy boot modes are being deprecated and dropped from the PC firmware. The AEM usage is not possible on most if not all modern machines. Qubes OS AEM has never supported AMD processors with AMD Secure Startup technology. Implementing AMD support would make a significant impact and broaden the usage of DRTM technologies. The initial AEM implementation relied on the Trusted Boot , Intel's reference implementation of Intel TXT. It never had any plans to support AMD processors. TrenchBoot is filling this gap, supporting both Intel and AMD hardware which makes it an ideal target to replace Trusted Boot in Qubes OS AEM implementation. Furthermore, the project grant would be used to implement the missing pieces in the Qubes OS AEM software to cover the AMD and Intel support for both TPM 1.2 and TPM 2.0.","title":"Abstract"},{"location":"projects/trenchboot-aem/#compare-your-own-project-with-existing-or-historical-efforts","text":"3mdeb is a licensed provider for quality coreboot consulting services since 2016. We are well-known in the open-source community for maintaining the firmware of the PC Engines APU series platform since 2016. Delivering high-quality firmware releases each month and providing technical support on PC Engines and OPNSense forums. 3mdeb embedded systems developers are experienced engineers accustomed to operating systems development. Our developers have contributed to the fwupd support for Qubes OS . 3mdeb is also regularly co-organizing mini-conference events with Qubes OS maintainer Marek Marczykowski-G\u00f3recki, where various topics related to Qubes OS security are discussed. Among them, the Anti Evil Maid was frequently presented by 3mdeb engineers: Anti Evil Maid for Intel coreboot-based platform Anti Evil Maid for modern AMD UEFI-based platform A similar approach was already tried by Assured Information Security (AIS) to boot Xen in UEFI mode with Intel TXT DRTM technology . However, this is only a tiny portion of the work covered by our proposal. Additionally, Qubes OS does not launch using Xen.efi like in the AIS work but uses Multiboot2 protocol with GRUB2 instead, making this approach unusable. Moreover, the Xen.efi approach is much more complex and assumes usage of Trusted Boot, limiting the feature to Intel hardware only.","title":"Compare your own project with existing or historical efforts"},{"location":"projects/trenchboot-aem/#what-are-the-significant-technical-challenges-you-expect-to-solve","text":"First of all, Qubes OS AEM software consists of software packages providing Trusted Boot and the Qubes OS TPM scripts . These software packages would need to replace the Trusted Boot with TrenchBoot supported GRUB2 and Xen. Secondly, the TPM scripts require adding support for TPM 2.0 equivalent functionality. AEM requires access to non-volatile RAM inside TPM, which is defined differently in the TPM 2.0 specification compared to TPM 1.2. Another challenge would be to make Xen possible to boot in UEFI boot mode without Boot Services defined in UEFI specification. Boot Services are a set of functions exposed in UEFI structures that are used to help with handling the boot process. However, the main principle of DRTM technologies is to not depend on any external code that is not a part of the operating system software to be executed after DRTM. UEFI Boot Services are a part of the firmware of which DRTM tries to be independent. The whole security concept of DRTM depends on cutting the ties with firmware. Thus the work includes implementing the capability in Xen not to use the UEFI Boot Services, which GRUB2 would terminate before DRTM is executed. Xen also contains an option not to use the UEFI Runtime Services. Runtime Services is a set of functions available throughout the whole machine lifetime, which means some firmware functionalities are available even when the operating system is launched. Removing the Boot Services from Xen brings certain drawbacks to the system because the Boot Services hold essential information like memory map, TPM event log, graphics framebuffer, etc. This information must be extracted by GRUB before Boot Services are terminated and passed to the Xen. The proposed solution is to pass this information via the Multiboot2 tags defined in the specification for this particular Boot Services information. Another challenge would be to get the work merged in the upstream repositories. It would ensure the long-term support and maintenance of the solution and availability. Providing software packages to be used out of the box is crucial for technology availability.","title":"What are the significant technical challenges you expect to solve"},{"location":"projects/trenchboot-aem/#requested-support","text":"Phase 1: TrenchBoot Intel TXT and TPM 1.2 support Add TPM 1.2 support for Intel TXT in TrenchBoot GRUB2 The TrenchBoot support hasn't been implemented and verified with TPM 1.2 on Intel TXT path. This requirement ensures that the TPM 1.2 is also supported for older Intel hardware with Intel TXT. Xen Secure Launch - Intel TXT support in Xen for TrenchBoot Due to the requirements of Intel TXT and how it is utilized, it is impossible to use the Xen boot protocols defined in the UEFI or Multiboot2 specifications. This task aims to create a custom Intel TXT entry point for Xen, which would hand off to the standard Multiboot2 entry point and enable the direct launch of Xen by GRUB via DRTM on Intel hardware. Additionally, there is no support for launching Xen with Intel TXT other than Trusted Boot. It has to be ported from Trusted Boot specific code: constructing MLE header waking up APs restoring MTRRs reserving the TXT memory reenabling SMIs handling TXT shutdown and S3 resume/suspend TPM event log finding Test the solution on Intel hardware with TPM 1.2 with legacy boot mode Phase 2 - Qubes OS AEM TPM 2.0 support: Extend the AEM scripts to detect TPM version on the platform As TPM 1.2 and TPM 2.0 use different software stacks and tools, it is necessary to distinguish the TPM module family and use the appropriate software. The task will implement the logic to distinguish the TPM families. Extend the AEM scripts to use the appropriate software stack for TPM 2.0 While AEM fully supports TPM 1.2, there is no support for TPM 2.0 at all. When the TPM family is determined, the script should use the appropriate software stack for the given TPM. The task implements the AEM TPM 1.2 equivalent functionalities using TPM 2.0 software stack and as a result allowing the use of TPM 2.0 with Qubes OS AEM. It will require implementing the access to TPM 2.0 NVRAM, sealing and unsealing the secret data, and generating TOTP. Test the solution on Intel hardware with TPM 2.0 with legacy boot mode Phase 3 - Qubes OS AEM AMD support: Rebase and refresh TrenchBoot GRUB2 for QubesOS Some work to implement TrenchBoot support for Qubes OS on AMD hardware has been done. GRUB2 with TrenchBoot support has been added to Qubes building system on 3mdeb fork The task aims to refresh the work and align with the upstream Qubes OS GRUB2 repository Clean up the Secure Kernel Loader (formerly LandingZone) package support for QubesOS Since the initial work done by 3mdeb engineers for AMD AEM in Qubes OS, a lot of time has passed, and Secure Kernel Loader - SKL (formerly Landing Zone) has improved a lot and added new features. SKL is an open-source module written by TrenchBoot developers required by AMD Secure Startup technology to perform DRTM launch. The task aims to refresh the previous work and update the SKL package for Qubes OS to the newest revision. TrenchBoot Secure Kernel Loader (SKL) improvements for AMD server CPUs with multiple nodes While SKL was extensively tested on System on Chip and single CPU platforms, it was not tested on workstation/server segment CPUs which are more complex. For example, one server CPU package may contain two independent CPUs inside called nodes. Each node will enable protection on the SKL during DRTM execution, and this protection must be disabled on each node when TrenchBoot DRTM tasks are done. The task implements the correct support for server CPUs in TrenchBoot SKL. Test the solution on AMD hardware with TPM 2.0 and TPM 1.2 with legacy boot mode Phase 4 - Xen UEFI boot mode with DRTM: TrenchBoot support for UEFI boot mode for AMD in GRUB While TrenchBoot DRTM was extensively tested on Intel hardware with UEFI firmware and Linux, it was not on AMD platforms. This task ensures that DRTM works with UEFI boot mode on AMD processors in GRUB2 and Linux without UEFI Boot Services. TrenchBoot support for UEFI boot mode in Xen When UEFI boot mode with TrenchBoot is working with GRUB2 and Linux, all that is missing to fully support AMD and Intel hardware with Qubes OS AEM is the Xen support to boot in UEFI mode without Boot Services. This requires a significant amount of work to ensure that all information that Xen would obtain from UEFI Boot Services would still be available. The information has to be passed by GRUB2 to Xen via Multiboot2 protocol: EFI memory map Framebuffer information PCI devices information with their option ROMs Additionally \"EFI boot services not terminated\" Multiboot2 tag must not be passed to Xen by GRUB2 on DRTM launch when GRUB2 will terminate Boot Services. Xen should detect such situations and act according to the state of Boot Services. Xen will be implemented to: parse the EFI memory map, framebuffer information, and PCI devices information passed by GRUB2 do not expose the \"EFI boot services\" Multiboot2 tag indicating that Xen can be executed without UEFI Boot Services presence allocate the memory space for the trampoline used to launch other processors or use the allocation done by GRUB2 if necessary do not go error path when Boot Services are not present and skip all calls to UEFI Boot Services by using the information provided by GRUB2 Test the solution on AMD and Intel hardware with TPM 2.0 and TPM 1.2 with legacy and UEFI boot mode","title":"Requested support"},{"location":"projects/trenchboot-aem/#projects-or-organizations-relevant-to-this-project-before","text":"Qubes OS Xen Hypervisor GNU GRUB TrenchBoot Invisible Things Lab Apertus Solutions Oracle 3mdeb","title":"Projects or organizations relevant to this project before?"},{"location":"projects/trenchboot-aem/#the-ecosystem-of-the-project","text":"3mdeb has a good relationship with the maintainers of relevant projects which will participate in the review of the work: Marek Marczykowski-G\u00f3recki (Invisible Things Lab CTO) - Qubes OS maintainer Andrew Cooper (Citrix) - Xen Hypervisor Maintainer Daniel Kiper (Oracle) - GRUB2 Maintainer Daniel Smith (Apertus Solutions) - TrenchBoot founder and maintainer","title":"The ecosystem of the project"},{"location":"projects/trenchboot-aem/#review","text":"Further reviews and suggestions are welcome. You can do it in two ways: using Giscus on the bottom of this page contributing to this repository directly via Pull Request","title":"Review"},{"location":"quality-principles/introduction/","text":"Dasharo Quality Principles Secure Delivery Each Dasharo release is secured cryptographically, ensuring with RSA 4096 keys the authenticity of binary SHA-256 integrity checksum. The three-step key verification is guarantees that your client receives a clean file without any third-party modifications. Integrity and signature verification procedure is included, so that the key compliance can be easily checked. Secure Maintenance Dasharo doesn't believe in security through obscurity. That is why each Dasharo firmware is supported with the system of Transparent Validation, proving its efficiency and quality with testing results. As an Open Source product, it provides timely emergency releases and patches together with long-lasting maintenance. Credibility Dasharo values credibility. Each release is extended by a validation report based on a project charter and a complete changelog with a description of the product versioning. Transparency Generic testing procedures for a given Dasharo product line are included in the product documentation. Specific testing procedures are delivered in the form of a PDF document accompanying a release. Availability Dasharo product line page includes a hardware compatibility platform list. The platform for which the new product line is created becomes its reference platform. The consecutive hardware platforms are added to the hardware compatibility list (HCL). Compliance No danger of version lock. Dasharo releases are versioned according to the [Semantic Versioning 2.0.0] ( https://semver.org/ ) specification for the sake of consistency. Release notes comply with the [Keep A Changelog 1.0.0] specification ( https://keepachangelog.com/en/1.0.0/ ).","title":"Quality Principles"},{"location":"quality-principles/introduction/#dasharo-quality-principles","text":"","title":"Dasharo Quality Principles"},{"location":"quality-principles/introduction/#secure-delivery","text":"Each Dasharo release is secured cryptographically, ensuring with RSA 4096 keys the authenticity of binary SHA-256 integrity checksum. The three-step key verification is guarantees that your client receives a clean file without any third-party modifications. Integrity and signature verification procedure is included, so that the key compliance can be easily checked.","title":"Secure Delivery"},{"location":"quality-principles/introduction/#secure-maintenance","text":"Dasharo doesn't believe in security through obscurity. That is why each Dasharo firmware is supported with the system of Transparent Validation, proving its efficiency and quality with testing results. As an Open Source product, it provides timely emergency releases and patches together with long-lasting maintenance.","title":"Secure Maintenance"},{"location":"quality-principles/introduction/#credibility","text":"Dasharo values credibility. Each release is extended by a validation report based on a project charter and a complete changelog with a description of the product versioning.","title":"Credibility"},{"location":"quality-principles/introduction/#transparency","text":"Generic testing procedures for a given Dasharo product line are included in the product documentation. Specific testing procedures are delivered in the form of a PDF document accompanying a release.","title":"Transparency"},{"location":"quality-principles/introduction/#availability","text":"Dasharo product line page includes a hardware compatibility platform list. The platform for which the new product line is created becomes its reference platform. The consecutive hardware platforms are added to the hardware compatibility list (HCL).","title":"Availability"},{"location":"quality-principles/introduction/#compliance","text":"No danger of version lock. Dasharo releases are versioned according to the [Semantic Versioning 2.0.0] ( https://semver.org/ ) specification for the sake of consistency. Release notes comply with the [Keep A Changelog 1.0.0] specification ( https://keepachangelog.com/en/1.0.0/ ).","title":"Compliance"},{"location":"transparent-validation/msi-z690/laboratory-assembly-guide/","text":"Laboratory stand dedicated to MSI PRO Z690-A assembly guide Introduction This document describes the assembly procedure dedicated to the MSI PRO Z690-A testing stand. Prerequisites The below table contains information about all elements which are needed to create the testing stand. MSI PRO Z690-A platform RTE v1.1.0 Sonoff S20 type E 4x standard female-female connection wire 2.54 mm raster 7x standard female-female connection wire 2.54/2.00 mm raster USB-UART converter with 4-wire cable 4-pin header 2.54 mm raster Pre-setup activities The following subsections describe the method of preparing all the components of the laboratory stand. MSI PRO Z690-A MSI PRO Z690-A platform should be prepared in accordance with the Motherboard assembly documentation. RTE RTE (acronym: Remote Testing Environment) should be prepared in accordance with Quick start guide documentation dedicated to the device. Sonoff The below section of the documentation is based on the EPSHome documentation Open the Sonoff case. Check if the headers are soldered to the board. If not - 4 pin header raster 2.54 mm should be soldered to the board in accordance with the below images. Connect the USB-UART converter to the USB port. Create a Sonoff configuration file. The file extension should be .yaml and it should contain the device configuration. Example configuration: esphome: name: XXXXXX platform: ESP8266 board: esp01_1m wifi: ssid: \"XXXXXX\" password: \"XXXXXX\" # manual_ip: # # Set this to the IP of the ESP # static_ip: 192.168.4.187 # # Set this to the IP address of the router. Often ends with .1 # gateway: 192.168.4.1 # # The subnet of the network. 255.255.255.0 works for most home networks. # subnet: 255.255.255.0 power_save_mode: none # # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: \"Sonoff1 Fallback Hotspot\" password: \"123456789\" captive_portal: # Enable logging logger: # Enable Home Assistant API api: ota: binary_sensor: - platform: gpio pin: number: GPIO0 mode: INPUT_PULLUP inverted: True name: \"Sonoff S20 Button\" on_press: - switch.toggle: relay - platform: status name: \"Sonoff S20 Status\" switch: - platform: gpio name: \"Sonoff S20 Relay\" pin: GPIO12 id: relay output: - platform: esp8266_pwm id: s20_green_led pin: GPIO13 inverted: True light: - platform: monochromatic name: \"Sonoff S20 Green LED\" output: s20_green_led web_server: port: 80 reboot_timeout: 0s Run the docker container in the folder containing created .yaml configuration file: docker run --rm -v \" ${ PWD } \" :/config --device = /dev/ttyUSB0 -p 6052 :6052 -it esphome/esphome Open the browser and type into the web browser the following address: http://localhost:6052/ Put the device in flash mode. Putting the device in this mode should be done in accordance with the documentation . Change the upload method from OTA to /dev/ttyUSB0 . After this operation, the new element with the name specified in esphome:name should be displayed. Select the option Upload . After clicking, the program should generate the image, compile it and upload it to the device. After successful upload replug the device to the USB ( without the button pressed) to get out of the flashing mode. Open connection to the device in the PC terminal by typing: sudo minicom -D /dev/ttyUSB0 -o -b 115200 . Note: /dev/ttyUSB0 is example device - check whether USB0 is the correct one. Check if the device is responsible - whether network connectivity information is generated. Note: The effective range for this device is only a few meters. Based on the minicom logs read the IP address assigned to the device. Connections The following sections describe how to enable all of the following features: serial connection to the platform, controlling power supply, enabling basic power actions with the platform (power off/power on/reset), external flashing with the RTE, device power status readout. Serial connection Attach the jumpers in the RTE J16 header to enable header J18: Jumper position (TX) Jumper position (RX) EXT + COM EXT + COM Connect the RTE J18 header to the platform JBD1 header as described in the table: RTE MSI PRO Z690-A J18 pin 1 (GND) JBD1 pin 1 (pin closer to JBAT1) J18 pin 2 (RX) JBD1 pin 2 (pin further from JBAT1) Note: Pins on JBD1 are not described in the documentation. They have been discovered experimentally. Pay attention to the connections. Power supply controlling Connect SeaSonic FOCUS Plus Platinum to Sonoff. Basic power operations enabling Connect the RTE J11 header to the platform JFP1 header as described in the table: RTE Msi Z690 J11 pin 9 JFP1 pin 6 (PWR_ON) J11 pin 8 JFP1 pin 7 (RST) J15 pin 1 (GND) JFP1 pin 5 (GND) External flashing enabling Connect the RTE SPI header to the platform as described in the table: RTE SPI header MSI Z690-A J7 pin 1 (Vcc) JTPM1 pin 1 (SPI Power) J7 pin 2 (GND) JTPM1 pin 7 (GND) J7 pin 3 (CS) JTPM1 pin 5 (RESERVED / BIOS SPI CS pin) J7 pin 4 (SCLK) JTPM1 pin 6 (SPI Clock) J7 pin 5 (MISO) JTPM1 pin 3 (MISO) J7 pin 6 (MOSI) JTPM1 pin 4 (MOSI) Note: external access to the flash chip is possible only from the JTPM header. JTPM1 is a 2mm pitch header, you will need 2mm to 2.54mm female-female dupont wires to connect to RTE. Device power status readout Connect the RTE J1 header to the platform JFP1 header as shown in the picture below: The values \u200b\u200bof R1 , R2 , V1 and V2 should meet the relationship according to the formula R1/R2 = V2/V1 . V1 cannot be greater than 3.3V (RTE property). Complete Setup After preparing all of the connections also three activities should be performed to enable all of the test stand features: Connect Sonoff to the mains: Connect the RTE to the Internet by using the Ethernet cable. Connect the RTE to the mains by using the microUSB 5 V/2 A power supply. Complete setup should looks as follows: Theory of operation The following sections describe how to use all of the enabled features: serial connection to the platform, controlling power supply, enabling basic power actions with the platform (power off/power on/reset), external flashing with the RTE, device power status readout. Serial connection The method of setting and using serial connection is described in the Serial connection guide . Power supply controlling Power supply controlling (in this case: controlling the state of Sonoff) should be performed based on the sonoff.sh script implemented in meta-rte (OS image dedicated to the RTE platform). Note, that before using the above-mentioned script, it should be modified and SONOFF_IP parameter should be set in accordance with obtained Sonoff IP address. To perform basic power operations use the below-described commands: Turn on the power supply: ./sonoff on Turn off the power supply: ./sonoff on Basic power operations Basic power operations should be performed based on the rte_ctrl script implemented in meta-rte (OS image dedicated to the RTE platform). To perform basic power operations use the below-described commands: Turn on the platform: rte_ctrl pon Turn off the platform: rte_ctrl poff Reset the platform: rte_ctrl reset Note, that in order for the above commands to work properly, the platform should be powered up: both Sonoff and the power supply must be turned on. External flashing The external flashing procedure should be performed based on the scripts implemented on the RTE platform. To perform the flashing operation reproduce, the below-described steps: By using scp put the requested Dasharo file to the RTE: scp / root@:/tmp/coreboot.rom Where: path_to_firmware - path to firmware, which should send to RTE, firmware_file - the name of the firmware file, which should be sent to RTE, RTE_IP - IP address of the connected RTE. Login to RTE via ssh or minicom . Read the flash chip by executing the following command on RTE: ./flash.sh read tmp/dump.rom If the reading was successful, the output from the command above should contain the phrase Verifying flash... VERIFIED . Write the flash chip by executing the following command on RTE: ./flash.sh write /tmp/coreboot.rom Do not interrupt the flashing procedure in any way (especially by changing connections). It may cause hardware damage! If the reading was successful, the output from the command above should contain the phrase Verifying flash... VERIFIED . Device power status readout To read the current power status use the following command: cat /sys/class/gpio/gpio12/value Example output: 1 means that the platform is turned on. 0 means that the platform is turned off.","title":"Laboratory stand assembly guide"},{"location":"transparent-validation/msi-z690/laboratory-assembly-guide/#laboratory-stand-dedicated-to-msi-pro-z690-a-assembly-guide","text":"","title":"Laboratory stand dedicated to MSI PRO Z690-A assembly guide"},{"location":"transparent-validation/msi-z690/laboratory-assembly-guide/#introduction","text":"This document describes the assembly procedure dedicated to the MSI PRO Z690-A testing stand.","title":"Introduction"},{"location":"transparent-validation/msi-z690/laboratory-assembly-guide/#prerequisites","text":"The below table contains information about all elements which are needed to create the testing stand. MSI PRO Z690-A platform RTE v1.1.0 Sonoff S20 type E 4x standard female-female connection wire 2.54 mm raster 7x standard female-female connection wire 2.54/2.00 mm raster USB-UART converter with 4-wire cable 4-pin header 2.54 mm raster","title":"Prerequisites"},{"location":"transparent-validation/msi-z690/laboratory-assembly-guide/#pre-setup-activities","text":"The following subsections describe the method of preparing all the components of the laboratory stand.","title":"Pre-setup activities"},{"location":"transparent-validation/msi-z690/laboratory-assembly-guide/#connections","text":"The following sections describe how to enable all of the following features: serial connection to the platform, controlling power supply, enabling basic power actions with the platform (power off/power on/reset), external flashing with the RTE, device power status readout.","title":"Connections"},{"location":"transparent-validation/msi-z690/laboratory-assembly-guide/#theory-of-operation","text":"The following sections describe how to use all of the enabled features: serial connection to the platform, controlling power supply, enabling basic power actions with the platform (power off/power on/reset), external flashing with the RTE, device power status readout.","title":"Theory of operation"},{"location":"transparent-validation/msi-z690/presale-assembly-and-validation/","text":"Presale device assembly and validation Introduction This document describes the assembly procedure of the MSI PRO Z690-A DDR4 with specified components in requirements . Requirements Part Model Name Image Motherboard MSI PRO Z-690A DDR4 CPU Intel Core i5-12600K, 3.7G Cooling Noctua CPU NH-U12S Redux (w/ Noctua NM-i17xx-MP78 Mounting Kit) RAM Kingston Fury Beast, DDR4, 4*8GB (32GB Total), 3600MHz, CL17 Power Supply Seasonic Focus PX 750W 80 Plus Platinum Storage SSD Intel 670p 512 GB M.2 2280 PCI-E x4 Gen3 NVMe Enclosure SilentiumPC Armis AR1 Additionally, you will need a regular Phillips screwdriver and thermal paste. Try not to tighten all the elements to the maximum, as it will make disassembly difficult. Remember that make all connections in the grounding strap. Device assembly Full set assembly Section below describes the procedure of complete assembling of the working station. Unpack all equipment. Place the motherboard in front of you, this is the component with which most of the operations will be performed. It's best to put something softer under the board so as not to damage it, e.g. during the installation of RAM modules. To install the CPU on the motherboard first, open the CPU socket: Insert the processor carefully and tighten it with the dedicated mechanism: To install the CPU cooler, the parts shown in the picture below are necessary: Attach the black stand to the bottom of the motherboard, then apply and screw down the remaining parts except the cooler itself and apply thermal paste. After these steps, the CPU area should look like this: Then attach the cooler from above by tightening the two screws. Most likely, for this operation, it is necessary to dismantle the fan and restore it after tightening the screws. Install the memory module into the DIMM slots. To insert a single module, open the latch on both sides. Then insert the RAM and gently press the module downward at both ends of the module and the latch will close automatically. Always insert memory modules in the DIMMA2 slot first. Install the M.2 solid-state drive (SSD) into the M.2 slot. Remove the two screws from the cover and the one responsible for disk stabilization. Insert the SSD into the M.2 slot and tighten the previously removed screws. Take the enclosure of the computer and open one side as shown in the picture below: Install the rear panel by inserting it from the inside of the enclosure and pressing it lightly. Insert the motherboard into the case but do not twist it, some pins are hard to connect when the motherboard is screwed. The photo below shows the slots that should be filled in the next steps. Connect the fan from the CPU cooler to the slot marked I . Connect the cables from the front panel to the appropriately marked places: A detailed description of the connection cable marked D can be found in the Board manual in section: JFP1, JFP2: Front Panel Connectors. To verify correct connection of the cable marked D , you can compare them to the pictures below: Connection from the inside: Connection from the outside: Connect the speaker to the slot marked before E : Screw the motherboard to the enclosure. Connect the power supply to the motherboard using the cables marked RE25 for connection to the G and H slots and the cable marked RJ21 to connect the F slots. Connect the fan built into the enclosure to the indicated place: Bundle the cables so that they don't interfere with the fans or other components. Close the case of the computer. Motherboard assembly only Section below describes the procedure of assembling the motherboard. To prepare the motherboard the following operations should be performed: Go through steps 1-8 from Full set assembling section . Go through 13th step from Full set assembling section . Connect cable marked D to allows power on the device as described in the 14th point of the Full set assembling section . Connect the power supply to the motherboard as described in the 17th point of the Full set assembling section . Device validation Connect the device to the mains. Power on the device with the button located on the front panel. If all connections have been made correctly, the device should start and the boot logo should be shown. Install Dasharo firmware in accordance with Initial Deployment - the Migrating SMBIOS unique data chapter can be skipped. Power on the device. Boot to Linux system (Ubuntu is recommended). Open a terminal window and run the following command: sudo dmidecode -t 0 | grep Version The output of the command above should be similar to: Version: Dasharo (coreboot+UEFI) where the version should correspond to the version of the flashing binary used eg. v1.0.0. Check in the system that everything is working properly. Useful content Building manual - documentation contains information on how to build Dasharo compatible with the MSI PRO Z690-A DDR4. Board manual - documentation contains detailed information about the motherboard and its operations.","title":"Presale assembly and validation"},{"location":"transparent-validation/msi-z690/presale-assembly-and-validation/#presale-device-assembly-and-validation","text":"","title":"Presale device assembly and validation"},{"location":"transparent-validation/msi-z690/presale-assembly-and-validation/#introduction","text":"This document describes the assembly procedure of the MSI PRO Z690-A DDR4 with specified components in requirements .","title":"Introduction"},{"location":"transparent-validation/msi-z690/presale-assembly-and-validation/#requirements","text":"Part Model Name Image Motherboard MSI PRO Z-690A DDR4 CPU Intel Core i5-12600K, 3.7G Cooling Noctua CPU NH-U12S Redux (w/ Noctua NM-i17xx-MP78 Mounting Kit) RAM Kingston Fury Beast, DDR4, 4*8GB (32GB Total), 3600MHz, CL17 Power Supply Seasonic Focus PX 750W 80 Plus Platinum Storage SSD Intel 670p 512 GB M.2 2280 PCI-E x4 Gen3 NVMe Enclosure SilentiumPC Armis AR1 Additionally, you will need a regular Phillips screwdriver and thermal paste. Try not to tighten all the elements to the maximum, as it will make disassembly difficult. Remember that make all connections in the grounding strap.","title":"Requirements"},{"location":"transparent-validation/msi-z690/presale-assembly-and-validation/#device-assembly","text":"","title":"Device assembly"},{"location":"transparent-validation/msi-z690/presale-assembly-and-validation/#device-validation","text":"Connect the device to the mains. Power on the device with the button located on the front panel. If all connections have been made correctly, the device should start and the boot logo should be shown. Install Dasharo firmware in accordance with Initial Deployment - the Migrating SMBIOS unique data chapter can be skipped. Power on the device. Boot to Linux system (Ubuntu is recommended). Open a terminal window and run the following command: sudo dmidecode -t 0 | grep Version The output of the command above should be similar to: Version: Dasharo (coreboot+UEFI) where the version should correspond to the version of the flashing binary used eg. v1.0.0. Check in the system that everything is working properly.","title":"Device validation"},{"location":"transparent-validation/msi-z690/presale-assembly-and-validation/#useful-content","text":"Building manual - documentation contains information on how to build Dasharo compatible with the MSI PRO Z690-A DDR4. Board manual - documentation contains detailed information about the motherboard and its operations.","title":"Useful content"},{"location":"transparent-validation/msi-z790/laboratory-assembly-guide/","text":"Laboratory stand dedicated to MSI PRO Z790-P assembly guide Introduction This document describes the assembly procedure dedicated to the MSI PRO Z790-P testing stand. Prerequisites The below table contains information about all elements which are needed to create the testing stand. MSI PRO Z790-P platform RTE v1.1.0 Sonoff S20 type E 4x standard female-female connection wire 2.54 mm raster 7x standard female-female connection wire 2.54/2.00 mm raster USB-UART converter with 4-wire cable 4-pin header 2.54 mm raster Pre-setup activities The following subsections describe the method of preparing all the components of the laboratory stand. MSI PRO Z790-P MSI PRO Z790-P platform should be prepared in accordance with the Motherboard assembly documentation. RTE RTE (acronym: Remote Testing Environment) should be prepared in accordance with Quick start guide documentation dedicated to the device. Sonoff The below section of the documentation is based on the EPSHome documentation Open the Sonoff case. Check if the headers are soldered to the board. If not - 4 pin header raster 2.54 mm should be soldered to the board in accordance with the below images. Connect the USB-UART converter to the USB port. Create a Sonoff configuration file. The file extension should be .yaml and it should contain the device configuration. Example configuration: esphome: name: XXXXXX platform: ESP8266 board: esp01_1m wifi: ssid: \"XXXXXX\" password: \"XXXXXX\" # manual_ip: # # Set this to the IP of the ESP # static_ip: 192.168.4.187 # # Set this to the IP address of the router. Often ends with .1 # gateway: 192.168.4.1 # # The subnet of the network. 255.255.255.0 works for most home networks. # subnet: 255.255.255.0 power_save_mode: none # # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: \"Sonoff1 Fallback Hotspot\" password: \"123456789\" captive_portal: # Enable logging logger: # Enable Home Assistant API api: ota: binary_sensor: - platform: gpio pin: number: GPIO0 mode: INPUT_PULLUP inverted: True name: \"Sonoff S20 Button\" on_press: - switch.toggle: relay - platform: status name: \"Sonoff S20 Status\" switch: - platform: gpio name: \"Sonoff S20 Relay\" pin: GPIO12 id: relay output: - platform: esp8266_pwm id: s20_green_led pin: GPIO13 inverted: True light: - platform: monochromatic name: \"Sonoff S20 Green LED\" output: s20_green_led web_server: port: 80 reboot_timeout: 0s Run the docker container in the folder containing created .yaml configuration file: docker run --rm -v \" ${ PWD } \" :/config --device = /dev/ttyUSB0 -p 6052 :6052 -it esphome/esphome Open the browser and type into the web browser the following address: http://localhost:6052/ Put the device in flash mode. Putting the device in this mode should be done in accordance with the documentation . Change the upload method from OTA to /dev/ttyUSB0 . After this operation, the new element with the name specified in esphome:name should be displayed. Select the option Upload . After clicking, the program should generate the image, compile it and upload it to the device. After successful upload replug the device to the USB ( without the button pressed) to get out of the flashing mode. Open connection to the device in the PC terminal by typing: sudo minicom -D /dev/ttyUSB0 -o -b 115200 . Note: /dev/ttyUSB0 is example device - check whether USB0 is the correct one. Check if the device is responsible - whether network connectivity information is generated. Note: The effective range for this device is only a few meters. Based on the minicom logs read the IP address assigned to the device. Connections The following sections describe how to enable all of the following features: serial connection to the platform, controlling power supply, enabling basic power actions with the platform (power off/power on/reset), external flashing with the RTE, device power status readout. Serial connection Attach the jumpers in the RTE J16 header to enable header J18: Jumper position (TX) Jumper position (RX) EXT + COM EXT + COM Connect the RTE J18 header to the platform JBD1 header as described in the table: RTE MSI PRO Z790-P J18 pin 1 (GND) JBD1 pin 1 (pin closer to JBAT1) J18 pin 2 (RX) JBD1 pin 2 (pin further from JBAT1) Note: Pins on JBD1 are not described in the documentation. They have been discovered experimentally. Pay attention to the connections. Power supply controlling Connect SeaSonic FOCUS Plus Platinum to Sonoff. Basic power operations enabling Connect the RTE J11 header to the platform JFP1 header as described in the table: RTE Msi Z790-P J11 pin 9 JFP1 pin 6 (PWR_ON) J11 pin 8 JFP1 pin 7 (RST) J15 pin 1 (GND) JFP1 pin 5 (GND) External flashing enabling Connect the RTE SPI header to the platform as described in the table: RTE SPI header MSI Z790-P J7 pin 1 (Vcc) JTPM1 pin 1 (SPI Power) J7 pin 2 (GND) JTPM1 pin 7 (GND) J7 pin 3 (CS) JTPM1 pin 5 (RESERVED / BIOS SPI CS pin) J7 pin 4 (SCLK) JTPM1 pin 6 (SPI Clock) J7 pin 5 (MISO) JTPM1 pin 3 (MISO) J7 pin 6 (MOSI) JTPM1 pin 4 (MOSI) Note: external access to the flash chip is possible only from the JTPM header. JTPM1 is a 2mm pitch header, you will need 2mm to 2.54mm female-female dupont wires to connect to RTE. Device power status readout Connect the RTE J1 header to the platform JFP1 header as shown in the picture below: The values \u200b\u200bof R1 , R2 , V1 and V2 should meet the relationship according to the formula R1/R2 = V2/V1 . V1 cannot be greater than 3.3V (RTE property). Complete Setup After preparing all of the connections also three activities should be performed to enable all of the test stand features: Connect Sonoff to the mains: Connect the RTE to the Internet by using the Ethernet cable. Connect the RTE to the mains by using the microUSB 5 V/2 A power supply. Complete setup should looks as follows: Theory of operation The following sections describe how to use all of the enabled features: serial connection to the platform, controlling power supply, enabling basic power actions with the platform (power off/power on/reset), external flashing with the RTE, device power status readout. Serial connection The method of setting and using serial connection is described in the Serial connection guide . Power supply controlling Power supply controlling (in this case: controlling the state of Sonoff) should be performed based on the sonoff.sh script implemented in meta-rte (OS image dedicated to the RTE platform). Note, that before using the above-mentioned script, it should be modified and SONOFF_IP parameter should be set in accordance with obtained Sonoff IP address. To perform basic power operations use the below-described commands: Turn on the power supply: ./sonoff on Turn off the power supply: ./sonoff on Basic power operations Basic power operations should be performed based on the rte_ctrl script implemented in meta-rte (OS image dedicated to the RTE platform). To perform basic power operations use the below-described commands: Turn on the platform: rte_ctrl pon Turn off the platform: rte_ctrl poff Reset the platform: rte_ctrl reset Note, that in order for the above commands to work properly, the platform should be powered up: both Sonoff and the power supply must be turned on. External flashing The external flashing procedure should be performed based on the scripts implemented on the RTE platform. To perform the flashing operation reproduce, the below-described steps: By using scp put the requested Dasharo file to the RTE: scp / root@:/tmp/coreboot.rom Where: path_to_firmware - path to firmware, which should send to RTE, firmware_file - the name of the firmware file, which should be sent to RTE, RTE_IP - IP address of the connected RTE. Login to RTE via ssh or minicom . Read the flash chip by executing the following command on RTE: ./flash.sh read tmp/dump.rom If the reading was successful, the output from the command above should contain the phrase Verifying flash... VERIFIED . Write the flash chip by executing the following command on RTE: ./flash.sh write /tmp/coreboot.rom Do not interrupt the flashing procedure in any way (especially by changing connections). It may cause hardware damage! If the reading was successful, the output from the command above should contain the phrase Verifying flash... VERIFIED . Device power status readout To read the current power status use the following command: cat /sys/class/gpio/gpio12/value Example output: 1 means that the platform is turned on. 0 means that the platform is turned off.","title":"Laboratory stand assembly guide"},{"location":"transparent-validation/msi-z790/laboratory-assembly-guide/#laboratory-stand-dedicated-to-msi-pro-z790-p-assembly-guide","text":"","title":"Laboratory stand dedicated to MSI PRO Z790-P assembly guide"},{"location":"transparent-validation/msi-z790/laboratory-assembly-guide/#introduction","text":"This document describes the assembly procedure dedicated to the MSI PRO Z790-P testing stand.","title":"Introduction"},{"location":"transparent-validation/msi-z790/laboratory-assembly-guide/#prerequisites","text":"The below table contains information about all elements which are needed to create the testing stand. MSI PRO Z790-P platform RTE v1.1.0 Sonoff S20 type E 4x standard female-female connection wire 2.54 mm raster 7x standard female-female connection wire 2.54/2.00 mm raster USB-UART converter with 4-wire cable 4-pin header 2.54 mm raster","title":"Prerequisites"},{"location":"transparent-validation/msi-z790/laboratory-assembly-guide/#pre-setup-activities","text":"The following subsections describe the method of preparing all the components of the laboratory stand.","title":"Pre-setup activities"},{"location":"transparent-validation/msi-z790/laboratory-assembly-guide/#connections","text":"The following sections describe how to enable all of the following features: serial connection to the platform, controlling power supply, enabling basic power actions with the platform (power off/power on/reset), external flashing with the RTE, device power status readout.","title":"Connections"},{"location":"transparent-validation/msi-z790/laboratory-assembly-guide/#theory-of-operation","text":"The following sections describe how to use all of the enabled features: serial connection to the platform, controlling power supply, enabling basic power actions with the platform (power off/power on/reset), external flashing with the RTE, device power status readout.","title":"Theory of operation"},{"location":"transparent-validation/muxpi/basic-validation/","text":"muxPi board validation In case of any troubles, first it is recommended to read comprehend Theory of Operations for muxPi devices. Necessary components preparation NanoPi muxPi ETH, microUSB<->USB cables, power supply (5V/2A Dc 5.5/2.1mm jack) 2 SDcards (minimum 8GB each) IDC-uSD adapter (DUT<->SD card) SD card adapter (USB<->SD card) Device bootable from SD card (e.g. RPI) NanoPi setup Prepare microSD card (minimum 8GB) for NanoPi NEO operating system. Download and extract image - link Flash image into microSD card ( Etcher tool could be helpful) muxPi setup Attach NanoPi to muxPi connectors. Plug ETH cable to RJ45 NanoPi port. Plug microUSB<->USB cable to muxPi and your machine. Plug in power supply. Make sure that jumpers are correctly set according to image: Connect to NanoPi using terminal: sudo minicom -D /dev/ttyUSB0 -o -b 115200 ` Save ip address: ifconfig Connect to NanoPi via ssh (with password: fa ): bash ssh root@192.168.4.XXX Or via serial connection. NOTE: Connecting with MuxPi through serial will automatically login as non root user pi with password pi . Validation steps 1. Install WiringNP git clone https://github.com/friendlyarm/WiringNP cd WiringNP/ chmod 755 build ./build verify installation: gpio readall If your installation is successful the following messages will show up: +-----+-----+----------+------+---+-NanoPi-NEO--+------+----------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ | | | 3 .3V | | | 1 || 2 | | | 5V | | | | 12 | 8 | GPIOA12 | ALT5 | 0 | 3 || 4 | | | 5V | | | | 11 | 9 | GPIOA11 | ALT5 | 0 | 5 || 6 | | | 0v | | | | 203 | 7 | GPIOG11 | OFF | 0 | 7 || 8 | 0 | ALT5 | GPIOG6 | 15 | 198 | | | | 0v | | | 9 || 10 | 0 | ALT5 | GPIOG7 | 16 | 199 | | 0 | 0 | GPIOA0 | ALT5 | 0 | 11 || 12 | 0 | OUT | GPIOA6 | 1 | 6 | | 2 | 2 | GPIOA2 | OFF | 0 | 13 || 14 | | | 0v | | | | 3 | 3 | GPIOA3 | OFF | 0 | 15 || 16 | 0 | OFF | GPIOG8 | 4 | 200 | | | | 3 .3v | | | 17 || 18 | 0 | OFF | GPIOG9 | 5 | 201 | | 64 | 12 | GPIOC0 | ALT4 | 0 | 19 || 20 | | | 0v | | | | 65 | 13 | GPIOC1 | ALT4 | 0 | 21 || 22 | 0 | ALT5 | GPIOA1 | 6 | 1 | | 66 | 14 | GPIOC2 | ALT4 | 0 | 23 || 24 | 1 | OUT | GPIOC3 | 10 | 67 | +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+----------+------+---+-NanoPi-NEO--+------+----------+-----+-----+ +-----+----NanoPi-NEO USB/Audio-+----+ | BCM | wPi | Name | Mode | V | Ph | +-----+-----+----------+------+---+----+ | | | 5V | | | 25 | | | | USB-DP1 | | | 26 | | | | USB-DM1 | | | 27 | | | | USB-DP2 | | | 28 | | | | USB-DM2 | | | 29 | | | | IR-RX | | | 30 | | 17 | 19 | GPIOA17 | OFF | 0 | 31 | | | | PCM/I2C | | | 32 | | | | PCM/I2C | | | 33 | | | | PCM/I2C | | | 34 | | | | PCM/I2C | | | 35 | | | | 0V | | | 36 | +-----+-----+----------+------+---+----+ +-----+----NanoPi-NEO Debug UART-+----+ | BCM | wPi | Name | Mode | V | Ph | +-----+-----+----------+------+---+----+ | 4 | 17 | GPIOA4 | ALT5 | 0 | 37 | | 5 | 18 | GPIOA5 | ALT5 | 0 | 38 | +-----+-----+----------+------+---+----+ 2. Cortex-M0 flashing The second controllable unit on the muxPi board is embedded microcontroller STM32 F030C6T6 from Cortex-M0 family. It is required to flash special binary prepared by Tizen group (the code is not open yet, but this process is in progress). To flash muxPi's microcontroller, follow steps below: Make sure that VDD jumper is left open. Download binary file - link . Copy binary to nanoPi: scp root@192.168.4.XXX:/root/ Update package lists (nanoPi): apt-get update Install stm32flash utility (nanoPi): sudo apt-get install stm32flash Export GPIO: gpio mode 3 out and gpio mode 7 out Set Cortex-M0 to \"Flashing mode\": gpio write 7 1 Power up microcontroller: gpio write 3 1 Flash firmware: stm32flash -w /root/firmware-05.bin -v -g 0x0 /dev/ttyS2 Power off microcontroller: gpio write 3 0 Set Cortex-M0 to \"Execution mode\": gpio write 7 0 Power on microcontroller: gpio write 3 1 From now on, muxPi's LCD should light on and display: * MuxPi * HW: 1 .0 SW: 0 .5 3. SD Adapter Connect IDC-uSD adapter to the muxPI board: Insert the microSD card to microSD card slot accessible on the bottom side of muxPi board. To enable microSD card reader, connect to Cortex from MuxPi via minicom: minicom -D /dev/ttyS2 and enter in minicom following commands: ts and then dut NOTE: Each command should return OK Connect IDC-uSD adapter to a SD card adapter plugged into your machine NOTE: You need to force IDC-uSD adapter to insert into SD card adapter (On your machine) Check if device is connected: dmesg -w should help. You should also be able to read and write data to uSD card from file manager. Flash image into microSD card (for RPI or other device bootable form SD card). Disconnect uSD adapter form a SD card adapter and connect to the device (e.g. RPI). Connect device to the power supply, now device should boot via IDC-uSD adapter. 4. Screening It is recommended to use screen program for communication: Install screen: sudo apt-get install screen Open connection (from muxPi): screen /dev/ttyS2 115200,cs8,ixon,ixoff Write help and press Enter. Help output: help --- This help version --- Display version of the firmware echo --- Get ( no arguments ) or set ( 'on' or 'off' ) echo on serial \"console\" : echo [ on | off ] . The default value is on. power --- Get ( no arguments ) or set ( 'on' or 'off' ) or switch off and on ( 'tick' ) power supply for DUT: power [ on | off | tick ] hdmi --- Get ( no arguments ) or set ( 'on' or 'off' ) HDMI HOTPLUG pin: hdmi [ on | off ] dyper --- Get ( no second argument ) or set ( 'on' or 'off' ) DyPer state: dyper 1 | 2 [ on | off ] mux --- Connect microSD card to external connector ( DUT ) or card reader ( ts ) : mux [ dut | ts ] dut --- Connect microSD card and power to DUT: dut ts --- Connect microSD card and power to TS: ts led --- Get ( no second or third argument ) or set ( 'R G B' ) color of led ( 1 | 2 ) , ex: led 1 255 0 255 clr --- Clear oled display text --- Print text on the OLED display: text x y color content draw --- Draw an object on the OLED display: draw object x1 y1 [ x2 y2 ] , objects are: - point x y color - draws one point at given coordinates - line x1 y1 x2 y2 color - draws line between given coordinates - rectangle left top width height color - draws line between given coordinates - circle x y radius color - draws line between given coordinates color must be 'on' , 'off' or 'inv' adc --- Print current adc value of all ( if no arguments are given ) or one specified channel, ex: adc 1 voltage --- Print current voltage [ mV ] of all ( if no arguments are given ) or one specified channel, ex: voltage 1 current --- Print current current [ mA ] being consumed by DUT lthor --- Get ( no second argument ) or set state of lthor control signals: - lthor switch [ usb | uart ] - redirect DUT 's USB wires to NanoPi' s 'usb' or 'uart' - lthor id [ usb | uart ] - switch DUT 's USB to ' usb ' or ' uart ' mode - lthor vbus [on|off] - switch DUT' s VBUS 'on' or 'off' - lthor combo [ usb | uart ] - make DUT and MuxPi USB work in 'usb' or 'uart' mode - no get function key --- Get current state of given key or both if no key number is given: key [ 1 | 2 ] uart --- Get current value of UART voltage or set if new value is given [ in millivolts ] NOTE: help might not display anything. Then try to use minicom. Minicom quick guide: Install minicom: sudo apt-get install minicom Connect via minicom: sudo minicom -D /dev/ttyS2 -o -b 115200 Type: help NOTE: If output is the same as above then basic validation for muxPi is done. Images source: Wiki Tizen","title":"Basic validation"},{"location":"transparent-validation/muxpi/basic-validation/#muxpi-board-validation","text":"In case of any troubles, first it is recommended to read comprehend Theory of Operations for muxPi devices.","title":"muxPi board validation"},{"location":"transparent-validation/muxpi/basic-validation/#necessary-components-preparation","text":"NanoPi muxPi ETH, microUSB<->USB cables, power supply (5V/2A Dc 5.5/2.1mm jack) 2 SDcards (minimum 8GB each) IDC-uSD adapter (DUT<->SD card) SD card adapter (USB<->SD card) Device bootable from SD card (e.g. RPI)","title":"Necessary components preparation"},{"location":"transparent-validation/muxpi/basic-validation/#nanopi-setup","text":"Prepare microSD card (minimum 8GB) for NanoPi NEO operating system. Download and extract image - link Flash image into microSD card ( Etcher tool could be helpful)","title":"NanoPi setup"},{"location":"transparent-validation/muxpi/basic-validation/#muxpi-setup","text":"Attach NanoPi to muxPi connectors. Plug ETH cable to RJ45 NanoPi port. Plug microUSB<->USB cable to muxPi and your machine. Plug in power supply. Make sure that jumpers are correctly set according to image: Connect to NanoPi using terminal: sudo minicom -D /dev/ttyUSB0 -o -b 115200 ` Save ip address: ifconfig Connect to NanoPi via ssh (with password: fa ): bash ssh root@192.168.4.XXX Or via serial connection. NOTE: Connecting with MuxPi through serial will automatically login as non root user pi with password pi .","title":"muxPi setup"},{"location":"transparent-validation/muxpi/basic-validation/#validation-steps","text":"","title":"Validation steps"},{"location":"transparent-validation/muxpi/theory-of-operations/","text":"MuxPi - Theory of Operations Block diagram muxPi setup NanoPi NEO Preparation of the muxPi's \"heart\": Prepare microSD card (minimum 8GB) for NanoPi NEO operating system. Download and extract image - link Flash image into microSD card ( Etcher tool could be helpful) Insert card to NanoPi microSD slot. Attach NanoPi to muxPi connectors. Plug Ethernet cable to RJ45 NanoPi port. Serial communication There are two methods to setup serial communication with muxPi: with microUSB<->USB cable with UART/USB converter Attach USB/UART converter to muxPi's left addon female header ( GND , DBG UART RX , DBG UART TX on pinout image below): and plug USB connector to the computer. Next, open connection in PC terminal by typing: sudo minicom -D /dev/ttyUSB0 -o -b 115200 . /dev/ttyUSB0 is example device - check whether USB0 is the correct one Jumpers configuration UART - pins Vloc & VCC - if jumped then internal voltage generator is used as voltage reference for data lines and powers up target device. If open then voltage reference for data lines comes from target device and internal voltage generator is unused. USB/ETH - determines what USB data lines of one USB HUB are connected to. If first two pins are jumped then USB lines are connected to add-on connector. If last two pins are jumped then these lines are connected tu USB<->ETH converter. If none of the pins are jumped then the only connection is the upper socket of double connector. NOTE: The upper socket of double USB-A connector must be left empty if USB<->ETH is selected or add-on connector is selected and something is connected to these data lines on the addon! NOTE: Both jumpers must be placed in the same position! VDD - if this pins are jumped then the VDD and 3V3 are always on. If this is left open then VDD and 3V3 are controlled by NanoPi. The usage example is setting value of USB ID potentiometer (which is located underneath NanoPi). But when NanoPi NEO is removed there is no way to turn on power for microcontroller (that is when VDD jumper is helpful). NOTE: If there is no particular need then leave this jumper open. Power supply To power on MuxPi with NanoPi attached, plug the 5V/2A DC 5.5/2.1mm power supply jack to the CON1 muxPi's connector. Power consumption of MuxPi should be less then 1A assuming no addons connected. IP address To check which IP address has been assigned, type in terminal: ifconfig . OPTIONAL STEP: To set static IP, create the following file: sudo vi /etc/NetworkManager/NetworkManager.conf Edit NetworkManger.conf and set the value of \"managed\" under \"ifupdown\" to false: [ ifupdown ] managed = false Add network setting to /etc/network/interfaces : sudo vi /etc/network/interfaces Here is sample of /etc/network/interfaces : # The loopback network interface auto lo iface lo inet loopback # network interface not managed by Network Manager allow-hotplug eth0 iface eth0 inet static address 192 .168.4.XXX netmask 255 .255.255.0 gateway 192 .168.4.1 dns-nameservers 192 .168.4.1 Restart the whole device: reboot Now you should be able to connect to device through ssh: ssh root@192.168.4.XXX with the password: fa Install WiringNP Connect to NanoPi NEO through ssh (serial connection automatically login to non root user pi ), then type: git clone https://github.com/friendlyarm/WiringNP cd WiringNP/ chmod 755 build ./build Verify installation: gpio readall If your installation is successful the following messages will show up: +-----+-----+----------+------+---+-NanoPi-NEO--+------+----------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ | | | 3 .3V | | | 1 || 2 | | | 5V | | | | 12 | 8 | GPIOA12 | ALT5 | 0 | 3 || 4 | | | 5V | | | | 11 | 9 | GPIOA11 | ALT5 | 0 | 5 || 6 | | | 0v | | | | 203 | 7 | GPIOG11 | OFF | 0 | 7 || 8 | 0 | ALT5 | GPIOG6 | 15 | 198 | | | | 0v | | | 9 || 10 | 0 | ALT5 | GPIOG7 | 16 | 199 | | 0 | 0 | GPIOA0 | ALT5 | 0 | 11 || 12 | 0 | OUT | GPIOA6 | 1 | 6 | | 2 | 2 | GPIOA2 | OFF | 0 | 13 || 14 | | | 0v | | | | 3 | 3 | GPIOA3 | OFF | 0 | 15 || 16 | 0 | OFF | GPIOG8 | 4 | 200 | | | | 3 .3v | | | 17 || 18 | 0 | OFF | GPIOG9 | 5 | 201 | | 64 | 12 | GPIOC0 | ALT4 | 0 | 19 || 20 | | | 0v | | | | 65 | 13 | GPIOC1 | ALT4 | 0 | 21 || 22 | 0 | ALT5 | GPIOA1 | 6 | 1 | | 66 | 14 | GPIOC2 | ALT4 | 0 | 23 || 24 | 1 | OUT | GPIOC3 | 10 | 67 | +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+ | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM | +-----+-----+----------+------+---+-NanoPi-NEO--+------+----------+-----+-----+ +-----+----NanoPi-NEO USB/Audio-+----+ | BCM | wPi | Name | Mode | V | Ph | +-----+-----+----------+------+---+----+ | | | 5V | | | 25 | | | | USB-DP1 | | | 26 | | | | USB-DM1 | | | 27 | | | | USB-DP2 | | | 28 | | | | USB-DM2 | | | 29 | | | | IR-RX | | | 30 | | 17 | 19 | GPIOA17 | OFF | 0 | 31 | | | | PCM/I2C | | | 32 | | | | PCM/I2C | | | 33 | | | | PCM/I2C | | | 34 | | | | PCM/I2C | | | 35 | | | | 0V | | | 36 | +-----+-----+----------+------+---+----+ +-----+----NanoPi-NEO Debug UART-+----+ | BCM | wPi | Name | Mode | V | Ph | +-----+-----+----------+------+---+----+ | 4 | 17 | GPIOA4 | ALT5 | 0 | 37 | | 5 | 18 | GPIOA5 | ALT5 | 0 | 38 | +-----+-----+----------+------+---+----+ Cortex-M0 flashing The second controllable unit on the muxPi board is embedded microcontroller STM32 F030C6T6 from Cortex-M0 family. It is required to flash special binary prepared by Tizen group (the code is not open yet, but this process is in progress). To flash muxPi's microcontroller, follow steps below: Make sure that VDD jumper is left open. Download binary file - link Copy binary to nanoPi: scp root@192.168.4.XXX:/root/ Update package lists (nanoPi): apt-get update Install stm32flash utility (nanoPi): sudo apt-get install stm32flash Export GPIO: gpio mode 3 out and gpio mode 7 out Set Cortex-M0 to \"Flashing mode\": gpio write 7 1 Power up microcontroller: gpio write 3 1 Flash firmware: stm32flash -w firmware-05.bin -v -g 0x0 /dev/ttyS2 Power off microcontroller: gpio write 3 0 Set Cortex-M0 to \"Execution mode\": gpio write 7 0 Power on microcontroller: gpio write 3 1 From now on, muxPi's LCD should light on and display: * MuxPi * HW: 1 .0 SW: 0 .5 Software installation NOTE: It is recommended to cross-compile muxPi's software on your host machine Building using docker Prerequisites: Docker , Make . Clone repository: git clone https://github.com/SamsungSLAV/muxpi.git . Change directory: cd muxpi/sw/nanopi . Build muxPi software: make docker-build Resulting binaries will be in bin directory. Building from source Prerequisites: git , go (1.10+) Go get it: go get github.com/SamsungSLAV/muxpi Change directory: cd $GOPATH/src/github.com/SamsungSLAV/muxpi/sw/nanopi Download dependencies: go get ./... Build binaries: mkdir -p bin GOARCH = arm GOOARM = 7 GOOS = linux go build -o bin/stm ./cmd/stm/ GOARCH = arm GOOARM = 7 GOOS = linux go build -o bin/fota ./cmd/fota/ Install muxpi-power muxpi-power - tool for controlling power supply for MuxPi's main board. Copy muxpi-power files (change XXX to proper values): scp power/muxpi-power root@192.168.4.XXX:/usr/bin scp power/systemd/muxpi-power.service root@192.168.4.XXX:/etc/systemd/system On your MuxPi device, enable and start muxpi-power service: systemctl enable muxpi-power.service systemctl start muxpi-power.service Install stm stm - tools/libs for communicating with STM32F030 microcontroller. Copy stm binary and systemd files (change XXX to proper values): scp bin/stm_armv7 root@192.168.4.XXX:/usr/bin/stm scp stm/systemd/stm.service root@192.168.4.XXX:/etc/systemd/system scp stm/systemd/stm-user.socket root@192.168.4.XXX:/etc/systemd/system scp stm/systemd/stm.socket root@192.168.4.XXX:/etc/systemd/system scp stm/stm root@192.168.4.XXX:/usr/local/bin/stm On your MuxPi device - create group stm and add your user: groupadd stm usermod -aG stm root On your MuxPi device - enable stm sockets: systemctl daemon-reload systemctl enable stm.socket stm-user.socket systemctl start stm.socket stm-user.socket Install fota fota - tools/libs for flashing devices - usually microSD card. Copy fota binary to MuxPi device (change XXX to proper values): scp bin/fota_armv7 root@192.168.4.XXX:/usr/bin/fota On your MuxPi device - create a symlink from /usr/local/bin/fota to /usr/bin/fota/ . Only /usr/local/bin/fota/ should be used by software interfacing with MuxPi. This allows to swap fota implementation to your preferred tool: ln -s /usr/bin/fota /usr/local/bin/fota DUT setup DUT power supply MuxPi is capable of: power switching on/off current measurement Power switching - it can switch power supply up to 5A and 250VAC. One line is connected directly and one is connected through relay. Current measurement - It is able to measure up to -/+5A and is galvanically isolated from the rest of components thanks to use of Hall effect current sensor ACS712ELCTR-05B-T. It is connected to unswitchable power line. The current sensor is bypassed with 3 0R resistors that can be populated if current sensor is not needed. These resistors must not be populated if current measurement is required. UART connections GND - digital ground of MuxPi board N.C. - not connected Vloc - local voltage - voltage may be generated internally on MuxPi if the DUT, or anything else we are connecting to, has not power pin. Nn such case voltage generator must be set to desired value and activated. Command \"uart 3300\" must be sent to Cortex-M0, where 3300 is desired voltage given in millivolts. The voltage range is from 0 to 5000mv. Pins Vloc an VCC must be connected each other. Typical jumper is a perfect connector for this purpose. Vloc may be also used to power up additional converter RS232C. For example if converter to RS232C (+/-12v) must be used then it may be powered from Vloc pin. VCC - power of DUT. If dut has no such power pin then it must be connected to Vloc and vloc must be configured properly as stated above. DUT RX - receiver data line in the DUT - through this line MuxPi sends data to the DUT DUT TX - transmitter data line in the DUT - from this line MuxPi reads data form the DUT DUT CTS - Clear To Send - hardware handshake DUT RTS - Ready To Send - hardware handshake Example configuration for OrangePi (DUT) uart connection: Set 3.3V Vloc (/dev/ttyS2 terminal): uart 3300 Attach UART jumper ( Vloc and Vcc ). Connect GND, RX and TX (without crossing). Open connection: screen /dev/ttyS1 115200,cs8,ixon,ixoff NOTE: RX , TX , XTS , RTS are crossed on the board so you don't need to cross the wires by yourself. NOTE: A device powered from Vloc mustn't draw more than 50mA of current. Add-ons Add-ons headers are extensions for attaching new shields or simply using NanoPi and CortexM0 interfaces: 5V - power supply - not switchable - always present 3V3 - switchable (controlled by NanoPi) 3.3V power supply I2C0 SDA - I2C0 SDA line connected to NanoPi I2C0 SCL - I2C0 SCL line connected to NanoPi DBG UART TX - UART0 (debug) of NanoPi DBG UART RX - UART0 (debug) of NanoPi USB B+/- , USB A+/- USB host lines connected to NanoPi through USB HUB GND - ground lines N.C . - not connected SPI0 CLK - SPI0 clock line connected to NanoPi SPI0 MOSI - SPI0 \"master output slave input\" line connected to NanoPi SPI0 CS - SPI0 \"chip select\" line connected to NanoPi SPI0 MISO - SPI0 \"master input slave output\" line connected to NanoPi PI GPIO 1,2,3 - GPIO (General Purpose Input/Output) connected to NanoPi NEO. Ports PG11, PL11, PA17 respectively. ST GPIO 1,2,3 - GPIO connected to Cortex-M0 microcontroller. Ports PB3, PB4, PB5 of STM32F03C6T6 respectively. ADC1,2 - analog inputs connected to analog to digital converter of Cortex-M0 microcontroller. Ports PA1, PA2 respectively. Voltage range of this input is 0 to 3.3V. This lines are not buffered in any way so attention must paid when dealing with them. GND - ground lines NOTE: PI GPIO 1 has additional special function. It is connected to Cortex-M0 Boot0 pin which enables firmware download mode during microcontroller boot. 1 - enables this mode while 0 disables it. So it is useless as GPIO when the microcontroller is being booted. DyPers Dyper is a small, electromagnetic relay which is controllable by software. There are 2 dypers on MuxPi board. Each of them has two channels. Both channels are switched at the same time with the same command. So both of them can be on and both can be off but there is no way to turn one on and one off. They can be controlled by CortexM0 - examples here . ETH and USB ETH and upper USB of double USB socket share the same USB channel from USB HUB. Jumpers located at the rear side of double USB connector allow to disconnect this USB from ETH and connect to add-on connector. Details on this topic are covered in jumpers section. USB-M This is USB connector dedicated to mobile devices from Samsung company. This connector has controllable Vbus line and also controllable ID line. More information about this type of interface, it's capabilities and example of flashing smartphone can be found here . SD Adapter This connector is used to connect microSD card, put into MuxPi, to a DUT. This connector requires IDC-uSD cable adapter: Target microSD card must be attached to microSD card reader accessible on bottom side of muxPi board. To enable microSD card reader, connect to Cortex from MuxPi via minicom: minicom -D /dev/ttyS2 and enter in minicom following commands: ts and then: dut Each command should return OK After doing this you can connect the uSD's end of the cable adapter to the external card reader and check if it is correctly recognized by PC. You should also be able to run the microcontroller from the card attached to MuxPi if the card contains appropriate OS. Interacting with muxPi Connection with NanoPi User can simply open SSH connection by (password: fa ): ssh root@ or use serial connection mentioned here NOTE: Connecting with MuxPi through serial will automatically login as non root user pi with password pi . User interface Features operable directly via NanoPi GPIOs: #Pin (board) #WiringNP Description Low state \"0\" High state \"1\" 12 1 LED1 LED off LED on 13 2 LED2 LED off LED on 15 3 Power (Cortex m0) Power off Power on 7 7 Boot (Cortex m0) Execution mode Flashing mode NOTE: Initially, above GPIOs are not exported. Set GPIOs mode with gpio mode <#WiringNP> out . Example LED1 control: LED1 on: gpio write 1 1 LED1 off: gpio write 1 0 Example of flashing Cortex-M0 is described here . The microcontroller is connected to NanoPi NEO with UART. This UART is connected to third UART of NanoPi - /dev/ttyS2. The port is configured to 115200,8,N1 and cannot be changed without modification of the firmware. The protocol is text based, simple and human readable. Each command has to be ended with 'n' or 'r' character. Each command is confirmed with 'OK' string or error string. It is recommended to use screen program for communication: Install screen: sudo apt-get install screen Open connection (from muxPi): screen /dev/ttyS2 115200,cs8,ixon,ixoff Write help and press Enter . Features operable through Cortex-M0 microcontroller (help output): help --- This help version --- Display version of the firmware echo --- Get ( no arguments ) or set ( 'on' or 'off' ) echo on serial \"console\" : echo [ on | off ] . The default value is on. power --- Get ( no arguments ) or set ( 'on' or 'off' ) or switch off and on ( 'tick' ) power supply for DUT: power [ on | off | tick ] hdmi --- Get ( no arguments ) or set ( 'on' or 'off' ) HDMI HOTPLUG pin: hdmi [ on | off ] dyper --- Get ( no second argument ) or set ( 'on' or 'off' ) DyPer state: dyper 1 | 2 [ on | off ] mux --- Connect microSD card to external connector ( DUT ) or card reader ( ts ) : mux [ dut | ts ] dut --- Connect microSD card and power to DUT: dut ts --- Connect microSD card and power to TS: ts led --- Get ( no second or third argument ) or set ( 'R G B' ) color of led ( 1 | 2 ) , ex: led 1 255 0 255 clr --- Clear oled display text --- Print text on the OLED display: text x y color content draw --- Draw an object on the OLED display: draw object x1 y1 [ x2 y2 ] , objects are: - point x y color - draws one point at given coordinates - line x1 y1 x2 y2 color - draws line between given coordinates - rectangle left top width height color - draws line between given coordinates - circle x y radius color - draws line between given coordinates color must be 'on' , 'off' or 'inv' adc --- Print current adc value of all ( if no arguments are given ) or one specified channel, ex: adc 1 voltage --- Print current voltage [ mV ] of all ( if no arguments are given ) or one specified channel, ex: voltage 1 current --- Print current current [ mA ] being consumed by DUT lthor --- Get ( no second argument ) or set state of lthor control signals: - lthor switch [ usb | uart ] - redirect DUT 's USB wires to NanoPi' s 'usb' or 'uart' - lthor id [ usb | uart ] - switch DUT 's USB to ' usb ' or ' uart ' mode - lthor vbus [on|off] - switch DUT' s VBUS 'on' or 'off' - lthor combo [ usb | uart ] - make DUT and MuxPi USB work in 'usb' or 'uart' mode - no get function key --- Get current state of given key or both if no key number is given: key [ 1 | 2 ] uart --- Get current value of UART voltage or set if new value is given [ in millivolts ] Images source: Wiki Tizen","title":"Theory of Operations"},{"location":"transparent-validation/muxpi/theory-of-operations/#muxpi-theory-of-operations","text":"","title":"MuxPi - Theory of Operations"},{"location":"transparent-validation/muxpi/theory-of-operations/#block-diagram","text":"","title":"Block diagram"},{"location":"transparent-validation/muxpi/theory-of-operations/#muxpi-setup","text":"","title":"muxPi setup"},{"location":"transparent-validation/muxpi/theory-of-operations/#software-installation","text":"NOTE: It is recommended to cross-compile muxPi's software on your host machine","title":"Software installation"},{"location":"transparent-validation/muxpi/theory-of-operations/#dut-setup","text":"","title":"DUT setup"},{"location":"transparent-validation/muxpi/theory-of-operations/#interacting-with-muxpi","text":"","title":"Interacting with muxPi"},{"location":"transparent-validation/pikvm/assembly-and-validation/","text":"Presale device assembly and validation Introduction This document describes the assembly procedure of the PiKVM (device based on Raspberry Pi 4 or Raspberry Pi Zero 2W) with components specified in requirements . Requirements Note that the PiKVM build might be basing on two types of Raspberry Pi: RPi 4 or RPi Zero 2W. Hardware components necessary to build PiKVM on RPi Zero 2W: Raspberry Pi Zero 2W, microSD card 16 GB, USB-A 5 V 3.1 A charger (female socket), HDMI to CSI-2 bridge, Raspberry Pi Zero Camera Cable, HDMI-HDMI cable, USB A - micro USB cable (male, male), Y-splitter cable. (Optional) UART -> USB converter Hardware components necessary to build PiKVM on RPi 4: Raspberry Pi 4, microSD card 16 GB, USB-A 5 V 3.1 A charger (female socket), HDMI to CSI-2 bridge, HDMI-HDMI cable, USB A - USB C cable, Y-splitter cable. (Optional) UART -> USB converter Device assembly The following section of the documentation shows the assembly procedure for PiKVM including setting up a WiFi connection and methods for reading device IP. Set based on RPi Zero 2W preparation The section below describes the method of preparing PiKVM hardware based on RPI Zero 2W. Connect SD card and HDMI to CSI-2 bridge with camera cable: Block USB power from device under test by preparing USB cable: Connect HDMI cable from the device under test to HDMI -> CSI-2 bridge. Connect the USB splitter to the Raspberry Pi micro USB port. Connect one side of the splitter to USB-A 5 V 3.1 A charger. Connect other side to device under test via USB cable with blocked power. Set based on RPi 4 preparation To build PiKVM on RPi 4, use the RPI 0 set documentation and replace the cable for connecting to the RPi and the cable for connecting with the CSI-2 bridge. OS image building and flashing Prepare the OS in accordance with the PiKVM Handbook . Flash the SD card using bmaptool or balenaEtcher . to do this by balenaEtcher go to the producer site and follow his procedure on how to download and flash an SD card. to do this by bmaptool reproduce the following steps: install bmaptool by opening the terminal and typing the following command: sudo apt install bmap-tools create the bmap by typing the following command: bmaptool create /path/to/your/image > /path/where/you/want/bmap/file/saved/bmapfilename.bmap flash image to the SD card by typing the following command: sudo bmaptool copy --bmap ~/path/where/your/bmap/file/is/located /path/where/your/image/is/located /path/to/memory/device Insert the flashed SD card into the SD card slot on the PiKVM. Set up WiFi The section below describes the method of setting up a WiFi connection for the PiKVM. This section is dedicated especially to the PiKVMs based on RPi Zero 2W, which is not equipped with an Ethernet port. Mount the first partition of the memory card. Edit or make the pikvm.txt file in the following convention: FIRSTBOOT = 1 WIFI_ESSID = \"name\" WIFI_PASSWD = \"password\" Note: Do not remove line FIRSTBOOT=1 or FIRST_BOOT-1 line. It may occur with troubles with the device starts. Unmount the first partition of the memory card. Note: In some countries, in which WiFi channel 13 is in use, the device might not connect to the WiFi. To prevent this, the router should be configured properly: channels 12-14 or Auto Scan mode should be disabled. Read IP address The section below describes the known methods of reading PiKVM IP. First option: from os repository run the following command: make scan Example output: . . . ===== Toolbox image is ready ===== ===== Searching for Pis in the local network ===== docker run \\ --rm \\ --tty \\ --net host \\ pi-builder-arm-toolbox arp-scan --localnet | grep -Pi \"\\s(b8:27:eb:|dc:a6:32:)\" || true 192 .168.4.13 dc:a6:32:aa:aa:aa Raspberry Pi Trading Ltd Second option: open the web interface of your router and find the list of issued IP addresses. Localization of the mentioned list depends on the router model. Third option: solder pins for serial output as on images below: Check Raspberry Pi Zero2W IP by booting to system and reading information via serial (eg.) UART -> USB converter. Device validation Connect the device to the mains. Login to RTE via ssh (by using earlier obtained IP address) or minicom (by using USB-UART converter with 3 wire cables). FullHD stream In order to enable FullHD stream (1920x1080) instead of 1200x720. One of the reasons to enable FullHD is that certain proprietary BIOSes implement a GUI setup which scales well only for Full HD or higher resolutions (in extreme cases it can even crash if lower than FullHD resolution is used). To enable FullHD resolution, one has to replace the EDID on PiKVM. To do so: Remount the filesystem to RW if necessary using rw command. Save the follow HEX to /root/edid.hex : 00FFFFFFFFFFFF005262888800888888 1C150103800000780AEE91A3544C9926 0F505425400001000100010001000100 010001010101D32C80A070381A403020 350040442100001E7E1D00A050001940 3020370080001000001E000000FC0050 492D4B564D20566964656F0A000000FD 00323D0F2E0F000000000000000001C4 02030400DE0D20A03058122030203400 F0B400000018E01500A0400016303020 3400000000000018B41400A050D01120 3020350080D810000018AB22A0A05084 1A3030203600B00E1100001800000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000045 Execute: kvmd-edidconf --edid=/root/edid.hex --apply Execute: kvmd-edidconf --import=/root/edid.hex Switch the filesystem back to RO using ro command. When PiKVM is connected to the platform, the BIOS or OS should initialize the display with 1920x1080 resolution. Where to buy? The PiKVM is available in our online shop .","title":"Assembly and validation"},{"location":"transparent-validation/pikvm/assembly-and-validation/#presale-device-assembly-and-validation","text":"","title":"Presale device assembly and validation"},{"location":"transparent-validation/pikvm/assembly-and-validation/#introduction","text":"This document describes the assembly procedure of the PiKVM (device based on Raspberry Pi 4 or Raspberry Pi Zero 2W) with components specified in requirements .","title":"Introduction"},{"location":"transparent-validation/pikvm/assembly-and-validation/#requirements","text":"Note that the PiKVM build might be basing on two types of Raspberry Pi: RPi 4 or RPi Zero 2W. Hardware components necessary to build PiKVM on RPi Zero 2W: Raspberry Pi Zero 2W, microSD card 16 GB, USB-A 5 V 3.1 A charger (female socket), HDMI to CSI-2 bridge, Raspberry Pi Zero Camera Cable, HDMI-HDMI cable, USB A - micro USB cable (male, male), Y-splitter cable. (Optional) UART -> USB converter Hardware components necessary to build PiKVM on RPi 4: Raspberry Pi 4, microSD card 16 GB, USB-A 5 V 3.1 A charger (female socket), HDMI to CSI-2 bridge, HDMI-HDMI cable, USB A - USB C cable, Y-splitter cable. (Optional) UART -> USB converter","title":"Requirements"},{"location":"transparent-validation/pikvm/assembly-and-validation/#device-assembly","text":"The following section of the documentation shows the assembly procedure for PiKVM including setting up a WiFi connection and methods for reading device IP.","title":"Device assembly"},{"location":"transparent-validation/pikvm/assembly-and-validation/#device-validation","text":"Connect the device to the mains. Login to RTE via ssh (by using earlier obtained IP address) or minicom (by using USB-UART converter with 3 wire cables).","title":"Device validation"},{"location":"transparent-validation/pikvm/assembly-and-validation/#fullhd-stream","text":"In order to enable FullHD stream (1920x1080) instead of 1200x720. One of the reasons to enable FullHD is that certain proprietary BIOSes implement a GUI setup which scales well only for Full HD or higher resolutions (in extreme cases it can even crash if lower than FullHD resolution is used). To enable FullHD resolution, one has to replace the EDID on PiKVM. To do so: Remount the filesystem to RW if necessary using rw command. Save the follow HEX to /root/edid.hex : 00FFFFFFFFFFFF005262888800888888 1C150103800000780AEE91A3544C9926 0F505425400001000100010001000100 010001010101D32C80A070381A403020 350040442100001E7E1D00A050001940 3020370080001000001E000000FC0050 492D4B564D20566964656F0A000000FD 00323D0F2E0F000000000000000001C4 02030400DE0D20A03058122030203400 F0B400000018E01500A0400016303020 3400000000000018B41400A050D01120 3020350080D810000018AB22A0A05084 1A3030203600B00E1100001800000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000045 Execute: kvmd-edidconf --edid=/root/edid.hex --apply Execute: kvmd-edidconf --import=/root/edid.hex Switch the filesystem back to RO using ro command. When PiKVM is connected to the platform, the BIOS or OS should initialize the display with 1920x1080 resolution.","title":"FullHD stream"},{"location":"transparent-validation/pikvm/assembly-and-validation/#where-to-buy","text":"The PiKVM is available in our online shop .","title":"Where to buy?"},{"location":"transparent-validation/rte/introduction/","text":"RTE Introduction RTE is certified Open Source Hardware , so based on published schematics you can build and modify PCB yourself. RTE is a hat designed for Orange Pi Zero board which runs specially crafted Linux distribution using the Yocto Project. RTE boards are used for controlling Device Under Test fully remotely through the network interface. Most common applications are: debugging tasks, flashing firmware, controlling GPIOs power management for Device Under Test . Where to buy? RTE can be also bought in our 3mdeb shop . Full Remote Testing Environment set includes: Category Description Quantity shield Remote Testing Environment v1.1.0 1 control unit Orange Pi Zero 256MB RAM version 1 power supply MicroUSB 5V/2A 1 storage SanDisk 16GB microSD card (with preinstalled compatible system) 1 clip Pomona 8-pin SOIC clip for Device Under Test SPI interface 1 cables standard female-female connection wire 2.56mm raster 8 cables IDC 8-pin wires for Device Under Test SPI interface 1 cables DC Jack - DC Jack power cable for Device Under Test 1 cables RS232 D-Sub 9P/9P cable for serial communication 1 jumpers jumper for UART OUTPUT SELECT header 2 spacers Polyamide M3 spacers and bolts 4 Why choose 3mdeb RTE? high accessibility and flexibility test your device from any location. efficiency simplify validation: write one script and run it on unlimited platforms. Don\u2019t repeat yourself! independent development open hardware license: modify, upgrade and set it as you like. All blueprints are at your disposal. instant setup intuitive connection: you do not need to be a certified engineer. automation time is money: let the machine do all the work for you","title":"Introduction"},{"location":"transparent-validation/rte/introduction/#rte-introduction","text":"RTE is certified Open Source Hardware , so based on published schematics you can build and modify PCB yourself. RTE is a hat designed for Orange Pi Zero board which runs specially crafted Linux distribution using the Yocto Project. RTE boards are used for controlling Device Under Test fully remotely through the network interface. Most common applications are: debugging tasks, flashing firmware, controlling GPIOs power management for Device Under Test .","title":"RTE Introduction"},{"location":"transparent-validation/rte/introduction/#where-to-buy","text":"RTE can be also bought in our 3mdeb shop . Full Remote Testing Environment set includes: Category Description Quantity shield Remote Testing Environment v1.1.0 1 control unit Orange Pi Zero 256MB RAM version 1 power supply MicroUSB 5V/2A 1 storage SanDisk 16GB microSD card (with preinstalled compatible system) 1 clip Pomona 8-pin SOIC clip for Device Under Test SPI interface 1 cables standard female-female connection wire 2.56mm raster 8 cables IDC 8-pin wires for Device Under Test SPI interface 1 cables DC Jack - DC Jack power cable for Device Under Test 1 cables RS232 D-Sub 9P/9P cable for serial communication 1 jumpers jumper for UART OUTPUT SELECT header 2 spacers Polyamide M3 spacers and bolts 4","title":"Where to buy?"},{"location":"transparent-validation/rte/introduction/#why-choose-3mdeb-rte","text":"high accessibility and flexibility test your device from any location. efficiency simplify validation: write one script and run it on unlimited platforms. Don\u2019t repeat yourself! independent development open hardware license: modify, upgrade and set it as you like. All blueprints are at your disposal. instant setup intuitive connection: you do not need to be a certified engineer. automation time is money: let the machine do all the work for you","title":"Why choose 3mdeb RTE?"},{"location":"transparent-validation/rte/revision-history/","text":"Revision history v1.1.0 added Open hardware logo added SW1 reset button added D5 relay state LED indicator added J16 2x3pin UART OUTPUT SELECT header added J18 1x2pin UART1 header added 1.8V stabilizer populated SPI Vcc pin modified capacitors near MAX3232 SOIC reduced OC buffers GPIO header (J11) from 12 to 9 pin eliminated issue with J6 USB port (unreliable detection of USB devices) v1.0.0 added RoHS logo added Crossed Wheelie Bin logo modified footprints of the pin headers v0.5.3 enlarged added holes v0.5.2 modified I2C GPIO expander outputs connections (now 4 of them are connected to the dedicated header) modified version number on board removed SPI header for APU recovery with output pin role information labels removed 7 and 8 pin of SPI header with GPIO expander connection v0.5.1 added micro USB connector for power supply added 5 V power supply pins added SPI connector for APU SPI recovery added fiducials on the bottom layer added pins information labels modified relay control system elements placement modified SPI connector for APU paths placement modified project text descriptions removed 2 pin GPIO expander connector v0.5 added 5 V power supply signal diode (red) + limiting current resistor added 3.3 V power supply signal diode (orange) + limiting current resistor relay NO/NC connection switched to the previous configuration switched SPI1_MISO with SPI1_MOSI output mirrored RS232 socket pads removed I2C pull-up resistors v0.3.6 relay NO/NC connection switched v0.3.5 enlarged the hole diameter by 0.1 mm v0.3.4 added 3mdeb logo and board name on PCB modified elements marks placing v0.3.3 added SPI output IO pins connection with GPIO added PCB mechanical schematic added I2C INT pins connection added mounting holes added fiducials modified MOSFET transistor pinout numeration modified USB footprint from horizontal to vertical modified I2C GPIO expander with OC buffers connection v0.3.2 added mounting holes modified relay pinout removed I2C to GND connection v0.3.1 modified power supply from 5V to 3V3 for I2C bus MCP23017 , and MAX3232 removed capacitors connected to the I2C bus v0.3 added I2C bus with output header added MCP23017 I2C GPIO expander added second SN74LS06 OC buffer added relay with required neighboring items added MAX3232 RS232 electrical level changer added RS232 socket added GPIO output header for pins unused to OC buffer control modified some of input pins connection removed ARK joint for the relay module removed header for relay module control","title":"Revision History"},{"location":"transparent-validation/rte/revision-history/#revision-history","text":"","title":"Revision history"},{"location":"transparent-validation/rte/revision-history/#v110","text":"added Open hardware logo added SW1 reset button added D5 relay state LED indicator added J16 2x3pin UART OUTPUT SELECT header added J18 1x2pin UART1 header added 1.8V stabilizer populated SPI Vcc pin modified capacitors near MAX3232 SOIC reduced OC buffers GPIO header (J11) from 12 to 9 pin eliminated issue with J6 USB port (unreliable detection of USB devices)","title":"v1.1.0"},{"location":"transparent-validation/rte/revision-history/#v100","text":"added RoHS logo added Crossed Wheelie Bin logo modified footprints of the pin headers","title":"v1.0.0"},{"location":"transparent-validation/rte/revision-history/#v053","text":"enlarged added holes","title":"v0.5.3"},{"location":"transparent-validation/rte/revision-history/#v052","text":"modified I2C GPIO expander outputs connections (now 4 of them are connected to the dedicated header) modified version number on board removed SPI header for APU recovery with output pin role information labels removed 7 and 8 pin of SPI header with GPIO expander connection","title":"v0.5.2"},{"location":"transparent-validation/rte/revision-history/#v051","text":"added micro USB connector for power supply added 5 V power supply pins added SPI connector for APU SPI recovery added fiducials on the bottom layer added pins information labels modified relay control system elements placement modified SPI connector for APU paths placement modified project text descriptions removed 2 pin GPIO expander connector","title":"v0.5.1"},{"location":"transparent-validation/rte/revision-history/#v05","text":"added 5 V power supply signal diode (red) + limiting current resistor added 3.3 V power supply signal diode (orange) + limiting current resistor relay NO/NC connection switched to the previous configuration switched SPI1_MISO with SPI1_MOSI output mirrored RS232 socket pads removed I2C pull-up resistors","title":"v0.5"},{"location":"transparent-validation/rte/revision-history/#v036","text":"relay NO/NC connection switched","title":"v0.3.6"},{"location":"transparent-validation/rte/revision-history/#v035","text":"enlarged the hole diameter by 0.1 mm","title":"v0.3.5"},{"location":"transparent-validation/rte/revision-history/#v034","text":"added 3mdeb logo and board name on PCB modified elements marks placing","title":"v0.3.4"},{"location":"transparent-validation/rte/revision-history/#v033","text":"added SPI output IO pins connection with GPIO added PCB mechanical schematic added I2C INT pins connection added mounting holes added fiducials modified MOSFET transistor pinout numeration modified USB footprint from horizontal to vertical modified I2C GPIO expander with OC buffers connection","title":"v0.3.3"},{"location":"transparent-validation/rte/revision-history/#v032","text":"added mounting holes modified relay pinout removed I2C to GND connection","title":"v0.3.2"},{"location":"transparent-validation/rte/revision-history/#v031","text":"modified power supply from 5V to 3V3 for I2C bus MCP23017 , and MAX3232 removed capacitors connected to the I2C bus","title":"v0.3.1"},{"location":"transparent-validation/rte/revision-history/#v03","text":"added I2C bus with output header added MCP23017 I2C GPIO expander added second SN74LS06 OC buffer added relay with required neighboring items added MAX3232 RS232 electrical level changer added RS232 socket added GPIO output header for pins unused to OC buffer control modified some of input pins connection removed ARK joint for the relay module removed header for relay module control","title":"v0.3"},{"location":"transparent-validation/rte/v1.1.0/flashing-guide/","text":"Flashing guide This document describes how to set up external flashing for the devices using RTE. NS5x/7x 12th Generation Prerequisites Prepared RTE WSON8 probe Flashing Unscrew the bottom cover of the laptop. Disconnect the battery All power must be removed from the laptop during flashing. Localize the flash chip. Take the WSON8 probe and locate the white dot on the needles side. The dot indicates the first reference pin that should be connected to the pin on the flash chip also marked with a dot. Connect the cables coming out from the WSON8 probe to the SPI header according to the pictures and table below. Top view of flash chip: Table with all required connections: RTE SPI header Flash Chip Vcc VCC CS CS# MISO (SO) SO (IO1) GND VSS SCLK SCLK MOSI (SI) SI Note: both the SPI header and the WSON8 probe have 8-pin headers. Pins marked as NC on the RTE board and as IO2 and IO3 on the flash chip do not require a connection. Example connection appearance: Put the flash script on RTE: The next steps require the device with Linux OS, it is possible to do this on e.g. Windows, but the procedure will be different. Open the terminal and run the following commands: git clone https://github.com/3mdeb/RteCtrl.git cd RteCtrl/scripts/ Use scp to transfer flash script, in places marked with XX enter the RTE IP address, which you can check with the command ip a : scp flash.sh root@XX.XX.XX.XX:/home/root/ Login to RTE via ssh or minicom . Connect and hold the WSON8 probe to the flash chip. Read the flash chip by executing the following command on RTE: ./flash.sh read dump.rom If the reading was successful, the output from the command above should contain the phrase Verifying flash... VERIFIED. . Only after the entire script has been executed, the WSON8 probe can be disconnected. Connect and hold again the WSON8 probe to the flash chip. Write the flash chip by executing the following command on RTE: ./flash.sh write coreboot.rom If the writing was successful, the output from the command above should contain the phrase Verifying flash... VERIFIED. . Only after the entire script has been executed, the WSON8 probe can be disconnected. Reconnect the battery and screw in the bottom cover. Power on the device. If the platform is booting up and basic functionalities are working, the entire procedure was successful.","title":"Flashing Guide"},{"location":"transparent-validation/rte/v1.1.0/flashing-guide/#flashing-guide","text":"This document describes how to set up external flashing for the devices using RTE.","title":"Flashing guide"},{"location":"transparent-validation/rte/v1.1.0/flashing-guide/#ns5x7x-12th-generation","text":"","title":"NS5x/7x 12th Generation"},{"location":"transparent-validation/rte/v1.1.0/quick-start-guide/","text":"Quick start guide The canonical example of RTE usage is hooking it to some hardware for SPI flashing, power control and serial logs gathering. This document describes the common preparation of RTE without listed functions. Prerequisites RTE board (this document is based on v1.1.0) Micro-USB 5V 2.5A power supply Orange Pi SD card Ethernet cable USB-UART converter with 3 wire cables Ubuntu (based on 22.04) Preparation of RTE Download the latest version of the RTE image from the meta-rte repository . Flash the SD card using bmaptool or balenaEtcher . to do this by balenaEtcher go to the producer site and follow his procedure on how to download and flash an SD card. to do this by bmaptool reproduce the following steps: install bmaptool by opening the terminal and typing the following command: sudo apt install bmap-tools create the bmap by typing the following command: bmaptool create /path/to/your/image > /path/where/you/want/bmap/file/saved/bmapfilename.bmap flash image to the SD card by typing the following command: sudo bmaptool copy --bmap ~/path/where/your/bmap/file/is/located /path/where/your/image/is/located /path/to/memory/device Insert Orange Pi into RTE. Insert SD card into Orange Pi. Connect the ethernet cable to Orange Pi. Plug the USB-UART converter into your computer and connect its pins with RTE J2 Header . (you may need a USB extension cable) UART Converter RTE J2 Header GND GND TXD RX RXD TX Open the serial connection with RTE from your PC using a previously connected USB-UART converter by executing the following command: sudo minicom -D /dev/ttyUSB Substitute with the device number corresponding to your USB-UART Converter for example /dev/ttyUSB0 . The dmesg command allows to identify the latest connected devices. Plug the power supply into the RTE J17 Micro-USB slot. Login into the device by using the default credentials: Login: root Password: meta-rte","title":"Quick Start Guide"},{"location":"transparent-validation/rte/v1.1.0/quick-start-guide/#quick-start-guide","text":"The canonical example of RTE usage is hooking it to some hardware for SPI flashing, power control and serial logs gathering. This document describes the common preparation of RTE without listed functions.","title":"Quick start guide"},{"location":"transparent-validation/rte/v1.1.0/quick-start-guide/#prerequisites","text":"RTE board (this document is based on v1.1.0) Micro-USB 5V 2.5A power supply Orange Pi SD card Ethernet cable USB-UART converter with 3 wire cables Ubuntu (based on 22.04)","title":"Prerequisites"},{"location":"transparent-validation/rte/v1.1.0/quick-start-guide/#preparation-of-rte","text":"Download the latest version of the RTE image from the meta-rte repository . Flash the SD card using bmaptool or balenaEtcher . to do this by balenaEtcher go to the producer site and follow his procedure on how to download and flash an SD card. to do this by bmaptool reproduce the following steps: install bmaptool by opening the terminal and typing the following command: sudo apt install bmap-tools create the bmap by typing the following command: bmaptool create /path/to/your/image > /path/where/you/want/bmap/file/saved/bmapfilename.bmap flash image to the SD card by typing the following command: sudo bmaptool copy --bmap ~/path/where/your/bmap/file/is/located /path/where/your/image/is/located /path/to/memory/device Insert Orange Pi into RTE. Insert SD card into Orange Pi. Connect the ethernet cable to Orange Pi. Plug the USB-UART converter into your computer and connect its pins with RTE J2 Header . (you may need a USB extension cable) UART Converter RTE J2 Header GND GND TXD RX RXD TX Open the serial connection with RTE from your PC using a previously connected USB-UART converter by executing the following command: sudo minicom -D /dev/ttyUSB Substitute with the device number corresponding to your USB-UART Converter for example /dev/ttyUSB0 . The dmesg command allows to identify the latest connected devices. Plug the power supply into the RTE J17 Micro-USB slot. Login into the device by using the default credentials: Login: root Password: meta-rte","title":"Preparation of RTE"},{"location":"transparent-validation/rte/v1.1.0/reference-os/","text":"Dasharo RTE Reference OS Our specially crafted operating system fully customized for Remote Testing Environment platform aspects. meta-rte is based on open-source project - Yocto Project used for building Linux-based systems regardless of the hardware architecture. meta-rte has most mandatory tools and dependencies required for everyday debugging task with various range of hardware. RTE running meta-rte is ready to use completely out of the box, without the need for additional laborious configuration. Moreover, open-source solutions such as the Yocto Project and meta-rte provides possibility to rebuild the whole system strictly for the end users requirements, making the whole set more universal with endless applications! More information can be found in meta-rte repository","title":"RTE Reference OS"},{"location":"transparent-validation/rte/v1.1.0/reference-os/#dasharo-rte-reference-os","text":"Our specially crafted operating system fully customized for Remote Testing Environment platform aspects. meta-rte is based on open-source project - Yocto Project used for building Linux-based systems regardless of the hardware architecture. meta-rte has most mandatory tools and dependencies required for everyday debugging task with various range of hardware. RTE running meta-rte is ready to use completely out of the box, without the need for additional laborious configuration. Moreover, open-source solutions such as the Yocto Project and meta-rte provides possibility to rebuild the whole system strictly for the end users requirements, making the whole set more universal with endless applications! More information can be found in meta-rte repository","title":"Dasharo RTE Reference OS"},{"location":"transparent-validation/rte/v1.1.0/serial-port-connection-guide/","text":"Serial port connection guide This document describes how to set up a serial connection between RTE and another device. Prerequisites Prepared RTE Two jumpers Choose one of the following cables depending on the connectivity to your platform: RS232<->RJ45 cable, RS232<->RS232 cable, USB<->RS232 cable, micro-USB<->USB cable, 3-wire cable. Setting serial connection Put the two jumpers on RTE J16 Header : For the RS232 port, they join COM and RS232 rows both on RX and TX columns. For the UART port (only during using a 3-wire cable), they join COM and EXT rows both on RX and TX columns. For the micro-USB-USB cable, jumpers aren't required. Connect the RTE header (J14 or J18) with the device serial port. Use the cable according to the DUT specification: DUT has a serial port -> needs to use an RS232<->RS232 cable. DUT has the debug port in the form of the RJ45 -> needs to use an RS232<->RJ45 cable. DUT has the debug port in the form of the USB -> needs to use an RS232<->USB cable. DUT has the debug port in the form of the micro-USB -> needs to use a micro-USB<->USB cable. DUT doesn't have a port but has pins for serial connection on the board -> need to use a 3-wire cable. Connect with RTE via ssh or minicom . To connect via ssh is required to know RTE IP and connection to the internet on both sides. While using a minicom there is a need to use the USB-UART converter. There are two ways to open a serial connection: Telnet - by executing the following command: telnet 192 .168.X.X 13541 To configure telnet connections, update the file /etc/ser2net.conf using vim . Then reboot the RTE to apply the changes. The dmesg command allows to identify the latest connected devices. Minicom - by executing the following command: minicom -D /dev/ttyS1 -o -b 115200 Replace ttyS1 with ttyUSB0 while using micro-USB-USB cable.","title":"Serial Port Connection Guide"},{"location":"transparent-validation/rte/v1.1.0/serial-port-connection-guide/#serial-port-connection-guide","text":"This document describes how to set up a serial connection between RTE and another device.","title":"Serial port connection guide"},{"location":"transparent-validation/rte/v1.1.0/serial-port-connection-guide/#prerequisites","text":"Prepared RTE Two jumpers Choose one of the following cables depending on the connectivity to your platform: RS232<->RJ45 cable, RS232<->RS232 cable, USB<->RS232 cable, micro-USB<->USB cable, 3-wire cable.","title":"Prerequisites"},{"location":"transparent-validation/rte/v1.1.0/serial-port-connection-guide/#setting-serial-connection","text":"Put the two jumpers on RTE J16 Header : For the RS232 port, they join COM and RS232 rows both on RX and TX columns. For the UART port (only during using a 3-wire cable), they join COM and EXT rows both on RX and TX columns. For the micro-USB-USB cable, jumpers aren't required. Connect the RTE header (J14 or J18) with the device serial port. Use the cable according to the DUT specification: DUT has a serial port -> needs to use an RS232<->RS232 cable. DUT has the debug port in the form of the RJ45 -> needs to use an RS232<->RJ45 cable. DUT has the debug port in the form of the USB -> needs to use an RS232<->USB cable. DUT has the debug port in the form of the micro-USB -> needs to use a micro-USB<->USB cable. DUT doesn't have a port but has pins for serial connection on the board -> need to use a 3-wire cable. Connect with RTE via ssh or minicom . To connect via ssh is required to know RTE IP and connection to the internet on both sides. While using a minicom there is a need to use the USB-UART converter. There are two ways to open a serial connection: Telnet - by executing the following command: telnet 192 .168.X.X 13541 To configure telnet connections, update the file /etc/ser2net.conf using vim . Then reboot the RTE to apply the changes. The dmesg command allows to identify the latest connected devices. Minicom - by executing the following command: minicom -D /dev/ttyS1 -o -b 115200 Replace ttyS1 with ttyUSB0 while using micro-USB-USB cable.","title":"Setting serial connection"},{"location":"transparent-validation/rte/v1.1.0/specification/","text":"RTE elements UART0 header - 1x3 Orange Pi Zero system debug output and console (pins: RX , TX , GND ). SPI header - 2x4 standard 2.5mm IDC compatible header with all necessary signals to flash SPI chips. Orange Pi Zero GPIO - 1x3 GPIO pin header directly connected to Orange Pi zero platform. I2C header - 1x4 populated pins: 3.3V , SCK , SDA , GND . OC buffers output - 1x12 GPIO pin header connected to Open Collector buffers. DUT power control connectors - 2x DC jack 5.5/2.1mm female connectors for a Device Under Test power supply controlled directly through the relay. Reset button - Simple switch to reset RTE RS232 - DB9 male connector for RS232 communication with a hardware flow control. UART output select header 2x3 UART OUTPUT SELECT header destined for selecting serial output between UART1 header and DB9 RS232 connector. UART1 header - 1x3 UART header for 3V3 serial communication with DUT (pins: RX , TX , GND ). 2x USB connectors - Connect additional storages, external flash programmers, USB-RS232 or USB-UART converters. 5V header - 1x2 5V output populated pins: 5V , GND . expander GPIO - 1x4 GPIO pin header connected to GPIOs expander with no OC buffers. Relay - Controls Device Under Tests power supply micro USB connector - Connector for powering up RTE and OrangePi Zero setup. Product features Key features Cheaper and more feature-rich in comparison to other products Ultra-fast SPI flashing (16MHz) In-Circuit Programming (program onboard SPI Flash) Pomona connector to work with Serial Flash soldered on board Two logic levels SPI (1.8V and 3.3V) Remote power control over the target device Open Hardware Open Source software attached Open Source REST API controller Cost-free future software improvements RteCtrl: Web interface RteCtrl is a REST API controller used for RTE board. It comes with meta-rte operating system and starts automatically on port 8000 without the necessity of additional configuration. REST API dashboard can be reached through the Internet browser and provides a possibility to: control Device Under Test power supply (coldboot and warmboot) reset Device Under Test platform flash Device Under Test firmware More information can be found at RteCtrl repository DISCLAIMER: Before starting the flashing procedure through REST API console, make sure that appropriate SPI logic levels are set accordingly to SPI section. Specification GPIO header (1) First GPIO header ( J1 ) is a 1x3 pin header straight type 2.54mm pitch. It is derived directly from Orange Pi GPIOs for general use. By default, these GPIOs are set to INPUT mode. Maximum voltage for all data signals: 3.3 V. Description Pin # GPIO12 1 GPIO11 2 GPIO6 3 GPIO header (2) Second GPIO header ( J10 ) is a 1x4 pin header straight type 2.54mm pitch. It is derived from GPIO expander on RTE board. They are accessible for general use. By default, these GPIOs are set to INPUT mode. Maximum voltage for all data signals: 3.3 V. Expander GPIO: 25 mA maximum output current. Description Pin # GPIO400 1 GPIO401 2 GPIO402 3 GPIO403 4 GPIO header (3) Third GPIO header ( J11 ) is a 1x9 pin header straight type 2.54mm pitch. It is derived from GPIO expander on RTE board with an additional connection to OC (Open Collector) buffers. By default, these GPIOs are set to OUTPUT mode. Maximum voltage for all data signals: 3.3 V. OC buffers: 40 mA maximum output current. Description Pin # GPIO407 1 GPIO415 2 GPIO414 3 GPIO408 4 GPIO409 5 GPIO410 6 GPIO411 7 GPIO412 8 GPIO413 9 I2C header I2C header ( J9 ) is 1x4 pin header straight type 2.54mm pitch. It is used to rather low-speed applications such as reading sensors or accessing DACs and ADCs. Maximum voltage for all data signals: 3.3 V. Description Pin # 3V3 1 SCK 2 SDA 3 GND 4 SPI header SPI header ( J7 ) is a 2x4 pin header straight type 2.54mm pitch. It is used to control the application SPI flash with a minimal set of connections. Maximum voltage for all data signals: 3.3 V. Description Pin # Pin # Description Vcc 1 2 GND CS 3 4 SCLK MISO (SO) 5 6 MOSI (SI) ISP 7 8 NC Revision v1.1.0 features new possibilities for SPI configuration: SPI Vcc pin has been populated - power is now supplied to the SPI Vcc connector and can be enabled/disabled on demand: GPIO406 (OC_OUT1) state SPI Vcc 0 - low disabled (by default) 1 - high enabled user can choose the voltage level for Vcc SPI - either 1.8V or 3.3 V: GPIO405 (OC_OUT2) state SPI Vcc voltage level 0 - low 1.8 V (by default) 1 - high 3.3 V user can enable/disable SPI lines (some platforms have problems when booting with SPI wires connected): GPIO404 (OC_OUT3) state SPI lines (MOSI/MISO/CS/SCLK) 0 - low disabled (by default) 1 - high enabled UART OUTPUT SELECT header UART OUTPUT SELECT header ( J16 ) is a 2x3 pin header straight type 2.54mm pitch. It is used for enabling serial communication output: RS232 DB9 port ( J14 ) or UART1 header ( J18 ). If jumpers are not attached, serial ports are disabled. Jumper position (TX) Jumper position (RX) Serial communication enabled RS232 + COM RS232 + COM RS232 DB9 port (J14) EXT + COM EXT + COM 3.3V UART1 header (J18) RS232 connector RS232 connector ( J14 ) is a DB9 male 9 pin connector for serial communication between Remote Testing Environment and Device Under Test platform. It supports a hardware flow control. RS232 connector can be enabled/disabled according to UART OUTPUT SELECT section. Pin # Signal Description 1 DCD Data Carrier Detect 2 RXD Receive Data 3 TXD Transmit Data 4 DTR Data Terminal Ready 5 GND Signal Ground 6 DSR Data Set Ready 7 RTS Request to Send 8 CTS Clear to Send 9 RI Ring Indicator UART0 header UART0 header ( J2 ) is a 1x3 pin header straight type 2.54mm pitch. It is derived from Orange Pi Zero serial debug UART for debugging and serial communication purposes. Maximum voltage for all data signals: 3.3 V. Description Pin # GND 1 RX 2 TX 3 UART1 header UART1 header ( J18 ) is a 1x3 pin header straight type 2.54mm pitch. It is used for serial communication with DUT. UART1 header can be enabled/disabled according to UART OUTPUT SELECT section. Maximum voltage for all data signals: 3.3 V. Description Pin # GND 1 RX 2 TX 3 Power output header Power output header ( J15 ) is 1x2 pin header straight type 2.54mm pitch. It is used for additional 5V or ground pin connections with various devices. Description Pin # 5V 1 GND 2 DC jack Two DC Jacks ( J12 and J13 ) are 5.5/2.1mm female plug connectors used for Device Under Test power supply. The output from DC Jacks is controlled through a relay. There is no matter whether J12 or J13 plug is input/output for power supply. Relay Relay ( K1 ) is a mechanical switch for controlling Device Under Test power supply. Technical reference: 1 Form C (1PDT) contact arrangement 5 V coil nominal voltage 70 Ohms nominal resistance 72 mA nominal current 24 VDC maximal input voltage 10 A maximal input voltage Expected relay life: 100 000 operations Relay state is indicated by LED ( D5 ) located near relay and can be controlled via meta-rte operating system through GPIO199: GPIO199 state Relay state D5 LED state 0 OFF OFF 1 ON ON USB connectors USB connectors ( J6 , J8 ) available on RTE are additional USB type A ports derived from Orange Pi Zero header. They can be used for storage extension, serial communication through various adapters or USB programmer extension. microUSB connector The micro USB connector ( J17 ) is a USB B micro socket for powering up RTE and OrangePi Zero setup. It is required to use a 5V/2A power adapter. There is no difference whether the user plugs the power supply to the micro USB connector located on RTE board or use OrangePi Zero original socket. Reset button Reset button ( SW1 ) located near relay is used for resetting the RTE itself. How to set GPIO states to flash SPI? Set proper SPI Vcc Voltage: Adequate Vcc voltege is necessary for successful flash procedure. If it will be to low chip will not recognize any signals, if too high chip will be damaged. echo 0 > /sys/class/gpio/gpio405/value Or when flash chip operates on 3.3V: echo 1 > /sys/class/gpio/gpio405/value Enable SPI Vcc: echo 1 > /sys/class/gpio/gpio406/value Enable SPI signals: echo 1 > /sys/class/gpio/gpio404/value Flash SPI chip: flashrom -w /path/to/coreboot.rom -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 When done, change back all states: echo 0 > /sys/class/gpio/gpio405/value echo 0 > /sys/class/gpio/gpio406/value echo 0 > /sys/class/gpio/gpio404/value","title":"Specification"},{"location":"transparent-validation/rte/v1.1.0/specification/#rte-elements","text":"UART0 header - 1x3 Orange Pi Zero system debug output and console (pins: RX , TX , GND ). SPI header - 2x4 standard 2.5mm IDC compatible header with all necessary signals to flash SPI chips. Orange Pi Zero GPIO - 1x3 GPIO pin header directly connected to Orange Pi zero platform. I2C header - 1x4 populated pins: 3.3V , SCK , SDA , GND . OC buffers output - 1x12 GPIO pin header connected to Open Collector buffers. DUT power control connectors - 2x DC jack 5.5/2.1mm female connectors for a Device Under Test power supply controlled directly through the relay. Reset button - Simple switch to reset RTE RS232 - DB9 male connector for RS232 communication with a hardware flow control. UART output select header 2x3 UART OUTPUT SELECT header destined for selecting serial output between UART1 header and DB9 RS232 connector. UART1 header - 1x3 UART header for 3V3 serial communication with DUT (pins: RX , TX , GND ). 2x USB connectors - Connect additional storages, external flash programmers, USB-RS232 or USB-UART converters. 5V header - 1x2 5V output populated pins: 5V , GND . expander GPIO - 1x4 GPIO pin header connected to GPIOs expander with no OC buffers. Relay - Controls Device Under Tests power supply micro USB connector - Connector for powering up RTE and OrangePi Zero setup.","title":"RTE elements"},{"location":"transparent-validation/rte/v1.1.0/specification/#product-features","text":"","title":"Product features"},{"location":"transparent-validation/rte/v1.1.0/specification/#specification","text":"","title":"Specification"},{"location":"transparent-validation/rte/v1.1.0/specification/#how-to-set-gpio-states-to-flash-spi","text":"Set proper SPI Vcc Voltage: Adequate Vcc voltege is necessary for successful flash procedure. If it will be to low chip will not recognize any signals, if too high chip will be damaged. echo 0 > /sys/class/gpio/gpio405/value Or when flash chip operates on 3.3V: echo 1 > /sys/class/gpio/gpio405/value Enable SPI Vcc: echo 1 > /sys/class/gpio/gpio406/value Enable SPI signals: echo 1 > /sys/class/gpio/gpio404/value Flash SPI chip: flashrom -w /path/to/coreboot.rom -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 When done, change back all states: echo 0 > /sys/class/gpio/gpio405/value echo 0 > /sys/class/gpio/gpio406/value echo 0 > /sys/class/gpio/gpio404/value","title":"How to set GPIO states to flash SPI?"},{"location":"transparent-validation/sd-wire/getting-started/","text":"SDWire is a small board with two features SD card reader SD card MUX SDWire allows to flash SD card connected to the DUT (Device Under Test), without physical contact with the device. There is only one micro USB socket for connecting to host PC. Both USB mass storage and MUX control are served through the same USB connection. The PCB board is designed in such way that it fits into micro SD card slots. Thanks to this, there is no need for special cables with a micro SD adapter , like in the muxPi product .","title":"Getting started"},{"location":"transparent-validation/sd-wire/getting-started/#sdwire-is-a-small-board-with-two-features","text":"SD card reader SD card MUX SDWire allows to flash SD card connected to the DUT (Device Under Test), without physical contact with the device. There is only one micro USB socket for connecting to host PC. Both USB mass storage and MUX control are served through the same USB connection. The PCB board is designed in such way that it fits into micro SD card slots. Thanks to this, there is no need for special cables with a micro SD adapter , like in the muxPi product .","title":"SDWire is a small board with two features"},{"location":"transparent-validation/sd-wire/specification/","text":"Hardware design Design of this board is based on SD MUX . SDWire does not have power switch or USB switch but has built in USB SD card reader. SD card multiplexer itself is exactly the same in both devices. There are four LEDs on the board: red - power presence from USB blue - USB reader activity blue - card connected to TS ( Test Server ) green - card connected to DUT ( Device Under Test ) All LEDs are present on both sides of the board to make them visible no matter which side of the board will be facing you. LED positions are showed in the image below. Source: wiki.tizen.org PCB elements and scheme Source: wiki.tizen.org","title":"Specification"},{"location":"transparent-validation/sd-wire/specification/#hardware-design","text":"Design of this board is based on SD MUX . SDWire does not have power switch or USB switch but has built in USB SD card reader. SD card multiplexer itself is exactly the same in both devices. There are four LEDs on the board: red - power presence from USB blue - USB reader activity blue - card connected to TS ( Test Server ) green - card connected to DUT ( Device Under Test ) All LEDs are present on both sides of the board to make them visible no matter which side of the board will be facing you. LED positions are showed in the image below. Source: wiki.tizen.org","title":"Hardware design"},{"location":"transparent-validation/sd-wire/specification/#pcb-elements-and-scheme","text":"Source: wiki.tizen.org","title":"PCB elements and scheme"},{"location":"transparent-validation/sd-wire/usage-validation/","text":"SDWire usage Environment preparation SDWire has dedicated software which is a simple tool meant to control the hardware. Source code of the tool is published on tizen git server. This is simple to use, command-line utility software written in C and based on open-source libFTDI library. To prepare the environment reproduce the following steps: Clone the repository: git clone https://git.tizen.org/cgit/tools/testlab/sd-mux Install all needed dependencies: Ubuntu/Debian: sudo apt-get install libftdi1-dev libpopt-dev cmake Fedora/Red Hat: sudo dnf install libftdi-devel popt-devel cmake gcc gcc-c++ Enter into sd-mux project directory and reproduce the following steps to build project: open directory in terminal create 'build' directory by the following command: mkdir build enter into 'build' directory by the following command: cd build run the following commands one by one: cmake .. make In the above-described directory ( sd-mux/build ) run the following command to build binary: sudo make install Note, that the above-described command installs binary into '/usr/local/bin'. If you want to install files in directory rather than the default one add an argument to cmake command: cmake -DCMAKE_INSTALL_PREFIX = /usr .. Then it is obligatory to run again the following commands: make make install First use The following procedure should be performed not only before the first use of the device, but also as the presale validation procedure! Hardware requirements: SDWire SD card DUT (Device Under Test) bootable from SD card (for example: RPI, Orange PI etc.) DUT power supply Micro-USB --> USB cable TS (Test Server) - in most cases personal computer with prepared environment. To perform first use (assuming Raspberry Pi platform as a DUT) procedure reproduce the following steps: Prepare environment in accordance with this section . Insert SD card to the SDWire. Put SDWire into the DUT (Device Under Test). Prepare a micro USB --> USB cable. It will be used to connect SDWire to TS (Test Server). Check whether SDWire is configured by reproducing the following steps: run in TS terminal the following command: dmesg -w connect the SDWire to your machine using micro-USB --> USB cable. after connecting your dmesg output should looks like this: ( ... ) [ 73278 .307591 ] usb-storage 3 -1.1:1.0: USB Mass Storage device detected [ 73278 .307823 ] scsi host6: usb-storage 3 -1.1:1.0 [ 73278 .384925 ] usb 3 -1.2: new full-speed USB device number 45 using xhci_hcd [ 73278 .492025 ] usb 3 -1.2: New USB device found, idVendor = 0403 , idProduct = 6015 , bcdDevice = 10 .00 [ 73278 .492027 ] usb 3 -1.2: New USB device strings: Mfr = 1 , Product = 2 , SerialNumber = 3 [ 73278 .492028 ] usb 3 -1.2: Product: FT200X USB I2C [ 73278 .492029 ] usb 3 -1.2: Manufacturer: FTDI [ 73278 .492030 ] usb 3 -1.2: SerialNumber: DB007V7V ( ... ) open new terminal window and run the following command: sudo sd-mux-ctrl --list If output looks like below, it means that SDWire is configured and ready to use. Now, you can go to point 6 in this section. Number of FTDI devices found: 1 Dev: 0 , Manufacturer: SRPOL, Serial: sd-wire_11, Description: sd-wire Otherwise, if output shows no devices (like in the example below): Number of FTDI devices found: 0 you have to configure SDWire: sudo sd-mux-ctrl --device-serial = DB007V7V --vendor = 0x0403 --product = 0x6015 --device-type = sd-wire --set-serial = sd-wire_11 where: --device-serial = ( from dmesg output ) --vendor = 0x ( from dmesg output ) --product = 0x ( from dmesg output ) --set-serial = After above-desribed procedure check again if SDWire is properly configured: sudo sd-mux-ctrl --list Should output: Number of FTDI devices found: 1 Dev: 0 , Manufacturer: SRPOL, Serial: sd-wire_11, Description: sd-wire Connect SD card to the TS (Test Server): sudo sd-mux-ctrl --device-serial = sd-wire_11 --ts Flash the SD card using bmaptool or balenaEtcher. download the OS image for the target DUT - link for RPi image to do this by balenaEtcher go to the producer site and follow his procedure how to download and flash SD card to do this by bmaptool reproduce the following steps: install bmaptool by opening terminal and typing the following command: sudo apt install bmap-tools create the bmap by typing the following command: bmaptool create /path/to/your/image > /path/where/you/want/bmap/file/saved/bmapfilename.bmap flash image to the SD card by typing the following command: sudo bmaptool copy --bmap ~/path/where/your/bmap/file/is/located /path/where/your/image/is/located /path/to/memory/device Connect SD card to the DUT using sd-mux-ctrl : sudo sd-mux-ctrl --device-serial = sd-wire_11 --dut Connect power supply to the DUT and check if it boots properly from newly burned image. Everyday use scenario Disconnect power supply from the DUT (Device Under Test). Disconnect micro SD card from the DUT. Connect micro SD card to the TS (Test Server) using card reader. Flash the SD card. Connect SD card to the DUT. Connect power supply to the DUT. Boot DUT from new image. Using SDWire there is no need to disconnect SD card from DUT. SDWire with RTE use scenario Insert SD card to the SDWire. Insert SDWire into the DUT and connect it to the TS with micro-USB --> USB cable. Connect RTE power control connectors to the DUT (RTE here is optional but highly recommended for remote work, because it helps with automated and remote power control of the connected device). Check serial no. of SDWire: sudo sd-mux-ctrl --list Output: Number of FTDI devices found: 1 Dev: 0 , Manufacturer: SRPOL, Serial: sd-wire_11, Description: sd-wire Disconnect power supply using RTE. Connect SD card to the TS (using sd-mux-ctrl) sudo sd-mux-ctrl --device-serial = sd-wire_11 --ts Flash the SD card using bmaptool or balenaEtcher as described in the First use section Connect SD card to the DUT (using sd-mux-ctrl) sudo sd-mux-ctrl --device-serial = sd-wire_11 --dut Connect power supply using RTE. DUT should boot from freshly burned SD card. Command sudo sd-mux-ctrl --device-serial=sd-wire_11 --status returns information if SDWire is connected to DUT or TS. \u279c ~ sudo sd-mux-ctrl --device-serial = sd-wire_11 --status SD connected to: TS At the moment RTE does not support sd-mux-ctrl, so SDWire must be controlled from configured TS (Test Server). References & Projects: https://wiki.tizen.org/SDWire Ethernet camera module build \u2013 Automated flashing SD Wire & 3d Printer Usage","title":"Usage"},{"location":"transparent-validation/sd-wire/usage-validation/#sdwire-usage","text":"","title":"SDWire usage"},{"location":"transparent-validation/sd-wire/usage-validation/#environment-preparation","text":"SDWire has dedicated software which is a simple tool meant to control the hardware. Source code of the tool is published on tizen git server. This is simple to use, command-line utility software written in C and based on open-source libFTDI library. To prepare the environment reproduce the following steps: Clone the repository: git clone https://git.tizen.org/cgit/tools/testlab/sd-mux Install all needed dependencies: Ubuntu/Debian: sudo apt-get install libftdi1-dev libpopt-dev cmake Fedora/Red Hat: sudo dnf install libftdi-devel popt-devel cmake gcc gcc-c++ Enter into sd-mux project directory and reproduce the following steps to build project: open directory in terminal create 'build' directory by the following command: mkdir build enter into 'build' directory by the following command: cd build run the following commands one by one: cmake .. make In the above-described directory ( sd-mux/build ) run the following command to build binary: sudo make install Note, that the above-described command installs binary into '/usr/local/bin'. If you want to install files in directory rather than the default one add an argument to cmake command: cmake -DCMAKE_INSTALL_PREFIX = /usr .. Then it is obligatory to run again the following commands: make make install","title":"Environment preparation"},{"location":"transparent-validation/sd-wire/usage-validation/#first-use","text":"The following procedure should be performed not only before the first use of the device, but also as the presale validation procedure! Hardware requirements: SDWire SD card DUT (Device Under Test) bootable from SD card (for example: RPI, Orange PI etc.) DUT power supply Micro-USB --> USB cable TS (Test Server) - in most cases personal computer with prepared environment. To perform first use (assuming Raspberry Pi platform as a DUT) procedure reproduce the following steps: Prepare environment in accordance with this section . Insert SD card to the SDWire. Put SDWire into the DUT (Device Under Test). Prepare a micro USB --> USB cable. It will be used to connect SDWire to TS (Test Server). Check whether SDWire is configured by reproducing the following steps: run in TS terminal the following command: dmesg -w connect the SDWire to your machine using micro-USB --> USB cable. after connecting your dmesg output should looks like this: ( ... ) [ 73278 .307591 ] usb-storage 3 -1.1:1.0: USB Mass Storage device detected [ 73278 .307823 ] scsi host6: usb-storage 3 -1.1:1.0 [ 73278 .384925 ] usb 3 -1.2: new full-speed USB device number 45 using xhci_hcd [ 73278 .492025 ] usb 3 -1.2: New USB device found, idVendor = 0403 , idProduct = 6015 , bcdDevice = 10 .00 [ 73278 .492027 ] usb 3 -1.2: New USB device strings: Mfr = 1 , Product = 2 , SerialNumber = 3 [ 73278 .492028 ] usb 3 -1.2: Product: FT200X USB I2C [ 73278 .492029 ] usb 3 -1.2: Manufacturer: FTDI [ 73278 .492030 ] usb 3 -1.2: SerialNumber: DB007V7V ( ... ) open new terminal window and run the following command: sudo sd-mux-ctrl --list If output looks like below, it means that SDWire is configured and ready to use. Now, you can go to point 6 in this section. Number of FTDI devices found: 1 Dev: 0 , Manufacturer: SRPOL, Serial: sd-wire_11, Description: sd-wire Otherwise, if output shows no devices (like in the example below): Number of FTDI devices found: 0 you have to configure SDWire: sudo sd-mux-ctrl --device-serial = DB007V7V --vendor = 0x0403 --product = 0x6015 --device-type = sd-wire --set-serial = sd-wire_11 where: --device-serial = ( from dmesg output ) --vendor = 0x ( from dmesg output ) --product = 0x ( from dmesg output ) --set-serial = After above-desribed procedure check again if SDWire is properly configured: sudo sd-mux-ctrl --list Should output: Number of FTDI devices found: 1 Dev: 0 , Manufacturer: SRPOL, Serial: sd-wire_11, Description: sd-wire Connect SD card to the TS (Test Server): sudo sd-mux-ctrl --device-serial = sd-wire_11 --ts Flash the SD card using bmaptool or balenaEtcher. download the OS image for the target DUT - link for RPi image to do this by balenaEtcher go to the producer site and follow his procedure how to download and flash SD card to do this by bmaptool reproduce the following steps: install bmaptool by opening terminal and typing the following command: sudo apt install bmap-tools create the bmap by typing the following command: bmaptool create /path/to/your/image > /path/where/you/want/bmap/file/saved/bmapfilename.bmap flash image to the SD card by typing the following command: sudo bmaptool copy --bmap ~/path/where/your/bmap/file/is/located /path/where/your/image/is/located /path/to/memory/device Connect SD card to the DUT using sd-mux-ctrl : sudo sd-mux-ctrl --device-serial = sd-wire_11 --dut Connect power supply to the DUT and check if it boots properly from newly burned image.","title":"First use"},{"location":"transparent-validation/sd-wire/usage-validation/#everyday-use-scenario","text":"Disconnect power supply from the DUT (Device Under Test). Disconnect micro SD card from the DUT. Connect micro SD card to the TS (Test Server) using card reader. Flash the SD card. Connect SD card to the DUT. Connect power supply to the DUT. Boot DUT from new image. Using SDWire there is no need to disconnect SD card from DUT.","title":"Everyday use scenario"},{"location":"transparent-validation/sd-wire/usage-validation/#sdwire-with-rte-use-scenario","text":"Insert SD card to the SDWire. Insert SDWire into the DUT and connect it to the TS with micro-USB --> USB cable. Connect RTE power control connectors to the DUT (RTE here is optional but highly recommended for remote work, because it helps with automated and remote power control of the connected device). Check serial no. of SDWire: sudo sd-mux-ctrl --list Output: Number of FTDI devices found: 1 Dev: 0 , Manufacturer: SRPOL, Serial: sd-wire_11, Description: sd-wire Disconnect power supply using RTE. Connect SD card to the TS (using sd-mux-ctrl) sudo sd-mux-ctrl --device-serial = sd-wire_11 --ts Flash the SD card using bmaptool or balenaEtcher as described in the First use section Connect SD card to the DUT (using sd-mux-ctrl) sudo sd-mux-ctrl --device-serial = sd-wire_11 --dut Connect power supply using RTE. DUT should boot from freshly burned SD card. Command sudo sd-mux-ctrl --device-serial=sd-wire_11 --status returns information if SDWire is connected to DUT or TS. \u279c ~ sudo sd-mux-ctrl --device-serial = sd-wire_11 --status SD connected to: TS At the moment RTE does not support sd-mux-ctrl, so SDWire must be controlled from configured TS (Test Server). References & Projects: https://wiki.tizen.org/SDWire Ethernet camera module build \u2013 Automated flashing SD Wire & 3d Printer Usage","title":"SDWire with RTE use scenario"},{"location":"unified/clevo/post-install/","text":"Post-installation setup This document contains extra steps to perform after installing Dasharo in order to enable full functionality of your device. Linux This section covers Linux post-install steps tested on Ubuntu 22.04. It is likely thas similar procedures would for others Linux distributions as well. Touchpad hotkey enablement The touchpad hotkey needs extra setup to function correctly under Linux. To enable the touchpad hotkey to work under Linux, follow the steps below: Execute fixup script: curl -sSf https://raw.githubusercontent.com/Dasharo/dasharo-tools/main/clevo/touchpad-fixup | sudo sh After executing these steps, it should be possible to enable and disable the touchpad using the touchpad hotkey (Fn+F1) on the keyboard when using GNOME. Touchpad multi-touch support On NS7x an additional fix is necessary to enable multi-touch on Linux. Create a file /etc/modprobe.d/blacklist-psmouse.conf with the following contents: blacklist psmouse and then run the following commands: sudo depmod -a sudo update-initramfs -u Updated kernel On Gen 12 (Alder Lake), it's recommended to install the ubuntu-oem kernel which is a newer version than the default Ubuntu kernel. This version contains additional fixes for newer hardware which helps with power management and suspend on Gen 12 laptops. To install the ubuntu-oem kernel, run the following command: sudo apt install linux-oem-22.04a and reboot to use the new kernel. Nvidia drivers It is only necessary to follow this step if your device has Nvidia GPU For proper working of the sleep mode on Ubuntu 22.04, it is required to install additional Nvidia drivers. Install drivers by executing the following command in the terminal: sudo apt install nvidia-driver-515 nvidia-dkms-515 Reboot the device to apply changes by executing the following command in the terminal: sudo reboot (Optional) For power saving while the card is not in use, enable On-Demand mode in NVIDIA Control Panel: Suspend fix for SATA disks Only affects laptops with M.2 SATA disks experiencing sleep issues (the power LED not blinking while the laptop is suspended) Windows and certain Linux distros such as Ubuntu do not enable the necessary power saving tweaks to enable sleep mode while a SATA disk is installed. Execute fixup script: curl -sSf https://raw.githubusercontent.com/Dasharo/dasharo-tools/main/clevo/sata-suspend-fixup | sudo sh Windows 11 Updates and drivers installation Several features on Windows 11 (i. e. suspending the device) may not work or work unexpectedly without installing all of the updates and drivers. To install all of them, log into the system, connect the device to the mains and Internet, then follow the steps below: Press the Windows button on the keypad. Type Windows Update Settings in the search and press Enter . Select the Check for updates bar to start installing available updates and drivers. During this process previously selected bar might be changed to Restart now or Retry , so click them if something hasn't been installed yet, something has gone wrong or a restart is just required. The entire process may take up to 30 minutes. Select the Advanced options option in the Windows Update Settings window. Locate the Optional updates option and click on it. Select all displayed updates and drivers. Select the Download & Install bar to start installing additional updates and drivers. During this process previously selected bar might be changed to Restart now or Retry , so click them if something hasn't been installed yet, something has gone wrong or a restart is just required. The entire process may take up to 30 minutes. Repeat all steps until all updates have been installed. Suspend fix for SATA disks (Windows and Linux) Only affects laptops with M.2 SATA disks experiencing sleep issues (the power LED not blinking while the laptop is suspended). Windows and certain Linux distros such as Ubuntu do not enable the necessary power saving tweaks to enable sleep mode while a SATA disk is installed. Download the script: link Double click on the script to install the tweak Headset jack fix for NV4x 12th Gen The headset jack in NV4x 12th Gen (Alder Lake) needs a fix that is available starting with kernel version v6.0 (patch be561ffad708f0cee18aee4231f80ffafaf7a419 ). If you are using an older kernel, you need to add the fix manually: Execute fixup script: curl -sSf https://raw.githubusercontent.com/Dasharo/dasharo-tools/main/clevo/nv4x-audio-fixup | sudo sh Reboot. The audio jack will now work correctly.","title":"Post-installation setup"},{"location":"unified/clevo/post-install/#post-installation-setup","text":"This document contains extra steps to perform after installing Dasharo in order to enable full functionality of your device.","title":"Post-installation setup"},{"location":"unified/clevo/post-install/#linux","text":"This section covers Linux post-install steps tested on Ubuntu 22.04. It is likely thas similar procedures would for others Linux distributions as well.","title":"Linux"},{"location":"unified/clevo/post-install/#windows-11","text":"","title":"Windows 11"},{"location":"unified/novacustom/building-manual/","text":"Dasharo firmware building guide Intro This guide shows how to build Dasharo firmware for NovaCustom devices. It contains two components: BIOS firmware EC firmware Requirements This guide was verified on Ubuntu 22.04. In practice, any Linux distribution with Docker support should be enough to complete it. Make sure that you have following packages installed: Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git sudo apt -y install git Build Dasharo BIOS firmware Clone the Dasharo coreboot repository: git clone https://github.com/Dasharo/coreboot.git Navigate to the source code directory and checkout to the desired revision: cd coreboot Replace X.Y.Z with a valid version NS5x ADL NV4x ADL NS5x TGL NV4x TGL git checkout novacustom_ns5x_adl_vX.Y.Z git checkout novacustom_nv4x_adl_vX.Y.Z git checkout novacustom_ns5x_tgl_vX.Y.Z git checkout novacustom_nv4x_tgl_vX.Y.Z Checkout submodules: git submodule update --init --recursive --checkout Start docker container: NS5x ADL NV4x ADL NS5x TGL NV4x TGL docker run --rm -it -u $UID \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:2021-09-23_b0d87f753c /bin/bash docker run --rm -it -u $UID \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:2021-09-23_b0d87f753c /bin/bash docker run --rm -it -u $UID \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:0ad5fbd48d /bin/bash docker run --rm -it -u $UID \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:0ad5fbd48d /bin/bash Inside of the container, configure the build process: NS5x ADL NV4x ADL NS5x TGL NV4x TGL make distclean && cp configs/config.novacustom_ns5x_adl .config make distclean && cp configs/config.novacustom_nv4x_adl .config make distclean && cp configs/config.novacustom_ns5x_tgl .config make distclean && cp configs/config.novacustom_nv4x_tgl .config Start the build process: make olddefconfig && make This will produce a Dasharo binary placed in build/coreboot.rom . At the end of the build process, the following warning will be displayed: ** WARNING ** coreboot has been built without an Intel Firmware Descriptor. Never write a complete coreboot.rom without an IFD to your board's flash chip! You can use flashrom's IFD or layout parameters to flash only to the BIOS region. This is expected, and something you have to pay attention to if you would like to flash your Dasharo binary. Make sure to only overwrite the BIOS region, leaving everything else untouched. Otherwise, expect that your device will no longer be able to boot unless fixed using an external programmer. The binary will not contain a boot splash logo. Refer to logo customization for including one. Build Dasharo EC firmware Clone the Dasharo ec repository: git clone https://github.com/Dasharo/ec.git Navigate to the source code directory and checkout to the desired revision: cd ec Replace X.Y.Z with a valid version NS5x ADL NV4x ADL NS5x TGL NV4x TGL git checkout novacustom_ns5x_adl_vX.Y.Z git checkout novacustom_nv4x_adl_vX.Y.Z git checkout novacustom_ns5x_tgl_vX.Y.Z git checkout novacustom_nv4x_tgl_vX.Y.Z Checkout submodules: git submodule update --init --recursive --checkout Build the EC firmware: NS5x ADL NV4x ADL NS5x TGL NV4x TGL EC_BOARD_VENDOR = novacustom EC_BOARD_MODEL = ns5x_adl ./build.sh The resulting image will be placed in: novacustom_ns5x_adl_ec.rom . EC_BOARD_VENDOR = novacustom EC_BOARD_MODEL = nv4x_adl ./build.sh The resulting image will be placed in: novacustom_nv4x_adl_ec.rom . EC_BOARD_VENDOR = novacustom EC_BOARD_MODEL = ns5x_tgl ./build.sh The resulting image will be placed in: novacustom_ns5x_tgl_ec.rom . EC_BOARD_VENDOR = novacustom EC_BOARD_MODEL = nv4x_tgl ./build.sh The resulting image will be placed in: novacustom_nv4x_tgl_ec.rom . Install Dasharo firmware The Dasharo firmware can be flashed in following ways, depending on your situation: To flash Dasharo for the first time, refer to the initial deployment guide . To update Dasharo, refer to the firmware update guide .","title":"Building manual"},{"location":"unified/novacustom/building-manual/#dasharo-firmware-building-guide","text":"","title":"Dasharo firmware building guide"},{"location":"unified/novacustom/building-manual/#intro","text":"This guide shows how to build Dasharo firmware for NovaCustom devices. It contains two components: BIOS firmware EC firmware","title":"Intro"},{"location":"unified/novacustom/building-manual/#requirements","text":"This guide was verified on Ubuntu 22.04. In practice, any Linux distribution with Docker support should be enough to complete it. Make sure that you have following packages installed: Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git sudo apt -y install git","title":"Requirements"},{"location":"unified/novacustom/building-manual/#build-dasharo-bios-firmware","text":"Clone the Dasharo coreboot repository: git clone https://github.com/Dasharo/coreboot.git Navigate to the source code directory and checkout to the desired revision: cd coreboot Replace X.Y.Z with a valid version NS5x ADL NV4x ADL NS5x TGL NV4x TGL git checkout novacustom_ns5x_adl_vX.Y.Z git checkout novacustom_nv4x_adl_vX.Y.Z git checkout novacustom_ns5x_tgl_vX.Y.Z git checkout novacustom_nv4x_tgl_vX.Y.Z Checkout submodules: git submodule update --init --recursive --checkout Start docker container: NS5x ADL NV4x ADL NS5x TGL NV4x TGL docker run --rm -it -u $UID \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:2021-09-23_b0d87f753c /bin/bash docker run --rm -it -u $UID \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:2021-09-23_b0d87f753c /bin/bash docker run --rm -it -u $UID \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:0ad5fbd48d /bin/bash docker run --rm -it -u $UID \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:0ad5fbd48d /bin/bash Inside of the container, configure the build process: NS5x ADL NV4x ADL NS5x TGL NV4x TGL make distclean && cp configs/config.novacustom_ns5x_adl .config make distclean && cp configs/config.novacustom_nv4x_adl .config make distclean && cp configs/config.novacustom_ns5x_tgl .config make distclean && cp configs/config.novacustom_nv4x_tgl .config Start the build process: make olddefconfig && make This will produce a Dasharo binary placed in build/coreboot.rom . At the end of the build process, the following warning will be displayed: ** WARNING ** coreboot has been built without an Intel Firmware Descriptor. Never write a complete coreboot.rom without an IFD to your board's flash chip! You can use flashrom's IFD or layout parameters to flash only to the BIOS region. This is expected, and something you have to pay attention to if you would like to flash your Dasharo binary. Make sure to only overwrite the BIOS region, leaving everything else untouched. Otherwise, expect that your device will no longer be able to boot unless fixed using an external programmer. The binary will not contain a boot splash logo. Refer to logo customization for including one.","title":"Build Dasharo BIOS firmware"},{"location":"unified/novacustom/building-manual/#build-dasharo-ec-firmware","text":"Clone the Dasharo ec repository: git clone https://github.com/Dasharo/ec.git Navigate to the source code directory and checkout to the desired revision: cd ec Replace X.Y.Z with a valid version NS5x ADL NV4x ADL NS5x TGL NV4x TGL git checkout novacustom_ns5x_adl_vX.Y.Z git checkout novacustom_nv4x_adl_vX.Y.Z git checkout novacustom_ns5x_tgl_vX.Y.Z git checkout novacustom_nv4x_tgl_vX.Y.Z Checkout submodules: git submodule update --init --recursive --checkout Build the EC firmware: NS5x ADL NV4x ADL NS5x TGL NV4x TGL EC_BOARD_VENDOR = novacustom EC_BOARD_MODEL = ns5x_adl ./build.sh The resulting image will be placed in: novacustom_ns5x_adl_ec.rom . EC_BOARD_VENDOR = novacustom EC_BOARD_MODEL = nv4x_adl ./build.sh The resulting image will be placed in: novacustom_nv4x_adl_ec.rom . EC_BOARD_VENDOR = novacustom EC_BOARD_MODEL = ns5x_tgl ./build.sh The resulting image will be placed in: novacustom_ns5x_tgl_ec.rom . EC_BOARD_VENDOR = novacustom EC_BOARD_MODEL = nv4x_tgl ./build.sh The resulting image will be placed in: novacustom_nv4x_tgl_ec.rom .","title":"Build Dasharo EC firmware"},{"location":"unified/novacustom/building-manual/#install-dasharo-firmware","text":"The Dasharo firmware can be flashed in following ways, depending on your situation: To flash Dasharo for the first time, refer to the initial deployment guide . To update Dasharo, refer to the firmware update guide .","title":"Install Dasharo firmware"},{"location":"unified/novacustom/fan-profiles/","text":"Fan profiles settings There are two fan profiles implemented. The profiles can be selected via the Power Management Options menu in Setup Menu. Fan profiles are defined as follows: Silent fan profile Releases newer than v1.4.0 TGL and v1.6.0 ADL Temperature [\u00b0C] Fan speed [%] 0 20 65 25 75 35 85 100 Releases v1.4.0 TGL and v1.6.0 ADL or older Temperature [\u00b0C] Fan speed [%] 0 25 65 30 75 35 100 100 Performance fan profile Releases newer than v1.4.0 TGL and v1.6.0 ADL Temperature [\u00b0C] Fan speed [%] 0 25 55 35 75 60 85 100 Releases v1.4.0 TGL and v1.6.0 ADL or older Temperature [\u00b0C] Fan speed [%] 0 25 55 35 75 60 100 100 Values in-between curve points are interpolated linearly.","title":"Fan profiles"},{"location":"unified/novacustom/fan-profiles/#fan-profiles-settings","text":"There are two fan profiles implemented. The profiles can be selected via the Power Management Options menu in Setup Menu. Fan profiles are defined as follows:","title":"Fan profiles settings"},{"location":"unified/novacustom/fan-profiles/#silent-fan-profile","text":"","title":"Silent fan profile"},{"location":"unified/novacustom/fan-profiles/#releases-newer-than-v140-tgl-and-v160-adl","text":"Temperature [\u00b0C] Fan speed [%] 0 20 65 25 75 35 85 100","title":"Releases newer than v1.4.0 TGL and v1.6.0 ADL"},{"location":"unified/novacustom/fan-profiles/#releases-v140-tgl-and-v160-adl-or-older","text":"Temperature [\u00b0C] Fan speed [%] 0 25 65 30 75 35 100 100","title":"Releases v1.4.0 TGL and v1.6.0 ADL or older"},{"location":"unified/novacustom/fan-profiles/#performance-fan-profile","text":"","title":"Performance fan profile"},{"location":"unified/novacustom/fan-profiles/#releases-newer-than-v140-tgl-and-v160-adl_1","text":"Temperature [\u00b0C] Fan speed [%] 0 25 55 35 75 60 85 100","title":"Releases newer than v1.4.0 TGL and v1.6.0 ADL"},{"location":"unified/novacustom/fan-profiles/#releases-v140-tgl-and-v160-adl-or-older_1","text":"Temperature [\u00b0C] Fan speed [%] 0 25 55 35 75 60 100 100 Values in-between curve points are interpolated linearly.","title":"Releases v1.4.0 TGL and v1.6.0 ADL or older"},{"location":"unified/novacustom/firmware-update/","text":"Firmware update Introduction This document describes the firmware update for NovaCustom laptops running Dasharo firmware to the latest version available. Update using Dasharo Tools Suite Boot into Dasharo Tools Suite Follow the procedure described in DTS firmware update documentation","title":"Firmware update"},{"location":"unified/novacustom/firmware-update/#firmware-update","text":"","title":"Firmware update"},{"location":"unified/novacustom/firmware-update/#introduction","text":"This document describes the firmware update for NovaCustom laptops running Dasharo firmware to the latest version available.","title":"Introduction"},{"location":"unified/novacustom/fn-lock-hotkey/","text":"NovaCustom Fn lock hotkey By default, the Function Keys ( F1 - F12 ) must be used with a combination of Fn key to change display brightness, keyboard illumination, etc. The Fn lock capability provides a way of using these actions without the necessity of using the Fn key. Usage Enabling Press the Fn + Caps Lock keys combination. Disabling Press the Fn + Caps Lock keys combination again.","title":"Fn lock hotkey"},{"location":"unified/novacustom/fn-lock-hotkey/#novacustom-fn-lock-hotkey","text":"By default, the Function Keys ( F1 - F12 ) must be used with a combination of Fn key to change display brightness, keyboard illumination, etc. The Fn lock capability provides a way of using these actions without the necessity of using the Fn key.","title":"NovaCustom Fn lock hotkey"},{"location":"unified/novacustom/fn-lock-hotkey/#usage","text":"","title":"Usage"},{"location":"unified/novacustom/fwupd-usage/","text":"Updating firmware using fwupd This document describes the process of installing firmware updates from LVFS using fwupd. Installing fwupd Using binary packages Only .deb packages are provided. The procudure was verified on Ubuntu 20.04 LTS , but is should also apply to other Debian-based dsitributions. If you are using different distribution, you might need to build from source . Download and extract the fwupd archive: wget --content-disposition \\ https://cloud.3mdeb.com/index.php/s/mZyN4NgR8SngJ4j/download \\ https://cloud.3mdeb.com/index.php/s/Z765y233CdJGKy2/download \\ https://cloud.3mdeb.com/index.php/s/KkNaL6dbWs2ei3E/download unzip fwupd-novacustom-v1.2.0.zip This is an example how to verify the binaries (in this case fwupd-novacustom-v1.2.0.zip ): gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/oss_master_key/open-source-software/3mdeb-open-source-software-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/customer-keys/novacustom/novacustom-open-source-firmware-release-1.x-key.asc sha256sum -c fwupd-novacustom-v1.2.0.zip.sha256 gpg -v --verify fwupd-novacustom-v1.2.0.zip.sha256.sig fwupd-novacustom-v1.2.0.zip.sha256 flashrom packages are located inside flashrom-1.2-2-3mdeb.zip : unzip flashrom-1.2-2-3mdeb.zip sudo apt install ./flashrom_1.2-2_amd64.deb sudo apt install ./libflashrom1_1.2-2_amd64.deb fwupd packages are located inside fwupd-2.0.0.0-3mdeb.zip : unzip fwupd-2.0.0.0-3mdeb.zip sudo apt install ./fwupd_2.0.0_amd64.deb \\ ./fwupd-doc_2.0.0_all.deb \\ ./fwupd-tests_2.0.0_amd64.deb \\ ./gir1.2-fwupd-2.0_2.0.0_amd64.deb \\ ./gir1.2-fwupdplugin-1.0_2.0.0_amd64.deb \\ ./gir1.2-gusb-1.0_0.3.5-1_amd64.deb \\ ./libfwupd2_2.0.0_amd64.deb \\ ./libfwupd-dev_2.0.0_amd64.deb \\ ./libfwupdplugin4_2.0.0_amd64.deb \\ ./libfwupdplugin-dev_2.0.0_amd64.deb \\ ./libgusb2_0.3.5-1_amd64.deb \\ ./libgusb-dev_0.3.5-1_amd64.deb Building from source There is no need to do any of these steps unless you can't use the packages provided in the previous step You might need to adjust the package manager commands and package names to your distribution. Flashrom Install build dependencies: sudo apt update sudo apt install -y build-essential pciutils libpci-dev libusb-1.0-0-dev \\ cmake meson pkg-config libftdi1-dev debhelper git wget python3-markdown \\ gcab Obtain source code: git clone https://github.com/Dasharo/flashrom.git -b v1.2.0.1 cd flashrom Build and install flashrom: meson build ninja -C build sudo ninja -C build install fwupd Obtain source code: git clone https://github.com/Dasharo/fwupd.git -b v1.7.3.3 cd fwupd Install build dependencies: ./contrib/setup Build and install fwupd: sudo depmod meson build -Ddocs = none -Dplugin_flashrom = true ninja -C build sudo ninja -C build install Updating firmware from LVFS Disable Secure Boot. To do this you can follow steps described in Secure Boot test . Refresh the fwupd database: sudo fwupdmgr refresh Updating lvfs Downloading\u2026 [ *************************************** ] Downloading\u2026 [ *************************************** ] Successfully downloaded new metadata: 1 local device supported Use the following command to update firmware with fwupd - example for NV41MZ: Note: You may be asked which device to update. If you see a prompt, select NV4XMB,ME,MZ sudo fwupdmgr update Selected device: NV4XMB,ME,MZ \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557 \u2551 Update NV4XMB,ME,MZ to 0 .5.0? \u2551 \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563 \u2551 This release adds the following features: \u2551 \u2551 \u2551 \u2551 \u2022 vboot Verified Boot \u2551 \u2551 \u2022 TPM Measured Boot \u2551 \u2551 \u2022 Custom fan curve \u2551 \u2551 \u2022 Microcode for Tiger Lake stepping 0x2 \u2551 \u2551 \u2551 \u2551 This release changes the following features: \u2551 \u2551 \u2551 \u2551 \u2022 Disabled unused DPTF device \u2551 \u2551 \u2551 \u2551 NV4XMB,ME,MZ and all connected devices may not be usable while updating. \u2551 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d Perform operation? [ Y | n ] : Downloading\u2026 [ *************************************** ] Downloading\u2026 [ *************************************** ] Decompressing\u2026 [ *************************************** ] Decompressing\u2026 [ *************************************** ] Authenticating\u2026 [ *************************************** ] Authenticating\u2026 [ *************************************** ] Restarting device\u2026 [ *************************************** ] Writing\u2026 [ *************************************** ] Decompressing\u2026 [ *************************************** ] Writing\u2026 [ *************************************** ] Verifying\u2026 [ *************************************** ] Writing\u2026 [ *************************************** ] Restarting device\u2026 [ *************************************** ] Waiting\u2026 [ *************************************** ] Successfully installed firmware An update requires the system to shutdown to complete. Shutdown now? [ y | N ] : Shut down the computer when prompted, or manually later on. Power on the laptop again. Log in and run the following command to verify results: sudo fwupdmgr get-results Choose a device: 0 . Cancel 1 . 4bde70ba4e39b28f9eab1628f9dd6e6244c03027 ( 11th Gen Intel Core\u2122 i7-1165G7 @ 2 .80GHz ) 2 . 5792b48846ce271fab11c4a545f7a3df0d36e00a ( Display controller ) 3 . 073c01931cb0e9889bbfb2ea4a4c2fc558805fc6 ( Display controller ) 4 . dbee8bd3b1ae0316ad143336155651eedb495a0e ( NV4XMB,ME,MZ ) 5 . 71b677ca0f1bc2c5b804fa1d59e52064ce589293 ( SSD 980 PRO 1TB ) 6 . c6a80ac3a22083423992a3cb15018989f37834d6 ( TPM ) 7 . eefcbd318bd31fc1eba6358e628b3f9dceb87206 ( USB4 host controller ) Select NV4XMB,ME,MZ when prompted, and the results will be displayed: NV4XMB,ME,MZ: Device ID: dbee8bd3b1ae0316ad143336155651eedb495a0e Previous version: 0 .5.0 Update State: Success Last modified: 2022 -01-13 11 :09 GUID: 230c8b18-8d9b-53ec-838b-6cfc0383493a Device Flags: \u2022 Internal device \u2022 Updatable \u2022 System requires external power source \u2022 Needs shutdown after installation \u2022 Cryptographic hash verification is available","title":"Firmware update using fwupd"},{"location":"unified/novacustom/fwupd-usage/#updating-firmware-using-fwupd","text":"This document describes the process of installing firmware updates from LVFS using fwupd.","title":"Updating firmware using fwupd"},{"location":"unified/novacustom/fwupd-usage/#installing-fwupd","text":"","title":"Installing fwupd"},{"location":"unified/novacustom/fwupd-usage/#updating-firmware-from-lvfs","text":"Disable Secure Boot. To do this you can follow steps described in Secure Boot test . Refresh the fwupd database: sudo fwupdmgr refresh Updating lvfs Downloading\u2026 [ *************************************** ] Downloading\u2026 [ *************************************** ] Successfully downloaded new metadata: 1 local device supported Use the following command to update firmware with fwupd - example for NV41MZ: Note: You may be asked which device to update. If you see a prompt, select NV4XMB,ME,MZ sudo fwupdmgr update Selected device: NV4XMB,ME,MZ \u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557 \u2551 Update NV4XMB,ME,MZ to 0 .5.0? \u2551 \u2560\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2563 \u2551 This release adds the following features: \u2551 \u2551 \u2551 \u2551 \u2022 vboot Verified Boot \u2551 \u2551 \u2022 TPM Measured Boot \u2551 \u2551 \u2022 Custom fan curve \u2551 \u2551 \u2022 Microcode for Tiger Lake stepping 0x2 \u2551 \u2551 \u2551 \u2551 This release changes the following features: \u2551 \u2551 \u2551 \u2551 \u2022 Disabled unused DPTF device \u2551 \u2551 \u2551 \u2551 NV4XMB,ME,MZ and all connected devices may not be usable while updating. \u2551 \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255d Perform operation? [ Y | n ] : Downloading\u2026 [ *************************************** ] Downloading\u2026 [ *************************************** ] Decompressing\u2026 [ *************************************** ] Decompressing\u2026 [ *************************************** ] Authenticating\u2026 [ *************************************** ] Authenticating\u2026 [ *************************************** ] Restarting device\u2026 [ *************************************** ] Writing\u2026 [ *************************************** ] Decompressing\u2026 [ *************************************** ] Writing\u2026 [ *************************************** ] Verifying\u2026 [ *************************************** ] Writing\u2026 [ *************************************** ] Restarting device\u2026 [ *************************************** ] Waiting\u2026 [ *************************************** ] Successfully installed firmware An update requires the system to shutdown to complete. Shutdown now? [ y | N ] : Shut down the computer when prompted, or manually later on. Power on the laptop again. Log in and run the following command to verify results: sudo fwupdmgr get-results Choose a device: 0 . Cancel 1 . 4bde70ba4e39b28f9eab1628f9dd6e6244c03027 ( 11th Gen Intel Core\u2122 i7-1165G7 @ 2 .80GHz ) 2 . 5792b48846ce271fab11c4a545f7a3df0d36e00a ( Display controller ) 3 . 073c01931cb0e9889bbfb2ea4a4c2fc558805fc6 ( Display controller ) 4 . dbee8bd3b1ae0316ad143336155651eedb495a0e ( NV4XMB,ME,MZ ) 5 . 71b677ca0f1bc2c5b804fa1d59e52064ce589293 ( SSD 980 PRO 1TB ) 6 . c6a80ac3a22083423992a3cb15018989f37834d6 ( TPM ) 7 . eefcbd318bd31fc1eba6358e628b3f9dceb87206 ( USB4 host controller ) Select NV4XMB,ME,MZ when prompted, and the results will be displayed: NV4XMB,ME,MZ: Device ID: dbee8bd3b1ae0316ad143336155651eedb495a0e Previous version: 0 .5.0 Update State: Success Last modified: 2022 -01-13 11 :09 GUID: 230c8b18-8d9b-53ec-838b-6cfc0383493a Device Flags: \u2022 Internal device \u2022 Updatable \u2022 System requires external power source \u2022 Needs shutdown after installation \u2022 Cryptographic hash verification is available","title":"Updating firmware from LVFS"},{"location":"unified/novacustom/initial-deployment/","text":"Initial Deployment Intro This document is a guide for the initial installation of Dasharo on a supported device. It assumes some knowledge about external flashing and is primarily aimed at technicians performing initial installation and not for end users of the devices. Installing Dasharo Initial Installation 12th Gen (Alder Lake) 11th Gen (Tiger Lake) During the initial installation of Dasharo, you should deploy the supported Intel ME version (and configuration) on the device. Since vendor firmware has enabled Intel Boot Guard and BIOS Guard, it is not possible to do this from within the operating system and external flashing of the whole flash chip using a programmer like the CH341a is required. Publicly released binaries do not contain ME binary. If you need an Intel ME update for your device, contact us via already established commercial support channel. Preparation Install flashrom: apt update apt upgrade sudo apt -y install flashrom BIOS installation Steps for installing Dasharo BIOS: Remove the bottom cover of the laptop. NS5x / NS7x NV4x Disconnect the primary battery. (1) Disconnect the CMOS battery. (2) Attach a WSON-8 probe to the SPI flash chip. (3) For TGL devices use SOIC clip instead of WSON Backup the current firmware, in case you want to be able to restore it at some point: flashrom -p ch341a_spi -r bios_backup.rom Install Dasharo BIOS, replacing [path] with the path to the firmware image you want to flash, e.g. novacustom_ns5x_adl_full_v1.4.0.rom flashrom -p ch341a_spi -w [ path ] Detach the WSON-8 probe. Connect the primary battery and reconnect the CMOS battery Power on the laptop. The laptop may shut down once after training the memory. EC firmware installation Currently, the latest flashrom release lacks support for flashing ITE embedded controllers such as the ones present in NovaCustom laptops. Because of this, we need to build flashrom from source. Run the following commands on the target laptop: Install build dependencies: apt update apt upgrade apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://github.com/dasharo/flashrom.git cd flashrom Build flashrom: make sudo make install Make a backup of the EC firmware: Remember to store the backup on the separate device in case flashing fails. flashrom -p ite_ec -r ec_backup.rom Install the EC firmware: Warning: After running this command, the internal keyboard and power button will stop responding until the device is power cycled (all power must be removed, including the internal battery). Be prepared to disconnect the battery after updating the EC. Alternatively, you can boot up the laptop without the battery connected and power it from an AC adapter. Then, once the EC update is complete, disconnect the AC adapter to power off the laptop. Run the following command, replacing [path] with the path to the EC firmware you want to flash, e.g. novacustom_ns5x_adl_ec_v1.4.0.rom flashrom -p ite_ec -w [ path ] Successful installation of Dasharo EC finishes the initial deployment process. Initial deployment To ensure a smooth deployment process, it is recommended to use the latest version of DTS available from the releases page . Once you have obtained it, you can then proceed with following the Dasharo zero-touch initial deployment section procedure. This will help you set up Dasharo effectively and without manual intervention. If something went wrong or EC installation was not done, the firmware will print an error string during boot: OR In such case please follow the EC firmware update instructions for a specific board variant.","title":"Initial deployment"},{"location":"unified/novacustom/initial-deployment/#initial-deployment","text":"","title":"Initial Deployment"},{"location":"unified/novacustom/initial-deployment/#intro","text":"This document is a guide for the initial installation of Dasharo on a supported device. It assumes some knowledge about external flashing and is primarily aimed at technicians performing initial installation and not for end users of the devices.","title":"Intro"},{"location":"unified/novacustom/initial-deployment/#installing-dasharo","text":"","title":"Installing Dasharo"},{"location":"unified/novacustom/overview/","text":"Overview Hardware NS5x ADL NV4x ADL NS5x TGL NV4x TGL The NovaCustom NS5x/7x 12th Gen section is related to the two physical NovaCustom laptops based on the 12th generation Intel Core processor: NS51 series NS70 series The NovaCustom NV4x 12th Gen section is related to the one physical NovaCustom laptops based on the 12th generation Intel Core processor: NV41 series The NovaCustom NS5x/7x 11th Gen section is related to the two physical NovaCustom laptops based on the 11th generation Intel Core processor: NS51 series NS70 series The NovaCustom NV4x 11th Gen section is related to the one physical NovaCustom laptops based on the 11th generation Intel Core processor: NV41 series For more information on the hardware, please refer to the references in above links. Firmware Each firmware release contains of two parts: BIOS firmware, EC (Embedded Controller) firmware. They both interact with each other tightly, so keeping their compatible versions in in sync is important. Information on compatibility should be always explained in the release pages: NV4x ADL NV4x TGL NS5x ADL NS5x TGL","title":"Overview"},{"location":"unified/novacustom/overview/#overview","text":"","title":"Overview"},{"location":"unified/novacustom/overview/#hardware","text":"NS5x ADL NV4x ADL NS5x TGL NV4x TGL The NovaCustom NS5x/7x 12th Gen section is related to the two physical NovaCustom laptops based on the 12th generation Intel Core processor: NS51 series NS70 series The NovaCustom NV4x 12th Gen section is related to the one physical NovaCustom laptops based on the 12th generation Intel Core processor: NV41 series The NovaCustom NS5x/7x 11th Gen section is related to the two physical NovaCustom laptops based on the 11th generation Intel Core processor: NS51 series NS70 series The NovaCustom NV4x 11th Gen section is related to the one physical NovaCustom laptops based on the 11th generation Intel Core processor: NV41 series For more information on the hardware, please refer to the references in above links.","title":"Hardware"},{"location":"unified/novacustom/overview/#firmware","text":"Each firmware release contains of two parts: BIOS firmware, EC (Embedded Controller) firmware. They both interact with each other tightly, so keeping their compatible versions in in sync is important. Information on compatibility should be always explained in the release pages: NV4x ADL NV4x TGL NS5x ADL NS5x TGL","title":"Firmware"},{"location":"unified/novacustom/recovery/","text":"Recovery Prerequisites To proceed with the recovery procedure the backup with the vendor firmware or vendor EC firmware will be necessary eg. bios_backup.rom , ec_backup.rom . The backup file should be generated before making any changes in the device flash chip according to documentation: Firmware backup EC firmware backup Restoring vendor BIOS requires restoring a compatible version of EC firmware. There is currently no way to do this internally. External flashing BIOS recovery Follow the Initial deployment section to perform the external flash. When running the flashrom commands use a backup file you've prepared previously, like bios_backup.rom . EC firmware recovery The procedure will be slightly different depending on the model of your laptop. NS5x / NS7x NV4x You will need: an Arduino Mega 2560 a 24-pin FFC cable with a 1.0mm pitch, same-sided (connectors on the same side on both ends of the cable) a 24-pin FFC breakout board with a 1.0mm pitch FFC connector and a 2.54mm pitch pin header USB-A to USB-B cable to connect the Arduino to the host USB-C cable for grounding You will need: an Arduino Mega 2560 a 24-pin FFC cable with a 0.5mm pitch, same-sided (connectors on the same side on both ends of the cable) a 24-pin FFC breakout board with a 0.5mm pitch FFC connector and a 2.54mm pitch pin header USB-A to USB-B cable to connect the Arduino to the host USB-C cable for grounding The full set for EC firmware recovery is available at our online shop . Preparation Clone the EC repository: git clone https://github.com/Dasharo/ec.git cd ec Install dependencies: ./scripts/deps.sh If rustup was installed as part of the previous step, run: source $HOME /.cargo/env Connect the Arduino to the computer using a USB-A to USB-B cable Build and flash firmware for the Arduino, which will serve as the flasher: make BOARD = arduino/mega2560 make BOARD = arduino/mega2560 flash Flashing Unscrew the bottom cover from the laptop NS5x / NS7x NV4x Disconnect the battery (1) All power must be removed from the laptop during flashing. Reattach the bottom cover (without screwing it in) and flip the laptop over Using a prying tool like a credit card, pull up the keyboard from the laptop Start prying at the top of the keyboard. Be extra careful when removing the keyboard to avoid damaging the keyboard cable, which is extremely fragile NS5x / NS7x NV4x Disconnect the keyboard from the laptop NS5x / NS7x NV4x Connect the USB-C cable to the Thunderbolt port on the laptop and to the host computer. This will provide grounding Connect the FFC cable to the FFC breakout board NS5x / NS7x NV4x Note: In the example above, the FFC connector on the breakout has the pins on the bottom side of the connector and is located on the same side as the pins connecting to the Arduino. If your breakout is different, you may need an FFC cable with connectors on the opposite sides. Note: In the example above, the FFC connector on the breakout has the pins on the upper side of the connector and is located on the side opposite of the pins connecting to the Arduino. If your breakout is different, you may need an FFC cable with connectors on the opposite sides. Insert the breakout into Arduino's digital pin header, pins 22-45, with the FFC connector facing outwards Connect the other end of the FFC cable to the keyboard connector on the laptop, taking care to align pin 1 of the FFC cable to pin 1 (leftmost) pin of the connector NS5x / NS7x NV4x Connect the Arduino to the host using the USB-A to USB-B cable Build the flashing utility: cargo build --manifest-path ecflash/Cargo.toml --example isp --release Flash the firmware: sudo ecflash/target/release/examples/isp [ path to EC backup ] The output will contain: Buffer size: 128 ID: 5570 VER: 2 If it contains other ID value or the connection times out, reattach the FFC cable to the laptop and the breakout board. VER value may vary between models. Reassemble the laptop: disconnect the Arduino from the laptop, reattach the keyboard, disconnect the USB-C cable, reconnect the battery and screw in the bottom cover","title":"Recovery"},{"location":"unified/novacustom/recovery/#recovery","text":"","title":"Recovery"},{"location":"unified/novacustom/recovery/#prerequisites","text":"To proceed with the recovery procedure the backup with the vendor firmware or vendor EC firmware will be necessary eg. bios_backup.rom , ec_backup.rom . The backup file should be generated before making any changes in the device flash chip according to documentation: Firmware backup EC firmware backup Restoring vendor BIOS requires restoring a compatible version of EC firmware. There is currently no way to do this internally.","title":"Prerequisites"},{"location":"unified/novacustom/recovery/#external-flashing","text":"","title":"External flashing"},{"location":"unified/novacustom/rgb-keyboard/","text":"NovaCustom NS5x/7x RGB keyboard The NS5x/7x laptop features an RGB backlight keyboard. Dasharo implements full driverless backlight control using only the hotkeys on the keyboard. The keyboard backlight configuration set in the operating system is saved when the system is shut down and restored just before next system boot. Usage The backlight can be operated using the hotkeys on the numpad: Fn + / - Next color Fn + * - Toggle On / Off Fn + - - Brightness down Fn + + - Brightness up The backlight has the following color modes: White (default) Red Green Blue Yellow Magenta Cyan","title":"RGB keyboard"},{"location":"unified/novacustom/rgb-keyboard/#novacustom-ns5x7x-rgb-keyboard","text":"The NS5x/7x laptop features an RGB backlight keyboard. Dasharo implements full driverless backlight control using only the hotkeys on the keyboard. The keyboard backlight configuration set in the operating system is saved when the system is shut down and restored just before next system boot.","title":"NovaCustom NS5x/7x RGB keyboard"},{"location":"unified/novacustom/rgb-keyboard/#usage","text":"The backlight can be operated using the hotkeys on the numpad: Fn + / - Next color Fn + * - Toggle On / Off Fn + - - Brightness down Fn + + - Brightness up The backlight has the following color modes: White (default) Red Green Blue Yellow Magenta Cyan","title":"Usage"},{"location":"unified-test-documentation/generic-test-setup/","text":"Dasharo Compatibility: Generic test setup Test setup Test setup is a set of procedures to be executed before the test execution. Typically, the same setup can be reused by multiple test cases, so there is no need to execute the setup actions before each independent case. Generic test setup Firmware Obtain FIRMWARE binary: you can download it from release document dedicated for platform which is used by you. or you can build one yourself as shown in the building document dedicated for platform which is used by you. Flash FIRMWARE binary to the DUT. Device flashing procedure should be carried out in accordance with the guidelines in Flashing document dedicated for platform which is in use. OS installer Download OPERATING_SYSTEM installer image. Attach USB stick to the PC. Flash OPERATING_SYSTEM image to the USB stick. Attach the USB stick to the DUT . OS installation Power on the DUT Enter the boot menu using the BIOS_SETUP_KEY . Select the Boot Menu and press Enter . Select the USB stick and press Enter . In case of the Ubuntu 22.04 , select the Ubuntu (safe graphics) in the GRUB menu. Wait for the OPERATING_SYSTEM installer to start. Install OPERATING_SYSTEM on the disk. Power off the DUT. Remove the installation media (USB stick with installer). NVIDIA drivers - Ubuntu 22.04 Power on the DUT. Wait until the OPERATING_SYSTEM boots from disk. Login into the OPERATING_SYSTEM . Open a terminal window and execute the following commands: sudo apt update sudo apt install nvidia-driver-470 A password prompt for secure boot configuration will appear. Choose a password (you can use your system password) and press Enter . Reboot the DUT. Upon entry into MOKUtil, select Enroll MOK and enter the password you chose during driver installation. Select the option Continue boot . Wait until the OPERATING_SYSTEM boots from disk. Login into the OPERATING_SYSTEM . Open the NVIDIA X Server Settings application. Open the PRIME Profiles section. Select NVIDIA On-demand and apply. Enter the OPERATING_SYSTEM password when prompted. OS boot from disk Power on the DUT. Wait until the OPERATING_SYSTEM boots from disk. Login into the OPERATING_SYSTEM .","title":"Generic Test Setup"},{"location":"unified-test-documentation/generic-test-setup/#dasharo-compatibility-generic-test-setup","text":"","title":"Dasharo Compatibility: Generic test setup"},{"location":"unified-test-documentation/generic-test-setup/#test-setup","text":"Test setup is a set of procedures to be executed before the test execution. Typically, the same setup can be reused by multiple test cases, so there is no need to execute the setup actions before each independent case.","title":"Test setup"},{"location":"unified-test-documentation/overview/","text":"Dasharo Test Specifiaction - overview The release procedure is always preceded by validation procedure. It is done on the basis of the test documentation, which can be found in this submenu. To properly use the documentation, it is advisable to read the following brief description of its components. Test Matrix Test Matrix is the document which shows platform-dedicated test suites and test cases. Based on it, the customer may scope the checks performed by the validation team each time before firmware release. Generic test setup Generic test setup is the document which describes all the steps that are performed before testing the various functionalities. Dasharo modules Tests performed during validation procedure can be divided into test modules, test suites and test cases. Test cases are the smallest component of validation procedure. Their task is to check, that the given functionality works properly under a certain conditions. Test suites group test cases related to the given functionality, while test modules groups test cases related to the similar functionalities (i. e. test suites which task is to check if differently OS boot properly on the platform). Currently in Dasharo test specification the following test modules can be distinguished: Dasharo Compatibility which contains test suites related to the basic functionailited of the device. Dasharo Security which contains test suites related to the platform security and supporting security modules. Dasharo Performance which contains test suites related to the platform booting performance.","title":"Overview"},{"location":"unified-test-documentation/overview/#dasharo-test-specifiaction-overview","text":"The release procedure is always preceded by validation procedure. It is done on the basis of the test documentation, which can be found in this submenu. To properly use the documentation, it is advisable to read the following brief description of its components.","title":"Dasharo Test Specifiaction - overview"},{"location":"unified-test-documentation/overview/#test-matrix","text":"Test Matrix is the document which shows platform-dedicated test suites and test cases. Based on it, the customer may scope the checks performed by the validation team each time before firmware release.","title":"Test Matrix"},{"location":"unified-test-documentation/overview/#generic-test-setup","text":"Generic test setup is the document which describes all the steps that are performed before testing the various functionalities.","title":"Generic test setup"},{"location":"unified-test-documentation/overview/#dasharo-modules","text":"Tests performed during validation procedure can be divided into test modules, test suites and test cases. Test cases are the smallest component of validation procedure. Their task is to check, that the given functionality works properly under a certain conditions. Test suites group test cases related to the given functionality, while test modules groups test cases related to the similar functionalities (i. e. test suites which task is to check if differently OS boot properly on the platform). Currently in Dasharo test specification the following test modules can be distinguished: Dasharo Compatibility which contains test suites related to the basic functionailited of the device. Dasharo Security which contains test suites related to the platform security and supporting security modules. Dasharo Performance which contains test suites related to the platform booting performance.","title":"Dasharo modules"},{"location":"unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/","text":"Dasharo: coreboot base port Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Connect to the UART debug interface and open a serial console. CBP001.001 Boot into coreboot stage bootblock Test description This test aims to verify that DUT during booting procedure reaches stage bootblock. The bootblock is the first stage executed after CPU reset, its main task is to set up everything for a C-environment. Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Test steps Power on the DUT. Read the booting procedure stage. Expected result The console output should contain string with the phrase: bootblock starting CBP002.001 Boot into coreboot stage romstage Test description This test aims to verify that DUT during booting procedure reaches stage romstage. The romstage initializes the DRAM and prepares everything for device init. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Expected result The console output should contain string with the phrase: romstage starting CBP003.001 Boot into coreboot stage postcar Test description This test aims to verify that DUT during booting procedure reaches stage postcar. The postcar tears down CAR and loads the ramstage. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Expected result The console output should contain string with the phrase: postcar starting CBP004.001 Boot into coreboot stage ramstage Test description This test aims to verify that DUT during booting procedure reaches stage ramstage. The ramstage does the main device init. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Expected result The console output should contain string the with phrase: ramstage starting CBP005.001 Resource allocator v4 - gathering requirements Test description This test aims to verify that DUT reaches the gathering requirements stage for Resource Allocator v4 during booting procedure. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Expected result The console output should contain a string with the phrase: Pass 1 ( gathering requirements ) CBP006.001 Resource allocator v4 - allocating resources Test description This test aims to verify that DUT reaches the allocating resources stage for Resource Allocator v4 during booting procedure. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Expected result The console output should contain a string with the phrase: Pass 2 ( allocating resources )","title":"Coreboot Base Port"},{"location":"unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/#dasharo-coreboot-base-port","text":"","title":"Dasharo: coreboot base port"},{"location":"unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Connect to the UART debug interface and open a serial console.","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/#cbp001001-boot-into-coreboot-stage-bootblock","text":"Test description This test aims to verify that DUT during booting procedure reaches stage bootblock. The bootblock is the first stage executed after CPU reset, its main task is to set up everything for a C-environment. Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Test steps Power on the DUT. Read the booting procedure stage. Expected result The console output should contain string with the phrase: bootblock starting","title":"CBP001.001 Boot into coreboot stage bootblock"},{"location":"unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/#cbp002001-boot-into-coreboot-stage-romstage","text":"Test description This test aims to verify that DUT during booting procedure reaches stage romstage. The romstage initializes the DRAM and prepares everything for device init. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Expected result The console output should contain string with the phrase: romstage starting","title":"CBP002.001 Boot into coreboot stage romstage"},{"location":"unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/#cbp003001-boot-into-coreboot-stage-postcar","text":"Test description This test aims to verify that DUT during booting procedure reaches stage postcar. The postcar tears down CAR and loads the ramstage. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Expected result The console output should contain string with the phrase: postcar starting","title":"CBP003.001 Boot into coreboot stage postcar"},{"location":"unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/#cbp004001-boot-into-coreboot-stage-ramstage","text":"Test description This test aims to verify that DUT during booting procedure reaches stage ramstage. The ramstage does the main device init. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Expected result The console output should contain string the with phrase: ramstage starting","title":"CBP004.001 Boot into coreboot stage ramstage"},{"location":"unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/#cbp005001-resource-allocator-v4-gathering-requirements","text":"Test description This test aims to verify that DUT reaches the gathering requirements stage for Resource Allocator v4 during booting procedure. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Expected result The console output should contain a string with the phrase: Pass 1 ( gathering requirements )","title":"CBP005.001 Resource allocator v4 - gathering requirements"},{"location":"unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/#cbp006001-resource-allocator-v4-allocating-resources","text":"Test description This test aims to verify that DUT reaches the allocating resources stage for Resource Allocator v4 during booting procedure. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power ON the DUT. By using the serial console read the booting procedure stage. Expected result The console output should contain a string with the phrase: Pass 2 ( allocating resources )","title":"CBP006.001 Resource allocator v4 - allocating resources"},{"location":"unified-test-documentation/dasharo-compatibility/301-memory-hcl/","text":"Dasharo compatibility: Memory HCL HCL001.001 Memory HCL - boot into OS (Ubuntu 22.04) Test description This test aims to verify that the DUT can boot with the memory module combinations specified in the HCL. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Prepare the memory modules specified in the HCL. Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Test steps Insert the memory module into the DUT's memory port, starting with the first position from the HCL. Power on the DUT. Boot into the system. Power off the DUT. Repeat the test steps for all positions in the HCL. Expected result The expected result is that the OS boots successfully with all memory combinations specified in the HCL If the OPERATING_SYSTEM boots, note the success and power the DUT OFF If the OPERATING_SYSTEM doesn't boot, check the logs (optional - if connected over serial console) for the FSP Memory Init has returned an error and note the failure","title":"Memory HCL"},{"location":"unified-test-documentation/dasharo-compatibility/301-memory-hcl/#dasharo-compatibility-memory-hcl","text":"","title":"Dasharo compatibility: Memory HCL"},{"location":"unified-test-documentation/dasharo-compatibility/301-memory-hcl/#hcl001001-memory-hcl-boot-into-os-ubuntu-2204","text":"Test description This test aims to verify that the DUT can boot with the memory module combinations specified in the HCL. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Prepare the memory modules specified in the HCL. Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Test steps Insert the memory module into the DUT's memory port, starting with the first position from the HCL. Power on the DUT. Boot into the system. Power off the DUT. Repeat the test steps for all positions in the HCL. Expected result The expected result is that the OS boots successfully with all memory combinations specified in the HCL If the OPERATING_SYSTEM boots, note the success and power the DUT OFF If the OPERATING_SYSTEM doesn't boot, check the logs (optional - if connected over serial console) for the FSP Memory Init has returned an error and note the failure","title":"HCL001.001 Memory HCL - boot into OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/303-custom-boot-menu-key/","text":"Dasharo compatibility: Custom Boot Keys CBK001.001 Custom Boot Menu Key Test description This test aims to verify that the DUT is configured to use custom Boot Menu hotkey (if it exists). Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the Boot Menu. Expected result The DUT boots into the Boot Menu after using the specified hotkey. CBK002.001 Custom BIOS Menu Key Test description This test aims to verify that the DUT is configured to use custom BIOS Menu hotkey. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Hold the BIOS_MENU_KEY to enter the BIOS menu. Expected result The DUT boots into the BIOS menu after using the specified hotkey.","title":"Custom Boot Keys"},{"location":"unified-test-documentation/dasharo-compatibility/303-custom-boot-menu-key/#dasharo-compatibility-custom-boot-keys","text":"","title":"Dasharo compatibility: Custom Boot Keys"},{"location":"unified-test-documentation/dasharo-compatibility/303-custom-boot-menu-key/#cbk001001-custom-boot-menu-key","text":"Test description This test aims to verify that the DUT is configured to use custom Boot Menu hotkey (if it exists). Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the Boot Menu. Expected result The DUT boots into the Boot Menu after using the specified hotkey.","title":"CBK001.001 Custom Boot Menu Key"},{"location":"unified-test-documentation/dasharo-compatibility/303-custom-boot-menu-key/#cbk002001-custom-bios-menu-key","text":"Test description This test aims to verify that the DUT is configured to use custom BIOS Menu hotkey. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Hold the BIOS_MENU_KEY to enter the BIOS menu. Expected result The DUT boots into the BIOS menu after using the specified hotkey.","title":"CBK002.001 Custom BIOS Menu Key"},{"location":"unified-test-documentation/dasharo-compatibility/304-custom-logo/","text":"Dasharo compatibility: Custom Logo CLG001.001 Custom boot logo Test description This test aims to verify that the DUT is configured to display the specified (customized) logo at boot. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for the boot logo to appear. Expected result The displayed logo should depend on the Dasharo variant: if the Dasharo variant is NovaCustom - the NovaCustom logo should be displayed, if the Dasharo variant is Protectli - the Protectli logo should be displayed, if the Dasharo variant is Tuxedo - the Tuxedo logo should be displayed, for all other variants Dasharo custom logo should be displayed. Keep in mind that the end-user's customized boot logo might also be displayed - if before the custom logo checking procedure described in the Logo customization documentation has been performed.","title":"Custom Logo"},{"location":"unified-test-documentation/dasharo-compatibility/304-custom-logo/#dasharo-compatibility-custom-logo","text":"","title":"Dasharo compatibility: Custom Logo"},{"location":"unified-test-documentation/dasharo-compatibility/304-custom-logo/#clg001001-custom-boot-logo","text":"Test description This test aims to verify that the DUT is configured to display the specified (customized) logo at boot. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for the boot logo to appear. Expected result The displayed logo should depend on the Dasharo variant: if the Dasharo variant is NovaCustom - the NovaCustom logo should be displayed, if the Dasharo variant is Protectli - the Protectli logo should be displayed, if the Dasharo variant is Tuxedo - the Tuxedo logo should be displayed, for all other variants Dasharo custom logo should be displayed. Keep in mind that the end-user's customized boot logo might also be displayed - if before the custom logo checking procedure described in the Logo customization documentation has been performed.","title":"CLG001.001 Custom boot logo"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/","text":"Dasharo compatibility: USB HID and MSC Support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . USB001.001 USB devices detection (firmware) Test description This test aims to verify that the external USB devices are detected correctly by the firmware and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Connect the flash drive using the USB port. Test steps Power on the DUT. Enter the boot menu using the BIOS_SETUP_KEY . Select the Boot Menu , press Enter and note the result. Expected result Flash drive entry is listed in the boot menu. USB001.002 USB devices detection in OS (Ubuntu 22.04) Test description This test aims to verify that the external USB devices are detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: watch -n1 lsusb Connect external USB devices to DUT USB A port and note the result. Expected result After each device is connected to the USB port, a new USB device entry in lsusb command output should appear. USB001.003 USB devices detection in OS (Windows 11) Test description This test aims to verify that the external USB devices are detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and and run the following command: Get-PnpDevice -PresentOnly | Where-Object { $_ .InstanceId -match '^USB' } Note the results. Expected result After executing the command, a list containing all USB devices should be displayed. All devices' status should be OK . Example output: Status Class FriendlyName ------ ----- ------------ OK DiskDrive Mass Storage Device USB Device OK USB Generic USB Hub OK HIDClass USB Input Device OK Bluetooth Intel ( R ) Wireless Bluetooth ( R ) OK USB USB Root Hub ( USB 3 .0 ) OK Net TP-LINK Gigabit Ethernet USB Adapter OK USB Generic USB Hub OK USB USB Mass Storage Device USB002.001 USB keyboard detection (firmware) Test description This test aims to verify that the external USB keyboard is detected correctly by the firmware and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Connect the external USB keyboard using the USB port. Test steps Power on the DUT Enter the boot menu using the BIOS_SETUP_KEY . Use the arrow keys, Esc key and the Enter key to navigate the menus. Expected result All menus can be entered using the external USB keyboard. USB002.002 USB keyboard detection (Ubuntu 22.04) Test description This test aims to verify that the external USB keyboard is detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install libinput-tools on the DUT. Connect the external USB keyboard using the USB port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Run the following command in the terminal: libinput debug-events --show-keycodes Test the alphanumeric keys and note the generated keycodes. Test non-alphanumeric keys and verify that they generate the correct keycodes. Test key combinations with the Shift , Ctrl and Alt modifier keys (this tests 2-key rollover). Expected result The external USB keyboard is detected in OS. All standard keyboard keys generate the correct keycodes and events as per their labels. Key combinations are detected correctly. USB002.003 USB keyboard detection (Windows 11) Test description This test aims to verify that the external USB keyboard is detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect the external USB keyboard using the USB port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and run the following command: Get-CimInstance win32_KEYBOARD Note the results. Open notepad . Test the alphanumeric keys and note the generated characters. Test non-alphanumeric keys and verify that they generate the signs. Test key combinations with the Shift , and Alt modifier keys. Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. Check if On-Screen Keyboard correctly highlights it. Open Start menu and press Esc . Check if Start menu is properly closed. Expected result After running the PowerShell command information about connected keyboard should be displayed. Example output: Caption : Enhanced ( 101 - or 102 -key ) Description : USB Input Device InstallDate : Name : Enhanced ( 101 - or 102 -key ) Status : OK Availability : ConfigManagerErrorCode : 0 ConfigManagerUserConfig : False CreationClassName : Win32_Keyboard DeviceID : USB \\V ID_046D & PID_C31C & MI_00 \\6 & 26C21341 & 0 & 0000 ErrorCleared : ErrorDescription : LastErrorCode : PNPDeviceID : USB \\V ID_046D & PID_C31C & MI_00 \\6 & 26C21341 & 0 & 0000 PowerManagementCapabilities : PowerManagementSupported : False StatusInfo : SystemCreationClassName : Win32_ComputerSystem SystemName : DESKTOP-CUR9H2J IsLocked : Layout : 00000409 NumberOfFunctionKeys : 12 Password : PSComputerName : All standard keyboard keys generate correct characters or actions when pressed. Key combinations are detected correctly. USB003.001 Upload 1GB file on USB storage (Ubuntu 22.04) Test description This test aims to verify that the 1GB file can be transferred from the OPERATING_SYSTEM to the USB storage . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 USB storage - at least 1GB of free space Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command to generate 1GB file: openssl rand -out test_file.txt -base64 $(( 2 ** 30 * 3 / 4 )) Plug in the USB storage to the USB port. Read the path to the USB storage by running the following command: lsblk Copy the generated file to the USB storage by running the following command: cp test_file.txt { path_to_usb_storage } Verify that the files are the same by running the following command: sha256sum test_file.txt { path_to_usb_storage } /test_file.txt Expected result The output from the last command should contain 2 identical checksums: f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb test_file.txt f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb { path_to_usb_storage } /test_file.txt USB003.002 Upload 1GB file on USB storage (Windows 11) Test description This test aims to verify that the 1GB file can be transferred from the OPERATING_SYSTEM to the USB storage . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 USB storage - at least 1GB of free space Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open powershell as administrator and run the following command to generate 1GB file: fsutil file createnew test_file . txt 1073741824 Plug in the USB storage to the USB port. Read the drive letter assigned to the USB storage by running the following command: ( Get-Volume | where drivetype -eq removable ). driveletter Copy the generated file to the USB storage by running the following command: Copy-Item -Path C :\\ Windows \\ system32 \\ test_file . txt { drive_letter }: Verify that the files are the same by running the following commands: Get-FileHash test_file . txt Get-FileHash { drive_letter }:\\ test_file . txt Expected result The output from the last commands should have equal hash: Algorithm Hash Path --------- ---- ---- SHA256 F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB C \\ Windows \\ system3 ... Algorithm Hash Path --------- ---- ---- SHA256 F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB E :\\ test_file . txt","title":"USB HID and MSC support"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/#dasharo-compatibility-usb-hid-and-msc-support","text":"","title":"Dasharo compatibility: USB HID and MSC Support"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/#usb001001-usb-devices-detection-firmware","text":"Test description This test aims to verify that the external USB devices are detected correctly by the firmware and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Connect the flash drive using the USB port. Test steps Power on the DUT. Enter the boot menu using the BIOS_SETUP_KEY . Select the Boot Menu , press Enter and note the result. Expected result Flash drive entry is listed in the boot menu.","title":"USB001.001 USB devices detection (firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/#usb001002-usb-devices-detection-in-os-ubuntu-2204","text":"Test description This test aims to verify that the external USB devices are detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: watch -n1 lsusb Connect external USB devices to DUT USB A port and note the result. Expected result After each device is connected to the USB port, a new USB device entry in lsusb command output should appear.","title":"USB001.002 USB devices detection in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/#usb001003-usb-devices-detection-in-os-windows-11","text":"Test description This test aims to verify that the external USB devices are detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and and run the following command: Get-PnpDevice -PresentOnly | Where-Object { $_ .InstanceId -match '^USB' } Note the results. Expected result After executing the command, a list containing all USB devices should be displayed. All devices' status should be OK . Example output: Status Class FriendlyName ------ ----- ------------ OK DiskDrive Mass Storage Device USB Device OK USB Generic USB Hub OK HIDClass USB Input Device OK Bluetooth Intel ( R ) Wireless Bluetooth ( R ) OK USB USB Root Hub ( USB 3 .0 ) OK Net TP-LINK Gigabit Ethernet USB Adapter OK USB Generic USB Hub OK USB USB Mass Storage Device","title":"USB001.003 USB devices detection in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/#usb002001-usb-keyboard-detection-firmware","text":"Test description This test aims to verify that the external USB keyboard is detected correctly by the firmware and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Connect the external USB keyboard using the USB port. Test steps Power on the DUT Enter the boot menu using the BIOS_SETUP_KEY . Use the arrow keys, Esc key and the Enter key to navigate the menus. Expected result All menus can be entered using the external USB keyboard.","title":"USB002.001 USB keyboard detection (firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/#usb002002-usb-keyboard-detection-ubuntu-2204","text":"Test description This test aims to verify that the external USB keyboard is detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install libinput-tools on the DUT. Connect the external USB keyboard using the USB port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Run the following command in the terminal: libinput debug-events --show-keycodes Test the alphanumeric keys and note the generated keycodes. Test non-alphanumeric keys and verify that they generate the correct keycodes. Test key combinations with the Shift , Ctrl and Alt modifier keys (this tests 2-key rollover). Expected result The external USB keyboard is detected in OS. All standard keyboard keys generate the correct keycodes and events as per their labels. Key combinations are detected correctly.","title":"USB002.002 USB keyboard detection (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/#usb002003-usb-keyboard-detection-windows-11","text":"Test description This test aims to verify that the external USB keyboard is detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect the external USB keyboard using the USB port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and run the following command: Get-CimInstance win32_KEYBOARD Note the results. Open notepad . Test the alphanumeric keys and note the generated characters. Test non-alphanumeric keys and verify that they generate the signs. Test key combinations with the Shift , and Alt modifier keys. Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. Check if On-Screen Keyboard correctly highlights it. Open Start menu and press Esc . Check if Start menu is properly closed. Expected result After running the PowerShell command information about connected keyboard should be displayed. Example output: Caption : Enhanced ( 101 - or 102 -key ) Description : USB Input Device InstallDate : Name : Enhanced ( 101 - or 102 -key ) Status : OK Availability : ConfigManagerErrorCode : 0 ConfigManagerUserConfig : False CreationClassName : Win32_Keyboard DeviceID : USB \\V ID_046D & PID_C31C & MI_00 \\6 & 26C21341 & 0 & 0000 ErrorCleared : ErrorDescription : LastErrorCode : PNPDeviceID : USB \\V ID_046D & PID_C31C & MI_00 \\6 & 26C21341 & 0 & 0000 PowerManagementCapabilities : PowerManagementSupported : False StatusInfo : SystemCreationClassName : Win32_ComputerSystem SystemName : DESKTOP-CUR9H2J IsLocked : Layout : 00000409 NumberOfFunctionKeys : 12 Password : PSComputerName : All standard keyboard keys generate correct characters or actions when pressed. Key combinations are detected correctly.","title":"USB002.003 USB keyboard detection (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/#usb003001-upload-1gb-file-on-usb-storage-ubuntu-2204","text":"Test description This test aims to verify that the 1GB file can be transferred from the OPERATING_SYSTEM to the USB storage . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 USB storage - at least 1GB of free space Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command to generate 1GB file: openssl rand -out test_file.txt -base64 $(( 2 ** 30 * 3 / 4 )) Plug in the USB storage to the USB port. Read the path to the USB storage by running the following command: lsblk Copy the generated file to the USB storage by running the following command: cp test_file.txt { path_to_usb_storage } Verify that the files are the same by running the following command: sha256sum test_file.txt { path_to_usb_storage } /test_file.txt Expected result The output from the last command should contain 2 identical checksums: f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb test_file.txt f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb { path_to_usb_storage } /test_file.txt","title":"USB003.001 Upload 1GB file on USB storage (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/#usb003002-upload-1gb-file-on-usb-storage-windows-11","text":"Test description This test aims to verify that the 1GB file can be transferred from the OPERATING_SYSTEM to the USB storage . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 USB storage - at least 1GB of free space Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open powershell as administrator and run the following command to generate 1GB file: fsutil file createnew test_file . txt 1073741824 Plug in the USB storage to the USB port. Read the drive letter assigned to the USB storage by running the following command: ( Get-Volume | where drivetype -eq removable ). driveletter Copy the generated file to the USB storage by running the following command: Copy-Item -Path C :\\ Windows \\ system32 \\ test_file . txt { drive_letter }: Verify that the files are the same by running the following commands: Get-FileHash test_file . txt Get-FileHash { drive_letter }:\\ test_file . txt Expected result The output from the last commands should have equal hash: Algorithm Hash Path --------- ---- ---- SHA256 F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB C \\ Windows \\ system3 ... Algorithm Hash Path --------- ---- ---- SHA256 F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB E :\\ test_file . txt","title":"USB003.002 Upload 1GB file on USB storage (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/307-freebsd-support/","text":"Dasharo Compatibility: FreeBSD support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installation . BSD001.001 FreeBSD installation and boot Test description This test verifies that FreeBSD distribution could be installed on the DUT and works properly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = FreeBSD 13 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"FreeBSD support"},{"location":"unified-test-documentation/dasharo-compatibility/307-freebsd-support/#dasharo-compatibility-freebsd-support","text":"","title":"Dasharo Compatibility: FreeBSD support"},{"location":"unified-test-documentation/dasharo-compatibility/307-freebsd-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installation .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/307-freebsd-support/#bsd001001-freebsd-installation-and-boot","text":"Test description This test verifies that FreeBSD distribution could be installed on the DUT and works properly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = FreeBSD 13 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BSD001.001 FreeBSD installation and boot"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/","text":"Dasharo Compatibility: Debian Stable and Ubuntu LTS support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . LBT001.001 Debian Stable installation on USB storage Test description This test aims to verify that Debian Stable distribution could be installed on USB storage attached to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. As disk choose the USB stick. Expected result The information about successful installation should be displayed. LBT001.002 Boot Debian from USB Test description This test aims to verify that Debian Stable distribution could be booted from USB storage attached to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the USB_STORAGE on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. LBT002.001 Ubuntu LTS installation on USB storage Test description This test aims to verify that Ubuntu LTS modern distribution could be installed on USB storage attached to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. As disk choose the USB stick. Expected result The information about successful installation should be displayed. LBT002.002 Boot Ubuntu from USB Test description This test aims to verify that Ubuntu LTS modern distribution could be booted from USB storage attached to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the USB_STORAGE on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. LBT003.001 Debian Stable installation on Hard Disk Test description This test aims to verify that Debian Stable distribution could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. As disk choose the mounted in the DUT Hard Disk. Expected result The information about successful installation should be displayed. LBT003.002 Boot Debian from Hard Disk Test description This test aims to verify that Debian Stable distribution could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the hard disk on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. LBT004.001 Ubuntu LTS installation on Hard Disk Test description This test aims to verify that Ubuntu LTS modern distribution could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. As disk choose the mounted in the DUT Hard Disk. Expected result The information about successful installation should be displayed. LBT004.002 Boot Ubuntu From Hard Disk Test description This test aims to verify that Ubuntu LTS modern distribution could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the hard disk on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"Debian Stable and Ubuntu LTS support"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/#dasharo-compatibility-debian-stable-and-ubuntu-lts-support","text":"","title":"Dasharo Compatibility: Debian Stable and Ubuntu LTS support"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/#lbt001001-debian-stable-installation-on-usb-storage","text":"Test description This test aims to verify that Debian Stable distribution could be installed on USB storage attached to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. As disk choose the USB stick. Expected result The information about successful installation should be displayed.","title":"LBT001.001 Debian Stable installation on USB storage"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/#lbt001002-boot-debian-from-usb","text":"Test description This test aims to verify that Debian Stable distribution could be booted from USB storage attached to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the USB_STORAGE on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"LBT001.002 Boot Debian from USB"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/#lbt002001-ubuntu-lts-installation-on-usb-storage","text":"Test description This test aims to verify that Ubuntu LTS modern distribution could be installed on USB storage attached to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. As disk choose the USB stick. Expected result The information about successful installation should be displayed.","title":"LBT002.001 Ubuntu LTS installation on USB storage"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/#lbt002002-boot-ubuntu-from-usb","text":"Test description This test aims to verify that Ubuntu LTS modern distribution could be booted from USB storage attached to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the USB_STORAGE on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"LBT002.002 Boot Ubuntu from USB"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/#lbt003001-debian-stable-installation-on-hard-disk","text":"Test description This test aims to verify that Debian Stable distribution could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. As disk choose the mounted in the DUT Hard Disk. Expected result The information about successful installation should be displayed.","title":"LBT003.001 Debian Stable installation on Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/#lbt003002-boot-debian-from-hard-disk","text":"Test description This test aims to verify that Debian Stable distribution could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the hard disk on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"LBT003.002 Boot Debian from Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/#lbt004001-ubuntu-lts-installation-on-hard-disk","text":"Test description This test aims to verify that Ubuntu LTS modern distribution could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. As disk choose the mounted in the DUT Hard Disk. Expected result The information about successful installation should be displayed.","title":"LBT004.001 Ubuntu LTS installation on Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/#lbt004002-boot-ubuntu-from-hard-disk","text":"Test description This test aims to verify that Ubuntu LTS modern distribution could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the hard disk on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"LBT004.002 Boot Ubuntu From Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/309-qubesos-support/","text":"Dasharo Compatibility: QubesOS support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . QBS001.001 QubesOS installation Test description This test aims to verify that QubesOS Stable distribution could be installed. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS 4.1.1 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed. QBS001.002 Boot QubesOS Test description This test aims to verify that QubesOS Stable distribution could be booted. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS 4.1.1 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the DISK on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"QubesOS support"},{"location":"unified-test-documentation/dasharo-compatibility/309-qubesos-support/#dasharo-compatibility-qubesos-support","text":"","title":"Dasharo Compatibility: QubesOS support"},{"location":"unified-test-documentation/dasharo-compatibility/309-qubesos-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/309-qubesos-support/#qbs001001-qubesos-installation","text":"Test description This test aims to verify that QubesOS Stable distribution could be installed. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS 4.1.1 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed.","title":"QBS001.001 QubesOS installation"},{"location":"unified-test-documentation/dasharo-compatibility/309-qubesos-support/#qbs001002-boot-qubesos","text":"Test description This test aims to verify that QubesOS Stable distribution could be booted. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS 4.1.1 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the DISK on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"QBS001.002 Boot QubesOS"},{"location":"unified-test-documentation/dasharo-compatibility/30A-custom-network-boot-entries/","text":"Dasharo Compatibility: Custom Network Boot entries CNB001.002 Only one iPXE in boot menu Test description This test aims to verify that thenetwork boot option with iPXE appears only once in the boot option list. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Check the iPXE is listed only once on the boot option list. Expected result There is only one iPXE entry on the boot option list.","title":"Custom Network Boot entries"},{"location":"unified-test-documentation/dasharo-compatibility/30A-custom-network-boot-entries/#dasharo-compatibility-custom-network-boot-entries","text":"","title":"Dasharo Compatibility: Custom Network Boot entries"},{"location":"unified-test-documentation/dasharo-compatibility/30A-custom-network-boot-entries/#cnb001002-only-one-ipxe-in-boot-menu","text":"Test description This test aims to verify that thenetwork boot option with iPXE appears only once in the boot option list. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Check the iPXE is listed only once on the boot option list. Expected result There is only one iPXE entry on the boot option list.","title":"CNB001.002 Only one iPXE in boot menu"},{"location":"unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/","text":"Dasharo Compatibility: Memtest payload support MEM001.001 Memtest availability Test description This test aims to verify that the Memtest entry is available in DUT boot menu. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if Payload [memtest] is available in the boot menu. Expected result The Payload [memtest] option should be visible as the one of boot menu options. MEM002.001 Enter Memtest Test description This test aims to verify that the DUT enters the Memtestboot option. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the key with a proper number for Payload [memtest] . Check if Memtest86+ is available. Expected result The Memtest86+ is visible at the top of the output. MEM003.001 Memtest stability Test description This test aims to verify that the Memtest starts does not hang under DUT. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the key with a proper number for Payload [memtest] . Check if State: - Running... is available. Expected result The State: - Running... is visible after a few seconds and confirms that the the test is in progress. MEM004.001 Memtest refreshing by 'L' key Test description This test aims to verify that DUT refreshes Memtest properly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the key with a proper number for BOOT_MENU_ENTRY . Press the L key. Check if L refreshes output. Expected result The Memtest86+ is visible before and after pressing L . MEM005.001 Memtest refreshing by 'l' key Test description This test aims to verify that DUT refreshes Memtest properly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the key with a proper number for BOOT_MENU_ENTRY . Press the l key. Check if l refreshes output. Expected result The Memtest86+ is visible before and after pressing l . MEM006.001 Memtest completing Test description This test aims to verify that DUT completes Memtest. FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the key with a proper number for Payload [memtest] . Make sure that State: - Running... is available. Wait until ** Pass complete, no errors, press Esc to exit ** appears. Expected result After the test completes without any errors ** Pass complete, no errors, press Esc to exit ** message is visible on the bottom of the screen.","title":"Memtest payload support"},{"location":"unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/#dasharo-compatibility-memtest-payload-support","text":"","title":"Dasharo Compatibility: Memtest payload support"},{"location":"unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/#mem001001-memtest-availability","text":"Test description This test aims to verify that the Memtest entry is available in DUT boot menu. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if Payload [memtest] is available in the boot menu. Expected result The Payload [memtest] option should be visible as the one of boot menu options.","title":"MEM001.001 Memtest availability"},{"location":"unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/#mem002001-enter-memtest","text":"Test description This test aims to verify that the DUT enters the Memtestboot option. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the key with a proper number for Payload [memtest] . Check if Memtest86+ is available. Expected result The Memtest86+ is visible at the top of the output.","title":"MEM002.001 Enter Memtest"},{"location":"unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/#mem003001-memtest-stability","text":"Test description This test aims to verify that the Memtest starts does not hang under DUT. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the key with a proper number for Payload [memtest] . Check if State: - Running... is available. Expected result The State: - Running... is visible after a few seconds and confirms that the the test is in progress.","title":"MEM003.001 Memtest stability"},{"location":"unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/#mem004001-memtest-refreshing-by-l-key","text":"Test description This test aims to verify that DUT refreshes Memtest properly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the key with a proper number for BOOT_MENU_ENTRY . Press the L key. Check if L refreshes output. Expected result The Memtest86+ is visible before and after pressing L .","title":"MEM004.001 Memtest refreshing by 'L' key"},{"location":"unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/#mem005001-memtest-refreshing-by-l-key","text":"Test description This test aims to verify that DUT refreshes Memtest properly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the key with a proper number for BOOT_MENU_ENTRY . Press the l key. Check if l refreshes output. Expected result The Memtest86+ is visible before and after pressing l .","title":"MEM005.001 Memtest refreshing by 'l' key"},{"location":"unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/#mem006001-memtest-completing","text":"Test description This test aims to verify that DUT completes Memtest. FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the key with a proper number for Payload [memtest] . Make sure that State: - Running... is available. Wait until ** Pass complete, no errors, press Esc to exit ** appears. Expected result After the test completes without any errors ** Pass complete, no errors, press Esc to exit ** message is visible on the bottom of the screen.","title":"MEM006.001 Memtest completing"},{"location":"unified-test-documentation/dasharo-compatibility/30M-uefi-compatible-interface/","text":"Dasharo Compatibility: UEFI compatible interface EFI001.001 Boot into UEFI OS (Ubuntu 22.04) Test description This test verifies the presence of UEFI compatible interface by booting UEFI-aware Operating System. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Enter the boot menu using the BIOS_SETUP_KEY . Select the Boot Menu and press Enter . Select the USB stick and press Enter . Select the Ubuntu (safe graphics) in the GRUB menu. Wait for the OPERATING_SYSTEM to finalize booting, by either of the: OPERATING_SYSTEM installer initialization, login form initialization. Power OFF the DUT. Expected result Either the login screen or the OPERATING_SYSTEM installer appears on the internal LCD. EFI001.002 Boot into UEFI OS (Windows 11) Test description This test aims to verify the presence of UEFI compatible interface by booting UEFI-aware Operating System. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Enter the boot menu using the BIOS_SETUP_KEY . Select the Boot Menu and press Enter . Select the USB stick and press Enter . Wait for the OPERATING_SYSTEM to boot finalize booting, by either of the: OPERATING_SYSTEM installer initialization, login form initialization. Power OFF the DUT. Expected result Either the login screen or the OPERATING_SYSTEM installer appears on the internal LCD.","title":"UEFI compatible interface"},{"location":"unified-test-documentation/dasharo-compatibility/30M-uefi-compatible-interface/#dasharo-compatibility-uefi-compatible-interface","text":"","title":"Dasharo Compatibility: UEFI compatible interface"},{"location":"unified-test-documentation/dasharo-compatibility/30M-uefi-compatible-interface/#efi001001-boot-into-uefi-os-ubuntu-2204","text":"Test description This test verifies the presence of UEFI compatible interface by booting UEFI-aware Operating System. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Enter the boot menu using the BIOS_SETUP_KEY . Select the Boot Menu and press Enter . Select the USB stick and press Enter . Select the Ubuntu (safe graphics) in the GRUB menu. Wait for the OPERATING_SYSTEM to finalize booting, by either of the: OPERATING_SYSTEM installer initialization, login form initialization. Power OFF the DUT. Expected result Either the login screen or the OPERATING_SYSTEM installer appears on the internal LCD.","title":"EFI001.001 Boot into UEFI OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/30M-uefi-compatible-interface/#efi001002-boot-into-uefi-os-windows-11","text":"Test description This test aims to verify the presence of UEFI compatible interface by booting UEFI-aware Operating System. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Enter the boot menu using the BIOS_SETUP_KEY . Select the Boot Menu and press Enter . Select the USB stick and press Enter . Wait for the OPERATING_SYSTEM to boot finalize booting, by either of the: OPERATING_SYSTEM installer initialization, login form initialization. Power OFF the DUT. Expected result Either the login screen or the OPERATING_SYSTEM installer appears on the internal LCD.","title":"EFI001.002 Boot into UEFI OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/30P-uefi-shell/","text":"Dasharo Compatibility: UEFI Shell USH001.001 UEFI Shell Test description This test aims to verify that the DUT has the ability to boot into an integrated UEFI Shell application. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: Firmware . Test steps Power on the DUT. While the DUT is booting, hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the UEFI Shell option using the arrow keys and press Enter . Expected result The DUT boots into an UEFI Shell successfully, as indicated by the example console output shown on the screen: UEFI Interactive Shell v2.2 EDK II UEFI v2.70 (EDK II, 0x00010000) Mapping table FS0: Alias(s):HD1b:;BLK2: PciRoot(0x0)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,9C-BB-50-01-BB-38-25-5 -4BB4-4FDD-9534-B097CD497222,0x800,0x100000) FS1: Alias(s):HD1c:;BLK3: PciRoot(0x0)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,9C-BB-50-01-BB-38-25-1 -C6AB-4400-AE03-0BF2960DD525,0x100800,0x1D0C5000) BLK1: Alias(s): PciRoot(0x0)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,9C-BB-50-01-BB-38-25-) BLK0: Alias(s): PciRoot(0x0)/Pci(0x14,0x0)/USB(0x0,0x2) Press ESC in 1 seconds to skip startup.nsh or any other key to continue.","title":"UEFI Shell"},{"location":"unified-test-documentation/dasharo-compatibility/30P-uefi-shell/#dasharo-compatibility-uefi-shell","text":"","title":"Dasharo Compatibility: UEFI Shell"},{"location":"unified-test-documentation/dasharo-compatibility/30P-uefi-shell/#ush001001-uefi-shell","text":"Test description This test aims to verify that the DUT has the ability to boot into an integrated UEFI Shell application. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: Firmware . Test steps Power on the DUT. While the DUT is booting, hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the UEFI Shell option using the arrow keys and press Enter . Expected result The DUT boots into an UEFI Shell successfully, as indicated by the example console output shown on the screen: UEFI Interactive Shell v2.2 EDK II UEFI v2.70 (EDK II, 0x00010000) Mapping table FS0: Alias(s):HD1b:;BLK2: PciRoot(0x0)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,9C-BB-50-01-BB-38-25-5 -4BB4-4FDD-9534-B097CD497222,0x800,0x100000) FS1: Alias(s):HD1c:;BLK3: PciRoot(0x0)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,9C-BB-50-01-BB-38-25-1 -C6AB-4400-AE03-0BF2960DD525,0x100800,0x1D0C5000) BLK1: Alias(s): PciRoot(0x0)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,9C-BB-50-01-BB-38-25-) BLK0: Alias(s): PciRoot(0x0)/Pci(0x14,0x0)/USB(0x0,0x2) Press ESC in 1 seconds to skip startup.nsh or any other key to continue.","title":"USH001.001 UEFI Shell"},{"location":"unified-test-documentation/dasharo-compatibility/310-fedora-support/","text":"Dasharo Compatibility: Fedora support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . FED001.001 Fedora installation Test description This test aims to verify that Fedora Stable distribution could be installed. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Fedora 37 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed. FED001.002 Boot Fedora Test description This test aims to verify that Fedora Stable distribution could be booted. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Fedora 37 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the DISK on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"Fedora support"},{"location":"unified-test-documentation/dasharo-compatibility/310-fedora-support/#dasharo-compatibility-fedora-support","text":"","title":"Dasharo Compatibility: Fedora support"},{"location":"unified-test-documentation/dasharo-compatibility/310-fedora-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/310-fedora-support/#fed001001-fedora-installation","text":"Test description This test aims to verify that Fedora Stable distribution could be installed. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Fedora 37 Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed.","title":"FED001.001 Fedora installation"},{"location":"unified-test-documentation/dasharo-compatibility/310-fedora-support/#fed001002-boot-fedora","text":"Test description This test aims to verify that Fedora Stable distribution could be booted. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Fedora 37 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the DISK on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"FED001.002 Boot Fedora"},{"location":"unified-test-documentation/dasharo-compatibility/312-nvme-support/","text":"Dasharo Compatibility: NVMe support NVM001.001 NVMe support (firmware) Test description This test aims to verify that firmware is able to correctly detect NVMe disk in the M.2 slot. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Insert a NVMe disk into the M.2 slot on the DUT. Power on the DUT. While the DUT is booting, hold the BOOT_MENU_KEY to enter the UEFI Boot Menu and note the result. Expected result The NVMe disk should be listed on the bootable devices list. NVM001.002 NVMe support (Ubuntu 22.04) Test description This test aims to verify booting the Operating System from NVMe disk in the M.2 slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Insert a NVMe disk into the M.2 slot on the DUT. Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo mount | grep 'on / ' Expected result The OPERATING_SYSTEM has been booted from the NVMe disk correctly. Output in Terminal indicates that system partition is installed on the NVMe disk: /dev/nvme* on / tpe ext4 ( rw,relatime,errors = remount-ro ) NVM001.003 NVMe support in OS (Windows 11) Test description This test aims to verify booting the Operating System from NVMe disk in the M.2 slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Generic test setup: firmware . Insert a NVMe disk into the M.2 slot on the DUT. Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell as administrator. Run below command and note the result: Get-PnpDevice -Status \"OK\" | where { $_ . InstanceId -like \"SCSI\\DISK&VEN_NVME&*\" } Expected result The OPERATING_SYSTEM booting from the NVMe disk Command should output at least one NVMe drive. Similar as below: Status Class FriendlyName ------ ----- ------------ OK DiskDrive Samsung SSD 980 PRO 500GB","title":"NVME support"},{"location":"unified-test-documentation/dasharo-compatibility/312-nvme-support/#dasharo-compatibility-nvme-support","text":"","title":"Dasharo Compatibility: NVMe support"},{"location":"unified-test-documentation/dasharo-compatibility/312-nvme-support/#nvm001001-nvme-support-firmware","text":"Test description This test aims to verify that firmware is able to correctly detect NVMe disk in the M.2 slot. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Insert a NVMe disk into the M.2 slot on the DUT. Power on the DUT. While the DUT is booting, hold the BOOT_MENU_KEY to enter the UEFI Boot Menu and note the result. Expected result The NVMe disk should be listed on the bootable devices list.","title":"NVM001.001 NVMe support (firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/312-nvme-support/#nvm001002-nvme-support-ubuntu-2204","text":"Test description This test aims to verify booting the Operating System from NVMe disk in the M.2 slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Insert a NVMe disk into the M.2 slot on the DUT. Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo mount | grep 'on / ' Expected result The OPERATING_SYSTEM has been booted from the NVMe disk correctly. Output in Terminal indicates that system partition is installed on the NVMe disk: /dev/nvme* on / tpe ext4 ( rw,relatime,errors = remount-ro )","title":"NVM001.002 NVMe support (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/312-nvme-support/#nvm001003-nvme-support-in-os-windows-11","text":"Test description This test aims to verify booting the Operating System from NVMe disk in the M.2 slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Generic test setup: firmware . Insert a NVMe disk into the M.2 slot on the DUT. Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell as administrator. Run below command and note the result: Get-PnpDevice -Status \"OK\" | where { $_ . InstanceId -like \"SCSI\\DISK&VEN_NVME&*\" } Expected result The OPERATING_SYSTEM booting from the NVMe disk Command should output at least one NVMe drive. Similar as below: Status Class FriendlyName ------ ----- ------------ OK DiskDrive Samsung SSD 980 PRO 500GB","title":"NVM001.003 NVMe support in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/315-network-boot/","text":"Dasharo Compatibility: Network Boot Test cases common documentation Test setup Proceed with the Generic test setup: firmware . The DUT should be connected to the Internet by using an Ethernet cable. PXE001.001 Dasharo Network Boot is bootable Test description This test aims to verify, that the iPXE Network boot is bootable in the boot menu and whether, after selecting this boot option, Dasharo Network Boot Menu is displayed. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Expected result After selecting the iPXE Network boot , the Dasharo Network Boot Menu should be displayed. PXE002.001 Dasharo network boot menu boot options order is correct Test description This test aims to verify that Dasharo Network Boot Menu contains all of the needed options which are in the correct order. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Expected result Dasharo Network Boot Menu contains all of the needed options. Dasharo Network Boot Menu options are in order as follows: Autoboot Dasharo Tools Suite OS installation iPXE Shell PXE003.001 Autoboot option is available and works correctly Test description This test aims to verify that the Autoboot option in Dasharo Network Boot Menu works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Select the Autoboot option using the arrow keys, then press Enter . Expected result If the server assigned to the Autoboot option is available in the local network, the boot menu should appear. If the server assigned to the Autoboot option isn't available in the local network, selecting this option will result in configuring the network interfaces and return to the Setup Menu . PXE004.001 DTS option is available and works correctly Test description This test aims to verify that the Dasharo Tools Suite option in Dasharo Network Boot Menu allows booting into DTS. Test configuration data FIRMWARE = coreboot Test setup Proceed with the Test cases common documentation section. Proceed with the Requirements for DTS . Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Select the Dasharo Tools Suite option using the arrow keys, then press Enter . Expected result After configuring the network interfaces, connecting to the server and booting, Dasharo Tools Suite menu should appear. PXE005.001 OS installation option is available and works correctly Test description This test aims to verify that the OS installation option in Dasharo Network Boot Menu allows booting into netboot.xyz server. Test configuration data FIRMWARE = coreboot Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Select the OS installation option using the arrow keys and press Enter . Expected result After configuring the network interfaces, connecting to the server and booting, netboot.xyz menu should appear. PXE006.001 iPXE shell option is available and works correctly Test description This test aims to verify that the iPXE Shell option in Dasharo Network Boot Menu works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the boot menu. Select the iPXE Network boot option using the arrow keys and press Enter . Select the iPXE Shell option using the arrow keys and press Enter . Obtain an IP address by executing the following command: dhcp Load netboot.xyz server menu by executing the following command: chain --autofree http://boot.netboot.xyz/ Expected result After configuring the network interfaces, connecting to the server and booting, netboot.xyz menu should appear. PXE007.001 iPXE network boot Test description This test aims to verify that the DUT is capable of network booting from a PXE server. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Press Ctrl+B when prompted to stop iPXE from booting automatically. Type in dhcp to obtain an IP address. Type in chain --autofree http://boot.netboot.xyz/ to load a boot menu Enter the \"Live CDs\" submenu using the arrow keys and Enter. Select Debian -> Debian Live 11 (bullseye) -> Debian 11 Gnome and press Enter. Expected result The iPXE application boots successfully. iPXE obtains an IP address. iPXE boots an Debian 11 from netboot.xyz.","title":"Network boot"},{"location":"unified-test-documentation/dasharo-compatibility/315-network-boot/#dasharo-compatibility-network-boot","text":"","title":"Dasharo Compatibility: Network Boot"},{"location":"unified-test-documentation/dasharo-compatibility/315-network-boot/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . The DUT should be connected to the Internet by using an Ethernet cable.","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/315-network-boot/#pxe001001-dasharo-network-boot-is-bootable","text":"Test description This test aims to verify, that the iPXE Network boot is bootable in the boot menu and whether, after selecting this boot option, Dasharo Network Boot Menu is displayed. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Expected result After selecting the iPXE Network boot , the Dasharo Network Boot Menu should be displayed.","title":"PXE001.001 Dasharo Network Boot is bootable"},{"location":"unified-test-documentation/dasharo-compatibility/315-network-boot/#pxe002001-dasharo-network-boot-menu-boot-options-order-is-correct","text":"Test description This test aims to verify that Dasharo Network Boot Menu contains all of the needed options which are in the correct order. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Expected result Dasharo Network Boot Menu contains all of the needed options. Dasharo Network Boot Menu options are in order as follows: Autoboot Dasharo Tools Suite OS installation iPXE Shell","title":"PXE002.001 Dasharo network boot menu boot options order is correct"},{"location":"unified-test-documentation/dasharo-compatibility/315-network-boot/#pxe003001-autoboot-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the Autoboot option in Dasharo Network Boot Menu works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Select the Autoboot option using the arrow keys, then press Enter . Expected result If the server assigned to the Autoboot option is available in the local network, the boot menu should appear. If the server assigned to the Autoboot option isn't available in the local network, selecting this option will result in configuring the network interfaces and return to the Setup Menu .","title":"PXE003.001 Autoboot option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/315-network-boot/#pxe004001-dts-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the Dasharo Tools Suite option in Dasharo Network Boot Menu allows booting into DTS. Test configuration data FIRMWARE = coreboot Test setup Proceed with the Test cases common documentation section. Proceed with the Requirements for DTS . Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Select the Dasharo Tools Suite option using the arrow keys, then press Enter . Expected result After configuring the network interfaces, connecting to the server and booting, Dasharo Tools Suite menu should appear.","title":"PXE004.001 DTS option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/315-network-boot/#pxe005001-os-installation-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the OS installation option in Dasharo Network Boot Menu allows booting into netboot.xyz server. Test configuration data FIRMWARE = coreboot Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Select the OS installation option using the arrow keys and press Enter . Expected result After configuring the network interfaces, connecting to the server and booting, netboot.xyz menu should appear.","title":"PXE005.001 OS installation option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/315-network-boot/#pxe006001-ipxe-shell-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the iPXE Shell option in Dasharo Network Boot Menu works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the boot menu. Select the iPXE Network boot option using the arrow keys and press Enter . Select the iPXE Shell option using the arrow keys and press Enter . Obtain an IP address by executing the following command: dhcp Load netboot.xyz server menu by executing the following command: chain --autofree http://boot.netboot.xyz/ Expected result After configuring the network interfaces, connecting to the server and booting, netboot.xyz menu should appear.","title":"PXE006.001 iPXE shell option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/315-network-boot/#pxe007001-ipxe-network-boot","text":"Test description This test aims to verify that the DUT is capable of network booting from a PXE server. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the iPXE Network boot option using the arrow keys and press Enter . Press Ctrl+B when prompted to stop iPXE from booting automatically. Type in dhcp to obtain an IP address. Type in chain --autofree http://boot.netboot.xyz/ to load a boot menu Enter the \"Live CDs\" submenu using the arrow keys and Enter. Select Debian -> Debian Live 11 (bullseye) -> Debian 11 Gnome and press Enter. Expected result The iPXE application boots successfully. iPXE obtains an IP address. iPXE boots an Debian 11 from netboot.xyz.","title":"PXE007.001 iPXE network boot"},{"location":"unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/","text":"Dasharo Compatibility: Network boot utilities Test cases common documentation Test setup Proceed with the Generic test setup: firmware . NBT001.001 Netboot is available Test description This test aims to verify that the Network Boot and Utilities menu is available and its content is right. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Expected result Network Boot and Utilities option should be present in the UEFI Boot Menu. After selecting the Network Boot and Utilities option the following menu should appear: ------------------------ Network Boot and Utilities ---------------------- ------------------------ Please Select an Option ------------------------- OS Selection & Utilities iPXE Boot iPXE Shell Advanced NBT002.001 OS Selection & Utilities is available Test description This test aims to verify that the OS Selection & Utilities menu is available and its content is right. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the OS Selection & Utilities option using the arrow keys and press Enter . Expected result OS Selection & Utilities option should be present in the Network Boot and Utilities menu. After selecting the OS Selection & Utilities option iPXE menu should be displayed. NBT003.001 iPXE boot is available Test description This test aims to verify that the iPXE Boot menu is available and it content is right. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the iPXE Boot option using the arrow keys and press Enter . Expected result iPXE Boot option should be present in the Network Boot and Utilities menu. After selecting the iPXE Boot option the autoboot procedure should be started. NBT004.001 iPXE shell is available Test description This test aims to verify that the iPXE Shell menu is available and it content is right. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the iPXE Shell option using the arrow keys and press Enter . Expected result iPXE Shell option should be present in the Network Boot and Utilities menu. After selecting the iPXE Shell option the following menu should appear: You are now in iPXE shell. Type \"exit\" to go back to the main menu. iPXE> NBT005.001 iPXE shell works correctly Test description This test aims to verify that the iPXE shell works correctly by configuring network interface and booting from selected address. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the iPXE Shell option using the arrow keys and press Enter . Configure communication interface by using the following command: dhcp net0 Connect to the DTS ipxe menu by using the following command: chain http://boot.3mdeb.com/dts.ipxe Expected result Communication interface configuration procedure should be successful. DTS boot menu should appear. NBT006.001 Advanced option is available Test description This test aims to verify that the Advanced menu is available and its content is right. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the Advanced option using the arrow keys and press Enter . Expected result Advanced option should be present in the Network Boot and Utilities menu. After selecting the Advanced option the following menu should appear: ------------------------ Network Boot and Utilities ---------------------- ------------------------ Please Select an Option ------------------------- Change Netboot iPXE Payload URL Exit NBT007.001 Change netboot URL works correctly Test description This test aims to verify that it's possible to change the netboot URL and boot from it. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the Advanced option using the arrow keys and press Enter . Select the Change Netboot iPXE Payload URL option using the arrow keys and press Enter . Select the Change Netboot iPXE Payload URL option again using the arrow keys and press Enter . Replace the existing address with another iPXE payload URL address, for example: http://boot.3mdeb.com/dts.ipxe . Apply changes by selecting option Apply and Exit and pressing Enter . Select the OS Selection & Utilities option using the arrow keys and press Enter . Expected result Proper boot menu should appear.","title":"Network boot utilities"},{"location":"unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/#dasharo-compatibility-network-boot-utilities","text":"","title":"Dasharo Compatibility: Network boot utilities"},{"location":"unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/#nbt001001-netboot-is-available","text":"Test description This test aims to verify that the Network Boot and Utilities menu is available and its content is right. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Expected result Network Boot and Utilities option should be present in the UEFI Boot Menu. After selecting the Network Boot and Utilities option the following menu should appear: ------------------------ Network Boot and Utilities ---------------------- ------------------------ Please Select an Option ------------------------- OS Selection & Utilities iPXE Boot iPXE Shell Advanced","title":"NBT001.001 Netboot is available"},{"location":"unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/#nbt002001-os-selection-utilities-is-available","text":"Test description This test aims to verify that the OS Selection & Utilities menu is available and its content is right. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the OS Selection & Utilities option using the arrow keys and press Enter . Expected result OS Selection & Utilities option should be present in the Network Boot and Utilities menu. After selecting the OS Selection & Utilities option iPXE menu should be displayed.","title":"NBT002.001 OS Selection & Utilities is available"},{"location":"unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/#nbt003001-ipxe-boot-is-available","text":"Test description This test aims to verify that the iPXE Boot menu is available and it content is right. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the iPXE Boot option using the arrow keys and press Enter . Expected result iPXE Boot option should be present in the Network Boot and Utilities menu. After selecting the iPXE Boot option the autoboot procedure should be started.","title":"NBT003.001 iPXE boot is available"},{"location":"unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/#nbt004001-ipxe-shell-is-available","text":"Test description This test aims to verify that the iPXE Shell menu is available and it content is right. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the iPXE Shell option using the arrow keys and press Enter . Expected result iPXE Shell option should be present in the Network Boot and Utilities menu. After selecting the iPXE Shell option the following menu should appear: You are now in iPXE shell. Type \"exit\" to go back to the main menu. iPXE>","title":"NBT004.001 iPXE shell is available"},{"location":"unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/#nbt005001-ipxe-shell-works-correctly","text":"Test description This test aims to verify that the iPXE shell works correctly by configuring network interface and booting from selected address. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the iPXE Shell option using the arrow keys and press Enter . Configure communication interface by using the following command: dhcp net0 Connect to the DTS ipxe menu by using the following command: chain http://boot.3mdeb.com/dts.ipxe Expected result Communication interface configuration procedure should be successful. DTS boot menu should appear.","title":"NBT005.001 iPXE shell works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/#nbt006001-advanced-option-is-available","text":"Test description This test aims to verify that the Advanced menu is available and its content is right. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the Advanced option using the arrow keys and press Enter . Expected result Advanced option should be present in the Network Boot and Utilities menu. After selecting the Advanced option the following menu should appear: ------------------------ Network Boot and Utilities ---------------------- ------------------------ Please Select an Option ------------------------- Change Netboot iPXE Payload URL Exit","title":"NBT006.001 Advanced option is available"},{"location":"unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/#nbt007001-change-netboot-url-works-correctly","text":"Test description This test aims to verify that it's possible to change the netboot URL and boot from it. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the Network Boot and Utilities option using the arrow keys and press Enter . Select the Advanced option using the arrow keys and press Enter . Select the Change Netboot iPXE Payload URL option using the arrow keys and press Enter . Select the Change Netboot iPXE Payload URL option again using the arrow keys and press Enter . Replace the existing address with another iPXE payload URL address, for example: http://boot.3mdeb.com/dts.ipxe . Apply changes by selecting option Apply and Exit and pressing Enter . Select the OS Selection & Utilities option using the arrow keys and press Enter . Expected result Proper boot menu should appear.","title":"NBT007.001 Change netboot URL works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/316-sdcard-reader/","text":"Dasharo Compatibility: SD Card Reader Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Insert an SD card into the SD Card reader. SDC001.001 SD Card reader detection (Ubuntu 22.04) Test description This test aims to verify that the SD Card reader is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: lspci | grep RTS522A Expected result The output from the command should contain the line: 2d:00.0 Unassigned class [ ff00 ] : Realtek Semiconductor Co., Ltd. RTS522A PCI Express Card Reader ( rev 01 ) SDC001.002 SD Card reader detection (Windows 11) Test description This test aims to verify that the SD Card reader is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell as administrator. Run below command and note result: Get-PnpDevice -Status \"OK\" -Class \"MTD\" Expected result The output of the command should contain basic information about mounted SD card reader. Output example: Status Class FriendlyName ------ ----- ------------ OK MTD Realtek PCIE CardReader SDC002.001 SD Card read/write (Ubuntu 22.04) Test description This test aims to verify that the SD Card reader is initialized correctly and can be used from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands as root: dd if = /dev/urandom of = /tmp/in.bin bs = 4K count = 100 dd if = /tmp/in.bin of = /dev/mmcblk0 bs = 4K count = 100 dd if = /dev/mmcblk0 of = /tmp/out.bin bs = 4K count = 100 sha256sum /tmp/in.bin /tmp/out.bin Expected result The output from the last command should contain 2 identical checksums: 2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb /tmp/in.bin 2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb /tmp/out.bin SDC002.002 SD Card read/write (Windows 11) Test description This test aims to verify that the SD Card reader is initialized correctly and can be used from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Determine the localization of the mounted SD card. Open PowerShell as administrator. Run below commands and note results: New-Item -Path \"${drive_lacation}:\\\" -Name \"testfile.txt\" -ItemType \"file\" -Value \"This is a test string.\" Get-Content -Path \"${drive_lacation}:\\testfile.txt\" Expected result Last command should return This is a test string.","title":"SD card reader"},{"location":"unified-test-documentation/dasharo-compatibility/316-sdcard-reader/#dasharo-compatibility-sd-card-reader","text":"","title":"Dasharo Compatibility: SD Card Reader"},{"location":"unified-test-documentation/dasharo-compatibility/316-sdcard-reader/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Insert an SD card into the SD Card reader.","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/316-sdcard-reader/#sdc001001-sd-card-reader-detection-ubuntu-2204","text":"Test description This test aims to verify that the SD Card reader is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: lspci | grep RTS522A Expected result The output from the command should contain the line: 2d:00.0 Unassigned class [ ff00 ] : Realtek Semiconductor Co., Ltd. RTS522A PCI Express Card Reader ( rev 01 )","title":"SDC001.001 SD Card reader detection (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/316-sdcard-reader/#sdc001002-sd-card-reader-detection-windows-11","text":"Test description This test aims to verify that the SD Card reader is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell as administrator. Run below command and note result: Get-PnpDevice -Status \"OK\" -Class \"MTD\" Expected result The output of the command should contain basic information about mounted SD card reader. Output example: Status Class FriendlyName ------ ----- ------------ OK MTD Realtek PCIE CardReader","title":"SDC001.002 SD Card reader detection (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/316-sdcard-reader/#sdc002001-sd-card-readwrite-ubuntu-2204","text":"Test description This test aims to verify that the SD Card reader is initialized correctly and can be used from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands as root: dd if = /dev/urandom of = /tmp/in.bin bs = 4K count = 100 dd if = /tmp/in.bin of = /dev/mmcblk0 bs = 4K count = 100 dd if = /dev/mmcblk0 of = /tmp/out.bin bs = 4K count = 100 sha256sum /tmp/in.bin /tmp/out.bin Expected result The output from the last command should contain 2 identical checksums: 2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb /tmp/in.bin 2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb /tmp/out.bin","title":"SDC002.001 SD Card read/write (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/316-sdcard-reader/#sdc002002-sd-card-readwrite-windows-11","text":"Test description This test aims to verify that the SD Card reader is initialized correctly and can be used from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Determine the localization of the mounted SD card. Open PowerShell as administrator. Run below commands and note results: New-Item -Path \"${drive_lacation}:\\\" -Name \"testfile.txt\" -ItemType \"file\" -Value \"This is a test string.\" Get-Content -Path \"${drive_lacation}:\\testfile.txt\" Expected result Last command should return This is a test string.","title":"SDC002.002 SD Card read/write (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/317-usb-camera/","text":"Dasharo Compatibility: USB Camera CAM001.001 USB Camera (Ubuntu 22.04) Test description This test aims to verify that the integrated USB camera is initialized correctly and can be accessed from the operating system Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Install ffprobe: sudo apt install ffmpeg . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following commands: ffprobe /dev/video0 ffprobe /dev/video2 Expected result The output from the first command should contain the lines: Input #0, video4linux2,v4l2, from '/dev/video0': Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc The output from the second command should contain the lines: Input #0, video4linux2,v4l2, from '/dev/video2': Stream #0:0: Video: rawvideo (Y800 / 0x30303859), gray, 640x360, 55296 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc CAM001.002 USB Camera (Windows 11) Test description This test aims to verify that the integrated USB camera is initialized correctly and can be accessed from the operating system Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run PowerShell as administrator. Execute below command and note the result: Get-PnpDevice -PresentOnly | Where-Object { $_ . InstanceId -match '^USB' } Expected result Output should contain Chicony USB2.0 Camera . Example output: Status Class FriendlyName ------ ----- ------------ OK Camera Chicony USB2 . 0 Camera OK Bluetooth Intel ( R ) Wireless Bluetooth ( R ) OK Camera IR Camera OK USB USB Root Hub ( USB 3 . 0 ) OK USB USB Root Hub ( USB 3 . 0 ) OK USB USB Composite Device","title":"USB camera"},{"location":"unified-test-documentation/dasharo-compatibility/317-usb-camera/#dasharo-compatibility-usb-camera","text":"","title":"Dasharo Compatibility: USB Camera"},{"location":"unified-test-documentation/dasharo-compatibility/317-usb-camera/#cam001001-usb-camera-ubuntu-2204","text":"Test description This test aims to verify that the integrated USB camera is initialized correctly and can be accessed from the operating system Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Install ffprobe: sudo apt install ffmpeg . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following commands: ffprobe /dev/video0 ffprobe /dev/video2 Expected result The output from the first command should contain the lines: Input #0, video4linux2,v4l2, from '/dev/video0': Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc The output from the second command should contain the lines: Input #0, video4linux2,v4l2, from '/dev/video2': Stream #0:0: Video: rawvideo (Y800 / 0x30303859), gray, 640x360, 55296 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc","title":"CAM001.001 USB Camera (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/317-usb-camera/#cam001002-usb-camera-windows-11","text":"Test description This test aims to verify that the integrated USB camera is initialized correctly and can be accessed from the operating system Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run PowerShell as administrator. Execute below command and note the result: Get-PnpDevice -PresentOnly | Where-Object { $_ . InstanceId -match '^USB' } Expected result Output should contain Chicony USB2.0 Camera . Example output: Status Class FriendlyName ------ ----- ------------ OK Camera Chicony USB2 . 0 Camera OK Bluetooth Intel ( R ) Wireless Bluetooth ( R ) OK Camera IR Camera OK USB USB Root Hub ( USB 3 . 0 ) OK USB USB Root Hub ( USB 3 . 0 ) OK USB USB Composite Device","title":"CAM001.002 USB Camera (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/","text":"Dasharo Compatibility: M.2 WiFi/Bluetooth Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . WLE001.001 Wireless card detection (Ubuntu 22.04) Test description This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: lspci | grep \"Network Controller\" Expected result The output of the command should contain information about mounted on the board network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a ) WLE001.002 Wireless card detection (Windows 11) Test description This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and execute following command: Get-PnpDevice -PresentOnly | Select-String -Pattern \"Wi-Fi\" Note the result. Expected result The output of the command should contain information about mounted on the board network controller. Example output: Intel ( R ) Wi-Fi 6AX200 160MHz WLE002.001 Wi-Fi scanning (Ubuntu 22.04) Test description This test aims to verify that the Wi-Fi functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Make sure to have any Wi-Fi signal available. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands as root: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of the last command should return a list of available Wi-Fi networks, for example: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2 WLE002.002 Wi-Fi scanning (Windows 11) Test description This test aims to verify that the Wi-Fi functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Make sure to have any Wi-Fi signal available Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and execute following command: netsh wlan show network Note the result. Expected result The output of the command should return a list of available Wi-Fi networks. Output example: SSID 1 : Orange_Swiatlowod_A79A Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 2 : DIRECT-Y9Phaser 3330 Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 3 : 3mdeb_abr_5GHz Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 4 : 3mdeb_abr Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP WLE003.001 Bluetooth scanning (Ubuntu 22.04) Test description This test aims to verify that the Bluetooth functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Enable Bluetooth and make it discoverable in any device nearby DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands: bluetoothctl power on scan on # Wait ~5 seconds devices Expected result The output of the last command should return a list of detectable Bluetooth devices, for example: Device XX:XX:XX:XX:XX:XX Device 1 Device XX:XX:XX:XX:XX:XX Wojtek N Device XX:XX:XX:XX:XX:XX Mi Smart Band 4 Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic ( PHLM ) Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic ( PHLM ) Device XX:XX:XX:XX:XX:XX Device 2 Device XX:XX:XX:XX:XX:XX [ Signage ] Samsung QMR Series Device XX:XX:XX:XX:XX:XX [ Signage ] Samsung QMR Series Device XX:XX:XX:XX:XX:XX Device 3 Device XX:XX:XX:XX:XX:XX Device 4 Device XX:XX:XX:XX:XX:XX Device 5 Device XX:XX:XX:XX:XX:XX Device 6 WLE003.002 Bluetooth scanning (Windows 11) Test description This test aims to verify that the Bluetooth functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Enable Bluetooth and make it discoverable in any device nearby DUT Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Enter Notification Center in the bottom right part of the screen. Using right mouse button, click on the Bluetooth icon. In shown drop-down menu click Go to settings . Click the + icon described as Add Bluetooth or other device . In the Add a device menu, click Bluetooth . Wait a few moments until DUT scans for nearby Bluetooth devices and note the result. Expected result Available Bluetooth devices should appear in the Add a device window.","title":"Wi-Fi and Bluetooth support"},{"location":"unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/#dasharo-compatibility-m2-wifibluetooth","text":"","title":"Dasharo Compatibility: M.2 WiFi/Bluetooth"},{"location":"unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/#wle001001-wireless-card-detection-ubuntu-2204","text":"Test description This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: lspci | grep \"Network Controller\" Expected result The output of the command should contain information about mounted on the board network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a )","title":"WLE001.001 Wireless card detection (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/#wle001002-wireless-card-detection-windows-11","text":"Test description This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and execute following command: Get-PnpDevice -PresentOnly | Select-String -Pattern \"Wi-Fi\" Note the result. Expected result The output of the command should contain information about mounted on the board network controller. Example output: Intel ( R ) Wi-Fi 6AX200 160MHz","title":"WLE001.002 Wireless card detection (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/#wle002001-wi-fi-scanning-ubuntu-2204","text":"Test description This test aims to verify that the Wi-Fi functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Make sure to have any Wi-Fi signal available. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands as root: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of the last command should return a list of available Wi-Fi networks, for example: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2","title":"WLE002.001 Wi-Fi scanning (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/#wle002002-wi-fi-scanning-windows-11","text":"Test description This test aims to verify that the Wi-Fi functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Make sure to have any Wi-Fi signal available Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and execute following command: netsh wlan show network Note the result. Expected result The output of the command should return a list of available Wi-Fi networks. Output example: SSID 1 : Orange_Swiatlowod_A79A Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 2 : DIRECT-Y9Phaser 3330 Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 3 : 3mdeb_abr_5GHz Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 4 : 3mdeb_abr Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP","title":"WLE002.002 Wi-Fi scanning (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/#wle003001-bluetooth-scanning-ubuntu-2204","text":"Test description This test aims to verify that the Bluetooth functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Enable Bluetooth and make it discoverable in any device nearby DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands: bluetoothctl power on scan on # Wait ~5 seconds devices Expected result The output of the last command should return a list of detectable Bluetooth devices, for example: Device XX:XX:XX:XX:XX:XX Device 1 Device XX:XX:XX:XX:XX:XX Wojtek N Device XX:XX:XX:XX:XX:XX Mi Smart Band 4 Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic ( PHLM ) Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic ( PHLM ) Device XX:XX:XX:XX:XX:XX Device 2 Device XX:XX:XX:XX:XX:XX [ Signage ] Samsung QMR Series Device XX:XX:XX:XX:XX:XX [ Signage ] Samsung QMR Series Device XX:XX:XX:XX:XX:XX Device 3 Device XX:XX:XX:XX:XX:XX Device 4 Device XX:XX:XX:XX:XX:XX Device 5 Device XX:XX:XX:XX:XX:XX Device 6","title":"WLE003.001 Bluetooth scanning (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/#wle003002-bluetooth-scanning-windows-11","text":"Test description This test aims to verify that the Bluetooth functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Enable Bluetooth and make it discoverable in any device nearby DUT Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Enter Notification Center in the bottom right part of the screen. Using right mouse button, click on the Bluetooth icon. In shown drop-down menu click Go to settings . Click the + icon described as Add Bluetooth or other device . In the Add a device menu, click Bluetooth . Wait a few moments until DUT scans for nearby Bluetooth devices and note the result. Expected result Available Bluetooth devices should appear in the Add a device window.","title":"WLE003.002 Bluetooth scanning (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/","text":"Dasharo Compatibility: NVIDIA Graphics support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . NVI001.001 NVIDIA Graphics detect (Ubuntu 22.04) Test description This test aims to verify that the NVIDIA graphics card is correctly initialized and can be detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: lspci | grep -i nvidia Expected result The command should return one line containing the name of the graphics card, e.g: 2d:00.0 3D controller: NVIDIA Corporation TU117M ( rev a1 ) NVI001.002 NVIDIA Graphics detect (Windows 11) Test description This test aims to verify that the NVIDIA graphics card is correctly initialized and can be detected by the operating system Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Install the driver for the graphics card (GTX 1650) from the official page . Test steps Run PowerShell as administrator and execute following command: Get-WmiObject -Class Win32_VideoController | Select Description , Name , Status Expected result The output should contain the information about installed Nvidia Graphics card. Example output: Description Name Status ----------- ---- ------ Intel ( R ) Iris ( R ) Xe Graphics Intel ( R ) Iris ( R ) Xe Graphics OK NVIDIA GeForce GTX 1650 NVIDIA GeForce GTX 1650 OK NVI002.001 NVIDIA Graphics power management (Ubuntu 22.04) Test description This test aims to verify that the NVIDIA graphics power management is functional and the card powers on only while it's used. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the package mesa-utils with the following command: sudo apt install mesa-utils Test steps Open a terminal window. Run the following command to see whether the card is off: cat /sys/class/drm/card1/device/power/runtime_status Launch a test application on the discrete graphics card using the following command: __NV_PRIME_RENDER_OFFLOAD = 1 __GLX_VENDOR_LIBRARY_NAME = nvidia glxgears Run the following command to see whether the card has turned on: cat /sys/class/drm/card1/device/power/runtime_status Close the test application and wait ~20 seconds to let the graphics card shut itself down. Run the following command to see whether the card has turned off again: cat /sys/class/drm/card1/device/power/runtime_status Expected result The output from the first command should be the word suspended . The output from the second command should be the word active . The output from the third command should be the word suspended . NVI002.002 NVIDIA Graphics power management (Windows 11) Test description This test aims to verify that the NVIDIA graphics power management is functional and the card powers on only while it's used. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Install the driver for the graphics card (GTX 1650) from the official page . Download and extract gputest from Geeks3D . Test steps Open the NVIDIA Control Panel window. In the menu bar, open the Desktop menu. Enable the Display GPU Activity Icon in Notification Area option. Open the system tray located in the bottom right corner of the screen and locate the GPU activity icon: Open the previously extracted gputest directory and open the GPUTest_GUI application. Click on the Run stress test button to start the test application. Locate the GPU activity icon and check that it indicates that the GPU has powered on. Close the test application. Locate the GPU activity icon and check that it indicates that the GPU has powered off again. Expected result The GPU activity icon should indicate that the GPU is OFF when no application is using the GPU. The GPU activity icon should indicate that the GPU is ON when an application is using the GPU. The GPU activity icon should indicate that the GPU is OFF again after the test application is closed.","title":"Nvidia Graphics support"},{"location":"unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/#dasharo-compatibility-nvidia-graphics-support","text":"","title":"Dasharo Compatibility: NVIDIA Graphics support"},{"location":"unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/#nvi001001-nvidia-graphics-detect-ubuntu-2204","text":"Test description This test aims to verify that the NVIDIA graphics card is correctly initialized and can be detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: lspci | grep -i nvidia Expected result The command should return one line containing the name of the graphics card, e.g: 2d:00.0 3D controller: NVIDIA Corporation TU117M ( rev a1 )","title":"NVI001.001 NVIDIA Graphics detect (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/#nvi001002-nvidia-graphics-detect-windows-11","text":"Test description This test aims to verify that the NVIDIA graphics card is correctly initialized and can be detected by the operating system Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Install the driver for the graphics card (GTX 1650) from the official page . Test steps Run PowerShell as administrator and execute following command: Get-WmiObject -Class Win32_VideoController | Select Description , Name , Status Expected result The output should contain the information about installed Nvidia Graphics card. Example output: Description Name Status ----------- ---- ------ Intel ( R ) Iris ( R ) Xe Graphics Intel ( R ) Iris ( R ) Xe Graphics OK NVIDIA GeForce GTX 1650 NVIDIA GeForce GTX 1650 OK","title":"NVI001.002 NVIDIA Graphics detect (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/#nvi002001-nvidia-graphics-power-management-ubuntu-2204","text":"Test description This test aims to verify that the NVIDIA graphics power management is functional and the card powers on only while it's used. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the package mesa-utils with the following command: sudo apt install mesa-utils Test steps Open a terminal window. Run the following command to see whether the card is off: cat /sys/class/drm/card1/device/power/runtime_status Launch a test application on the discrete graphics card using the following command: __NV_PRIME_RENDER_OFFLOAD = 1 __GLX_VENDOR_LIBRARY_NAME = nvidia glxgears Run the following command to see whether the card has turned on: cat /sys/class/drm/card1/device/power/runtime_status Close the test application and wait ~20 seconds to let the graphics card shut itself down. Run the following command to see whether the card has turned off again: cat /sys/class/drm/card1/device/power/runtime_status Expected result The output from the first command should be the word suspended . The output from the second command should be the word active . The output from the third command should be the word suspended .","title":"NVI002.001 NVIDIA Graphics power management (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/#nvi002002-nvidia-graphics-power-management-windows-11","text":"Test description This test aims to verify that the NVIDIA graphics power management is functional and the card powers on only while it's used. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Install the driver for the graphics card (GTX 1650) from the official page . Download and extract gputest from Geeks3D . Test steps Open the NVIDIA Control Panel window. In the menu bar, open the Desktop menu. Enable the Display GPU Activity Icon in Notification Area option. Open the system tray located in the bottom right corner of the screen and locate the GPU activity icon: Open the previously extracted gputest directory and open the GPUTest_GUI application. Click on the Run stress test button to start the test application. Locate the GPU activity icon and check that it indicates that the GPU has powered on. Close the test application. Locate the GPU activity icon and check that it indicates that the GPU has powered off again. Expected result The GPU activity icon should indicate that the GPU is OFF when no application is using the GPU. The GPU activity icon should indicate that the GPU is ON when an application is using the GPU. The GPU activity icon should indicate that the GPU is OFF again after the test application is closed.","title":"NVI002.002 NVIDIA Graphics power management (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31A-windows-booting/","text":"Dasharo Compatibility: Windows booting Test cases common documentation Test setup Proceed with the Generic test setup: Firmware . Proceed with the Generic test setup: OS installation . WBT001.001 Windows 11 installation and boot Test description This test aims to verify that Windows 11 OS could be installed on the DUT and works properly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The Windows 11 login screen should be displayed. WBT002.001 Windows 10 installation and boot Test description This test aims to verify that Windows 10 OS could be installed on the DUT and works properly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 10 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The Windows 10 login screen should be displayed.","title":"Windows booting"},{"location":"unified-test-documentation/dasharo-compatibility/31A-windows-booting/#dasharo-compatibility-windows-booting","text":"","title":"Dasharo Compatibility: Windows booting"},{"location":"unified-test-documentation/dasharo-compatibility/31A-windows-booting/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: Firmware . Proceed with the Generic test setup: OS installation .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31A-windows-booting/#wbt001001-windows-11-installation-and-boot","text":"Test description This test aims to verify that Windows 11 OS could be installed on the DUT and works properly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The Windows 11 login screen should be displayed.","title":"WBT001.001 Windows 11 installation and boot"},{"location":"unified-test-documentation/dasharo-compatibility/31A-windows-booting/#wbt002001-windows-10-installation-and-boot","text":"Test description This test aims to verify that Windows 10 OS could be installed on the DUT and works properly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 10 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The Windows 10 login screen should be displayed.","title":"WBT002.001 Windows 10 installation and boot"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/","text":"Dasharo Compatibility: Display ports and LCD support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . DSP001.001 Internal LCD in firmware Test description This test aims to verify initialization of the laptop's embedded LCD screen during firmware execution phase. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Observe the internal LCD during firmware execution phase. Power off the DUT. Expected result Logo appears on the screen during firmware execution phase. DSP001.002 Internal LCD in OS (Ubuntu 22.04) Test description This test aims to verify initialization of the laptop's embedded LCD in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Observe the internal LCD after the OPERATING_SYSTEM has booted. Expected result Either the login screen or the OPERATING_SYSTEM installer appears on the internal LCD. DSP001.003 Internal LCD in OS (Windows 11) Test description This test aims to verify initialization of the laptop's embedded LCD in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log in by using the proper login and password. Observe the internal LCD after the OPERATING_SYSTEM has booted. Expected result Either the login screen or the OPERATING_SYSTEM installer appears on the internal LCD. DSP002.001 External HDMI display in OS (Ubuntu 22.04) Test description This test aims to verify initialization of the external HDMI display in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect an HDMI cable to the DUT and a display. Test steps Power on the DUT. Boot into the system. Log in by using the proper login and password. If using more than one display, switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the external HDMI display in Mirror and Join Displays modes. DSP002.002 External HDMI display in OS (Windows 11) Test description This test aims to verify initialization of the external HDMI display in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect a HDMI cable to the DUT and a display. Test steps Power on the DUT. Boot into the system. Log in by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the external HDMI display in Duplicate and Extend modes. DSP002.003 External HDMI display in firmware This test aims to verify initialization of the external HDMI display during firmware execution phase. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Connect an HDMI cable to the DUT and a display. Test steps Power on the DUT. Observe the external HDMI display during firmware execution phase. Power off the DUT. Expected result Logo appears on the screen during firmware execution phase. DSP003.001 External DP display in OS (Ubuntu 22.04) Test description This test aims to verify initialization of the external Display Port connected in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect a Display Port cable to the DUT and a display. Test steps Power on the DUT. Boot into the system. Log in by using the proper login and password. If using more than one display, switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the external Display Port connected display in Mirror and Join Displays modes. DSP003.002 External DP display in OS (Windows 11) Test description This test aims to verify initialization of the external Display Port connected display in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect a Display Port cable to the DUT and a display. Test steps Power on the DUT. Boot into the system. Log in by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the external Display Port connected display in Duplicate and Extend modes. DSP003.003 External DP display in firmware This test aims to verify initialization of the external Display Port connected display during firmware execution phase. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Connect a Display Port cable to the DUT and a display. Test steps Power on the DUT. Observe the external Display Port connected display during firmware execution phase. Power off the DUT. Expected result Logo appears on the screen during firmware execution phase. DSP004.001 External VGA display in OS (Ubuntu 22.04) Test description This test aims to verify initialization of the external VGA in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect a video input connector to the VGA and a display. Test steps Power on the DUT. Boot into the system. Log the by using the proper login and password. If using more than one display, switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the external VGA connected display in Mirror and Join Displays modes. DSP004.002 External VGA display in OS (Windows 11) Test description This test aims to verify initialization of the external VGA in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect a video input connector to the VGA and a display. Test steps Power on the DUT. Boot into the system. Log the by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the external Display Port connected display in Duplicate and Extend modes. DSP004.003 External VGA display in firmware This test aims to verify initialization of the external VGA during firmware execution phase. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Connect a video input connector to the VGA and a display. Test steps Power on the DUT. During boot, press BOOT MENU KEY . Observe the external VGA connected display during firmware execution phase. Power off the DUT. Expected result Boot menu appears on the screen during firmware execution phase.","title":"Display ports and LCD"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dasharo-compatibility-display-ports-and-lcd-support","text":"","title":"Dasharo Compatibility: Display ports and LCD support"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp001001-internal-lcd-in-firmware","text":"Test description This test aims to verify initialization of the laptop's embedded LCD screen during firmware execution phase. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Observe the internal LCD during firmware execution phase. Power off the DUT. Expected result Logo appears on the screen during firmware execution phase.","title":"DSP001.001 Internal LCD in firmware"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp001002-internal-lcd-in-os-ubuntu-2204","text":"Test description This test aims to verify initialization of the laptop's embedded LCD in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Observe the internal LCD after the OPERATING_SYSTEM has booted. Expected result Either the login screen or the OPERATING_SYSTEM installer appears on the internal LCD.","title":"DSP001.002 Internal LCD in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp001003-internal-lcd-in-os-windows-11","text":"Test description This test aims to verify initialization of the laptop's embedded LCD in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log in by using the proper login and password. Observe the internal LCD after the OPERATING_SYSTEM has booted. Expected result Either the login screen or the OPERATING_SYSTEM installer appears on the internal LCD.","title":"DSP001.003 Internal LCD in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp002001-external-hdmi-display-in-os-ubuntu-2204","text":"Test description This test aims to verify initialization of the external HDMI display in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect an HDMI cable to the DUT and a display. Test steps Power on the DUT. Boot into the system. Log in by using the proper login and password. If using more than one display, switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the external HDMI display in Mirror and Join Displays modes.","title":"DSP002.001 External HDMI display in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp002002-external-hdmi-display-in-os-windows-11","text":"Test description This test aims to verify initialization of the external HDMI display in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect a HDMI cable to the DUT and a display. Test steps Power on the DUT. Boot into the system. Log in by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the external HDMI display in Duplicate and Extend modes.","title":"DSP002.002 External HDMI display in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp002003-external-hdmi-display-in-firmware","text":"This test aims to verify initialization of the external HDMI display during firmware execution phase. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Connect an HDMI cable to the DUT and a display. Test steps Power on the DUT. Observe the external HDMI display during firmware execution phase. Power off the DUT. Expected result Logo appears on the screen during firmware execution phase.","title":"DSP002.003 External HDMI display in firmware"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp003001-external-dp-display-in-os-ubuntu-2204","text":"Test description This test aims to verify initialization of the external Display Port connected in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect a Display Port cable to the DUT and a display. Test steps Power on the DUT. Boot into the system. Log in by using the proper login and password. If using more than one display, switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the external Display Port connected display in Mirror and Join Displays modes.","title":"DSP003.001 External DP display in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp003002-external-dp-display-in-os-windows-11","text":"Test description This test aims to verify initialization of the external Display Port connected display in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect a Display Port cable to the DUT and a display. Test steps Power on the DUT. Boot into the system. Log in by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the external Display Port connected display in Duplicate and Extend modes.","title":"DSP003.002 External DP display in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp003003-external-dp-display-in-firmware","text":"This test aims to verify initialization of the external Display Port connected display during firmware execution phase. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Connect a Display Port cable to the DUT and a display. Test steps Power on the DUT. Observe the external Display Port connected display during firmware execution phase. Power off the DUT. Expected result Logo appears on the screen during firmware execution phase.","title":"DSP003.003 External DP display in firmware"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp004001-external-vga-display-in-os-ubuntu-2204","text":"Test description This test aims to verify initialization of the external VGA in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect a video input connector to the VGA and a display. Test steps Power on the DUT. Boot into the system. Log the by using the proper login and password. If using more than one display, switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the external VGA connected display in Mirror and Join Displays modes.","title":"DSP004.001 External VGA display in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp004002-external-vga-display-in-os-windows-11","text":"Test description This test aims to verify initialization of the external VGA in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect a video input connector to the VGA and a display. Test steps Power on the DUT. Boot into the system. Log the by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the external Display Port connected display in Duplicate and Extend modes.","title":"DSP004.002 External VGA display in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/#dsp004003-external-vga-display-in-firmware","text":"This test aims to verify initialization of the external VGA during firmware execution phase. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Connect a video input connector to the VGA and a display. Test steps Power on the DUT. During boot, press BOOT MENU KEY . Observe the external VGA connected display during firmware execution phase. Power off the DUT. Expected result Boot menu appears on the screen during firmware execution phase.","title":"DSP004.003 External VGA display in firmware"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/","text":"Dasharo Compatibility: Audio subsystem Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . AUD001.001 Audio subsystem detection (Ubuntu 22.04) Test description This test aims to verify that the audio subsystem is initialized correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: cat /sys/class/sound/card0/hwC0D*/chip_name Expected result The output of the command should return a list of detected audio devices. Depending on mounted devices, the output might be different. Example output: ALC293 Tigerlake HDMI AUD001.002 Audio subsystem detection (Windows 11) Test description This test aims to verify that the audio subsystem is initialized correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Install package AudioDeviceCmdlets : Install-PackageProvider -Name NuGet -Force Install-Module -Name AudioDeviceCmdlets -Force Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run PowerShell as administrator and execute the following command: Get-AudioDevice -list | ft Index , Default , Type , Name Expected result Microphone (Realtek(R) Audio) and Speakers (Realtek(R) Audio) should be listed in the output: Index Default Type Name ----- ------- ---- ---- 1 True Playback Speakers ( Realtek ( R ) Audio ) 2 True Recording Microphone ( Realtek ( R ) Audio ) AUD002.001 Audio playback (Ubuntu 22.04) Test description This test aims to verify that the audio subsystem is able to playback audio recordings. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo 0 pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535 speaker-test Expected result Sound should be played from the integrated speakers. AUD002.002 Audio playback (Windows 11) Test description This test aims to verify that the audio subsystem is able to playback audio recordings. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Find the Speakers icon in the bottom right part of the screen and click it using the left mouse button to open the volume menu. In the volume menu, click the rightmost part of it and note the result. Expected result Sound should be played from the integrated speakers. AUD003.001 Audio capture (Ubuntu 22.04) Test description This test aims to verify that the audio subsystem is able to capture audio. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic.wav Make some noise around DUT. For example, say something. Execute the following command: aplay /tmp/test-mic.wav Expected result The recorded audio clip is recorded correctly and played back. AUD003.002 Audio capture (Windows 11) Test description This test aims to verify that the audio subsystem is able to capture audio. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Select the Microphone position in the Input devices section. Click on the Start Test bar in the Input settings section. Create some noise for the DUT to capture and note the result. For example, say something. Click on the Stop Test bar. Expected result The Input volume bar located in the Input settings section should raise when some noise is being created. The result of the test after clicking the Stop Test bar should be more than 0% of the total volume. AUD004.001 External headset recognition (Ubuntu 22.04) Test description This test aims to verify that the external headset is properly recognized after plugging the 3.5 mm jack into the slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. When the Select Audio Device menu appears, select what type of external device has been connected to the laptop (headset). Open a terminal window and execute the following command: amixer -c 0 contents | grep -A 2 'Front Headphone Jack' Disconnect the headset from the laptop. Execute the following command again: amixer -c 0 contents | grep -A 2 'Front Headphone Jack' Expected result The output of the first command should not be empty and contains the line: : values=on The output of the second command should not be empty and contains the line: : values=off AUD004.002 External headset recognition (Windows 11) Test description This test aims to verify that the external headset is properly recognized after plugging the 3.5 mm jack into the slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. After the Which device did you plug in menu appears, select what type of external device has been connected to the laptop (headset). Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the More sound settings bar and click on it. Click on the Speakers bar using the right mouse button then using the left mouse button click Properties . Locate in General the section field named Jack Information . Close the windows Speakers Properties and Sound . Disconnect a headset from the laptop. Repeat steps 7-9. Expected result Jack Information field in the first case should show the position Front Panel 3.5 mm Jack . After disconnecting a headset from the laptop and checking again field Jack Information should not contain the phrase Front Panel 3.5 mm Jack . AUD005.001 External headset audio playback (Ubuntu 22.04) Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external headset speakers. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. Open a terminal window and execute the following command: pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo 0 pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535 speaker-test Expected result Sound should be played from external speakers. AUD005.002 External headset audio playback (Windows 11) Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external headset speakers. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. Find the Speakers icon in the bottom right part of the screen and click it using the left mouse button to open the volume menu. In the volume menu, click the rightmost part of it and note the result. Expected result Sound should be played from external speakers. AUD006.001 External headset audio capture (Ubuntu 22.04) Test description This test aims to verify that the audio subsystem is able to capture audio from an external headset. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. Open a terminal window and execute the following command: arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic.wav Make some noise for the headset. For example, say something. Execute the following command: aplay /tmp/test-mic.wav Execute the following command: arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic-1.wav Make some noise for the DUT. For example, tap a few times in the laptop casing. Execute the following command: aplay /tmp/test-mic.wav Expected result During playback of the first recording, all noise that was made for the headset should be clearly heard. During playback of the second recording, all noise that was made for DUT should be quiet or not heard. AUD006.002 External headset audio capture (Windows 11) Test description This test aims to verify that the audio subsystem is able to capture audio from an external headset. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Select the Microphone position in the Input devices section. Click on the Start Test bar in the Input settings section. Create some noise for the headset to capture and note the result. For example, say something. Create some noise for the DUT. For example, tap a few times in the laptop casing. Click on the Stop Test bar. Expected result The Input volume bar located in the Input settings section should raise when some noise has been created for the headset. The Input volume bar located in the Input settings section should not raise when some noise has been created for the DUT. The result of the test after clicking the Stop Test bar should be more than 0% of the total volume. AUD007.001 HDMI Audio recognition (Ubuntu 22.04) Test description This test aims to verify that the output audio is properly assigned after connecting the external display using the HDMI cable. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect the external display to the HDMI slot. Open a terminal window and execute the following command: amixer -c 0 contents | grep -A 2 'HDMI/DP,pcm=3' Disconnect the headset from the laptop. Execute the following command again: amixer -c 0 contents | grep -A 2 'HDMI/DP,pcm=3' Expected result The output of the first command should not be empty and contains the line: : values=on The output of the second command should not be empty and contains the line: : values=off AUD007.002 HDMI Audio recognition (Windows 11) Test description This test aims to verify that the output audio is properly assigned after connecting the external display using the HDMI cable. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Locate the Output devices and Input devices section. Connect the external display to the HDMI slot. Expected result The connected display should appear in the Output devices and Input devices section. AUD008.001 HDMI audio playback (Ubuntu 22.04) Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external display connected to the HDMI slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect the external display to the HDMI slot. Open a terminal window and execute the following commands: pacmd set-card-profile 0 output:hdmi-stereo pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo 0 pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535 speaker-test Expected result Sound should be played from the external display. AUD008.002 HDMI audio playback (Windows 11) Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external display connected to the HDMI slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect the external display to the HDMI slot. Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Select the external display position in the Output devices section. Click on the Test bar in the Output settings section. Expected result Sound should be played from the external display.","title":"Audio Subsystem"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#dasharo-compatibility-audio-subsystem","text":"","title":"Dasharo Compatibility: Audio subsystem"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud001001-audio-subsystem-detection-ubuntu-2204","text":"Test description This test aims to verify that the audio subsystem is initialized correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: cat /sys/class/sound/card0/hwC0D*/chip_name Expected result The output of the command should return a list of detected audio devices. Depending on mounted devices, the output might be different. Example output: ALC293 Tigerlake HDMI","title":"AUD001.001 Audio subsystem detection (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud001002-audio-subsystem-detection-windows-11","text":"Test description This test aims to verify that the audio subsystem is initialized correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Install package AudioDeviceCmdlets : Install-PackageProvider -Name NuGet -Force Install-Module -Name AudioDeviceCmdlets -Force Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run PowerShell as administrator and execute the following command: Get-AudioDevice -list | ft Index , Default , Type , Name Expected result Microphone (Realtek(R) Audio) and Speakers (Realtek(R) Audio) should be listed in the output: Index Default Type Name ----- ------- ---- ---- 1 True Playback Speakers ( Realtek ( R ) Audio ) 2 True Recording Microphone ( Realtek ( R ) Audio )","title":"AUD001.002 Audio subsystem detection (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud002001-audio-playback-ubuntu-2204","text":"Test description This test aims to verify that the audio subsystem is able to playback audio recordings. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo 0 pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535 speaker-test Expected result Sound should be played from the integrated speakers.","title":"AUD002.001 Audio playback (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud002002-audio-playback-windows-11","text":"Test description This test aims to verify that the audio subsystem is able to playback audio recordings. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Find the Speakers icon in the bottom right part of the screen and click it using the left mouse button to open the volume menu. In the volume menu, click the rightmost part of it and note the result. Expected result Sound should be played from the integrated speakers.","title":"AUD002.002 Audio playback (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud003001-audio-capture-ubuntu-2204","text":"Test description This test aims to verify that the audio subsystem is able to capture audio. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic.wav Make some noise around DUT. For example, say something. Execute the following command: aplay /tmp/test-mic.wav Expected result The recorded audio clip is recorded correctly and played back.","title":"AUD003.001 Audio capture (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud003002-audio-capture-windows-11","text":"Test description This test aims to verify that the audio subsystem is able to capture audio. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Select the Microphone position in the Input devices section. Click on the Start Test bar in the Input settings section. Create some noise for the DUT to capture and note the result. For example, say something. Click on the Stop Test bar. Expected result The Input volume bar located in the Input settings section should raise when some noise is being created. The result of the test after clicking the Stop Test bar should be more than 0% of the total volume.","title":"AUD003.002 Audio capture (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud004001-external-headset-recognition-ubuntu-2204","text":"Test description This test aims to verify that the external headset is properly recognized after plugging the 3.5 mm jack into the slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. When the Select Audio Device menu appears, select what type of external device has been connected to the laptop (headset). Open a terminal window and execute the following command: amixer -c 0 contents | grep -A 2 'Front Headphone Jack' Disconnect the headset from the laptop. Execute the following command again: amixer -c 0 contents | grep -A 2 'Front Headphone Jack' Expected result The output of the first command should not be empty and contains the line: : values=on The output of the second command should not be empty and contains the line: : values=off","title":"AUD004.001 External headset recognition (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud004002-external-headset-recognition-windows-11","text":"Test description This test aims to verify that the external headset is properly recognized after plugging the 3.5 mm jack into the slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. After the Which device did you plug in menu appears, select what type of external device has been connected to the laptop (headset). Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the More sound settings bar and click on it. Click on the Speakers bar using the right mouse button then using the left mouse button click Properties . Locate in General the section field named Jack Information . Close the windows Speakers Properties and Sound . Disconnect a headset from the laptop. Repeat steps 7-9. Expected result Jack Information field in the first case should show the position Front Panel 3.5 mm Jack . After disconnecting a headset from the laptop and checking again field Jack Information should not contain the phrase Front Panel 3.5 mm Jack .","title":"AUD004.002 External headset recognition (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud005001-external-headset-audio-playback-ubuntu-2204","text":"Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external headset speakers. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. Open a terminal window and execute the following command: pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo 0 pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535 speaker-test Expected result Sound should be played from external speakers.","title":"AUD005.001 External headset audio playback (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud005002-external-headset-audio-playback-windows-11","text":"Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external headset speakers. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. Find the Speakers icon in the bottom right part of the screen and click it using the left mouse button to open the volume menu. In the volume menu, click the rightmost part of it and note the result. Expected result Sound should be played from external speakers.","title":"AUD005.002 External headset audio playback (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud006001-external-headset-audio-capture-ubuntu-2204","text":"Test description This test aims to verify that the audio subsystem is able to capture audio from an external headset. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. Open a terminal window and execute the following command: arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic.wav Make some noise for the headset. For example, say something. Execute the following command: aplay /tmp/test-mic.wav Execute the following command: arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic-1.wav Make some noise for the DUT. For example, tap a few times in the laptop casing. Execute the following command: aplay /tmp/test-mic.wav Expected result During playback of the first recording, all noise that was made for the headset should be clearly heard. During playback of the second recording, all noise that was made for DUT should be quiet or not heard.","title":"AUD006.001 External headset audio capture (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud006002-external-headset-audio-capture-windows-11","text":"Test description This test aims to verify that the audio subsystem is able to capture audio from an external headset. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug a headset jack into a micro jack slot located on the right side of the laptop. Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Select the Microphone position in the Input devices section. Click on the Start Test bar in the Input settings section. Create some noise for the headset to capture and note the result. For example, say something. Create some noise for the DUT. For example, tap a few times in the laptop casing. Click on the Stop Test bar. Expected result The Input volume bar located in the Input settings section should raise when some noise has been created for the headset. The Input volume bar located in the Input settings section should not raise when some noise has been created for the DUT. The result of the test after clicking the Stop Test bar should be more than 0% of the total volume.","title":"AUD006.002 External headset audio capture (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud007001-hdmi-audio-recognition-ubuntu-2204","text":"Test description This test aims to verify that the output audio is properly assigned after connecting the external display using the HDMI cable. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect the external display to the HDMI slot. Open a terminal window and execute the following command: amixer -c 0 contents | grep -A 2 'HDMI/DP,pcm=3' Disconnect the headset from the laptop. Execute the following command again: amixer -c 0 contents | grep -A 2 'HDMI/DP,pcm=3' Expected result The output of the first command should not be empty and contains the line: : values=on The output of the second command should not be empty and contains the line: : values=off","title":"AUD007.001 HDMI Audio recognition (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud007002-hdmi-audio-recognition-windows-11","text":"Test description This test aims to verify that the output audio is properly assigned after connecting the external display using the HDMI cable. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Locate the Output devices and Input devices section. Connect the external display to the HDMI slot. Expected result The connected display should appear in the Output devices and Input devices section.","title":"AUD007.002 HDMI Audio recognition (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud008001-hdmi-audio-playback-ubuntu-2204","text":"Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external display connected to the HDMI slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the alsa-utils package: sudo apt install alsa-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect the external display to the HDMI slot. Open a terminal window and execute the following commands: pacmd set-card-profile 0 output:hdmi-stereo pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo 0 pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535 speaker-test Expected result Sound should be played from the external display.","title":"AUD008.001 HDMI audio playback (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/#aud008002-hdmi-audio-playback-windows-11","text":"Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external display connected to the HDMI slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect the external display to the HDMI slot. Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Select the external display position in the Output devices section. Click on the Test bar in the Output settings section. Expected result Sound should be played from the external display.","title":"AUD008.002 HDMI audio playback (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/","text":"Dasharo Compatibility: Embedded Controller and Super I/O initialization Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . ECR001.001 Battery monitoring - charge level in OS (Ubuntu 22.04) Test description This test verifies whether the battery charge level is reported in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Locate the power menu in the upper right corner of the screen. Open the power menu and locate the battery status indicator. Expected result The battery status indicator should show the current charge level (percentage left). ECR001.002 Battery monitoring - charge level in OS (Windows 11) Test description This test verifies whether the battery charge level is reported in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Locate the power menu in the lower right corner of the screen. Expected result The battery status indicator should show the current charge level (percentage left). ECR002.001 Battery monitoring - charging state in OS (Ubuntu 22.04) Test description This test verifies that the power supply state is detected correctly in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Locate the power menu in the upper right corner of the screen. Open the power menu and locate the battery status indicator. Note the current state. Unplug the power supply and wait for the battery charge state to change to Discharging . Plug in the power supply and wait for the battery charge state to change to Charging . Expected result The battery charge indicator should correctly show whether the power supply is plugged in or not. The battery charge indicator should detect the AC adapter state change within seconds of the adapter being plugged in/out. ECR002.002 Battery monitoring - charging state in OS (Windows 11) Test description This test verifies that the power supply state is detected correctly in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Locate the power menu in the lower right corner of the screen. Open the power menu and locate the battery status indicator. Note the current state. Unplug the power supply and wait for the battery charge state to change to on battery . Plug in the power supply and wait for the battery charge state to change to plugged in . Expected result The battery charge indicator should correctly show whether the power supply is plugged in or not. The battery charge indicator should detect the AC adapter state change within seconds of the adapter being plugged in / out. ECR003.001 Touchpad in OS - (Ubuntu 22.04) Test description This test verifies that the touchpad is initialized correctly and is detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install libinput-tools on the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Verify that the cursor can be moved with the touchpad and that clicking works (test both clicking and tapping). Run sudo libinput debug-events in the terminal: Verify that scrolling with 2 fingers generates a POINTER_AXIS event, Verify that pinching with 2 fingers generates a GESTURE_PINCH_UPDATE event. Press Ctrl + C to terminate the libinput program. Expected result Moving the cursor, clicking, zooming and scrolling are detected correctly by the operating system. ECR003.002 Touchpad in OS - (Windows 11) Test description This test verifies that the touchpad is initialized correctly and is detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Verify that the cursor can be moved with the touchpad and that clicking works (test both clicking and tapping). Open C:\\Windows in Windows Explorer Verify that scrolling with 2 fingers moves the content of the window, Verify that pinching with 2 fingers zooms in and zooms out the content. Expected result Moving the cursor, clicking, zooming and scrolling are detected correctly by the operating system. ECR004.001 Keyboard (standard keypad) in firmware Test description This test verifies that the keyboard is detected correctly by the firmware and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Use the arrow keys and the Enter key to navigate the menus. Expected result All menus can be entered using the internal keyboard. ECR004.002 Keyboard (standard keypad) in OS (Ubuntu 22.04) Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install libinput-tools on the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run sudo libinput debug-events --show-keycodes in the terminal. Press each keyboard key and check the generated keycode. Expected result All standard keyboard keys generate the correct keycodes and events as per their labels. Key combinations are detected correctly. ECR004.003 Keyboard (standard keypad) in OS (Windows 11) Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open notepad Test the alphanumeric keys and note the generated characters Test non-alphanumeric keys and verify that they generate the signs Test key combinations with the Shift , and Alt modifier keys Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. Check if On-Screen Keyboard correctly highlights it. Open Start menu and press Esc . Check if Start menu is properly closed. Expected result All standard keyboard keys generate correct characters or actions when pressed. Key combinations are detected correctly. ECR005.001 Keyboard (function key: play/pause) in OS (Ubuntu 22.04) Test description This test verifies that the play/pause hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Install libinput-tools on the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run sudo libinput debug-events --show-keycodes in the terminal. Verify that pressing the play/pause key generates a KEY_PLAYPAUSE event. Expected result Pressing the play/pause hotkey generates a KEY_PLAYPAUSE event. ECR005.002 Keyboard (function key: play/pause) in OS (Windows 11) Test description This test verifies that the play/pause hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Start Groove Music Verify that when pressing the play/pause button, player menu appears in the upper left part of the screen for a few seconds. Expected result Pressing the play/pause hotkey is properly detected by the OS ECR006.001 Keyboard (function key: cooling mode) in OS (Ubuntu 22.04) Test description This test verifies that the cooling mode hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the cooling mode hotkey (Fn + 1) once and note the effect. Press the cooling mode hotkey once again and note the effect. Expected result Pressing the hotkey once should activate the cooling mode (fans should spin up to their maximum speed). Pressing the hotkey again should deactivate the cooling mode (fans should return to normal). ECR006.002 Keyboard (function key: cooling mode) in OS (Windows 11) Test description This test verifies that the cooling mode hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the cooling mode hotkey (Fn + 1) once and note the effect. Press the cooling mode hotkey once again and note the effect. Expected result Pressing the hotkey once should activate the cooling mode (fans should spin up to their maximum speed). Pressing the hotkey again should deactivate the cooling mode (fans should return to normal). ECR007.001 Keyboard (function key: touchpad on/off) in OS (Ubuntu 22.04) Test description This test verifies that the touchpad on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Proceed with the Test cases common documentation section. Create a file /etc/udev/hwdb.d/60-keyboard.hwdb with the following contents: evdev:atkbd:dmi:bvn*:bvr*:svnNotebook:pnNV4XMB,ME,MZ:* KEYBOARD_KEY_f7 = 191 KEYBOARD_KEY_f8 = 191 Execute the following commands: sudo systemd-hwdb update sudo udevadm trigger Test steps Press the touchpad on/off key and try to use the touchpad. Press the touchpad on/off key once again and try to use the touchpad again. Expected result Pressing the hotkey once should deactivate the touchpad (touchpad should be completely inoperable). Pressing the hotkey again should reactivate the touchpad. ECR007.002 Keyboard (function key: touchpad on/off) in OS (Windows 11) Test description This test verifies that the touchpad on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the touchpad on/off key and try to use the touchpad. Press the touchpad on/off key once again and try to use the touchpad again. Expected result Pressing the hotkey once should deactivate the touchpad (touchpad should be completely inoperable). Pressing the hotkey again should reactivate the touchpad. ECR008.001 Keyboard (function key: display on/off) in OS (Ubuntu 22.04) Test description This test verifies that the display on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the display on/off hotkey once and note the effect. Press any key on the keyboard and note the effect. Expected result Pressing the hotkey once should turn the internal LCD panel off. Pressing any key on the keyboard should power the internal LCD panel back on. ECR008.002 Keyboard (function key: display on/off) in OS (Windows 11) Test description This test verifies that the display on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the display on/off hotkey once and note the effect. Press any key on the keyboard and note the effect. Expected result Pressing the hotkey once should turn the internal LCD panel off. Pressing any key on the keyboard should power the internal LCD panel back on. ECR009.001 Keyboard (function key: mute) in OS (Ubuntu 22.04) Test description This test verifies that the volume mute hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the volume mute hotkey twice and note the effect each keypress has. Expected result Pressing the hotkey should mute or unmute the currently enabled audio output. Each keypress should cause a mute/unmute notification to appear in the middle of the screen. ECR009.002 Keyboard (function key: mute) in OS (Windows 11) Test description This test verifies that the mute hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the mute hotkey once and check the volume indicator in the bottom right part of the screen. Press the mute hotkey once and check the volume indicator again. Expected result Pressing the hotkey once should mute the device Pressing the hotkey again should re-enable the sound ECR010.001 Keyboard (function key: keyboard backlight) in OS (Ubuntu 22.04) Test description This test verifies that the keyboard backlight hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the keyboard backlight hotkey 6 times and note the effect on the keyboard backlight after each keypress. Expected result The keyboard has 6 backlight settings from 0% to 100% Each keypress should set the keyboard to the next mode, with the last mode wrapping back around to the first. ECR010.002 Keyboard (function key: keyboard backlight) in OS (Windows 11) Test description This test verifies that the keyboard backlight hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the keyboard backlight hotkey 6 times and note the effect on the keyboard backlight after each keypress. Expected result The keyboard has 6 backlight settings from 0% to 100% Each keypress should set the keyboard to the next mode, with the last mode wrapping back around to the first. ECR011.001 Keyboard (function key: volume down) in OS (Ubuntu 22.04) Test description This test verifies that the volume down hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the volume down hotkey once and note the effects. Expected result Pressing the hotkey should decrease the volume of the currently enabled audio output. Each key press should cause a volume down notification to appear in the middle of the screen. ECR011.002 Keyboard (function key: volume down) in OS (Windows 11) Test description This test verifies that the volume down hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the volume down hotkey once and note the effects. Expected result Pressing the hotkey should decrease the volume of the currently enabled audio output. Each key press should cause a volume down notification to appear in the upper left part of the screen. ECR012.001 Keyboard (function key: volume up) in OS (Ubuntu 22.04) Test description This test verifies that the volume up hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the volume up hotkey once and note the effects. Expected result Pressing the hotkey should increase the volume of the currently enabled audio output. Each key press should cause a volume up notification to appear in the middle of the screen. ECR012.002 Keyboard (function key: volume up) in OS (Windows 11) Test description This test verifies that the volume up hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the volume down hotkey once and note the effects. Expected result Pressing the hotkey should increase the volume of the currently enabled audio output. Each key press should cause a volume up notification to appear in the upper left part of the screen. ECR013.001 Keyboard (function key: display switch) in OS (Ubuntu 22.04) Test description This test verifies that the display switch hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install libinput-tools on the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run sudo libinput debug-events --show-keycodes in the terminal. Press the display switch hotkey once and note the effect. Expected result Pressing the hotkey should yield the following output in the terminal: -event3 KEYBOARD_KEY +0.000s KEY_LEFTMETA ( 125 ) pressed event3 KEYBOARD_KEY +0.004s KEY_P ( 25 ) pressed event3 KEYBOARD_KEY +0.010s KEY_P ( 25 ) released event3 KEYBOARD_KEY +0.015s KEY_LEFTMETA ( 125 ) released ECR013.002 Keyboard (function key: display switch) in OS (Windows 11) Test description This test verifies that the display switch hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the display switch hotkey once and note the effect. Expected result Pressing the hotkey should cause the display settings bar to appear on the right part of the screen. ECR014.001 Keyboard (function key: brightness down) in OS (Ubuntu 22.04) Test description This test verifies that the brightness down hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test steps Press the brightness down hotkey once and note the effects. Expected result Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Pressing the hotkey should decrease the brightness of the internal LCD display. Each key press should cause a brightness down notification to appear in the middle of the screen. ECR014.002 Keyboard (function key: brightness down) in OS (Windows 11) Test description This test verifies that the brightness down hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the brightness down hotkey once and note the effects. Expected result Pressing the hotkey should decrease the brightness of the internal LCD display. Each key press should cause a brightness down notification to appear in the top left of the screen. ECR015.001 Keyboard (function key: brightness up) in OS (Ubuntu 22.04) Test description This test verifies that the brightness up hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the brightness up hotkey once and note the effects. Expected result Pressing the hotkey should increase the brightness of the internal LCD display. Each key press should cause a brightness up notification to appear in the middle of the screen. ECR015.002 Keyboard (function key: brightness up) in OS (Windows 11) Test description This test verifies that the brightness down hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the brightness up hotkey once and note the effects. Expected result Pressing the hotkey should increase the brightness of the internal LCD display. Each key press should cause a brightness up notification to appear in the top left of the screen. ECR016.001 Keyboard (function key: camera on/off) in OS (Ubuntu 22.04) Test description This test verifies that the camera on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the terminal and run the command: watch -n1 lsusb . Press the camera on/off hotkey twice and note the effect after each keypress. Expected result Pressing the hotkey once should make the Chicony Electronics Co., Ltd Chicony USB2.0 Camera device disappear from the output of lsusb . Pressing the hotkey again should make the USB device reappear. ECR016.002 Keyboard (function key: camera on/off) in OS (Windows 11) Test description This test verifies that the camera on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the Camera app. Press the camera on/off hotkey twice and note the effect after a few seconds after the keypress. Expected result Pressing the hotkey once should make the camera image disappear. Pressing the hotkey again should make the camera image appear again after a few seconds. ECR017.001 Keyboard (function key: flight mode) in OS (Ubuntu 22.04) Test description This test verifies that the flight mode hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Locate and open the power menu in the upper right corner of the screen. Enter Settings and navigate to the Wi-Fi panel. Note the current state of the Airplane Mode switch. Press the flight mode hotkey twice and note the result of each keypress. Expected result Pressing the hotkey once should enable airplane mode. Pressing the hotkey again should disable airplane mode. ECR017.002 Keyboard (function key: flight mode) in OS (Windows 11) Test description This test verifies that the flight mode hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the camera on/off hotkey twice and note the effect after the key press. Expected result Pressing the hotkey once should enable airplane mode and cause airplane mode on notification to appear in the top right part of the screen. Pressing the hotkey again should disable airplane mode and cause airplane mode off notification to appear in the top right part of the screen. ECR018.001 Keyboard (function key: sleep) in OS (Ubuntu 22.04) Test description This test verifies that the sleep hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the sleep hotkey once and note the result. Expected result The laptop should go to sleep within seconds of the hotkey being pressed. The power LED should be blinking green, indicating the laptop is sleeping. ECR018.002 Keyboard (function key: sleep) in OS (Windows 11) Test description This test verifies that the sleep hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Proceed with the Installing updates and drivers section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Wait 30 seconds for the system to load fully. Press the sleep hotkey once and note the result. Expected result The laptop should go to sleep within seconds of the hotkey being pressed. The power LED should be blinking green, indicating the laptop is sleeping. ECR019.001 Buttons (button: power) in OS (Ubuntu 22.04) Test description This test verifies that the power button is detected correctly by the operating system. In Ubuntu 22.04 OS the default function assigned to this key is suspend mode. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the terminal and run the following command to check the power button action: gsettings get org.gnome.settings-daemon.plugins.power power-button-action If the status is other than suspend run the following command to change the power button action: gsettings set org.gnome.settings-daemon.plugins.power power-button-action \"suspend\" Check the power button action again by running the following command: gsettings get org.gnome.settings-daemon.plugins.power power-button-action Press the power button once and note the result. Press Enter and note the result. Run the following command to check last finished operation: journalctl | grep systemd-logind | tail -1 Expected result Pressing the button once should make laptop enter sleep mode. The power LED should be blinking green, indicating the laptop is sleeping. After completing the 5th step device should wake up. The output of the last command should contain the line: Operation 'sleep' finished ECR019.002 Buttons (button: power) in OS (Windows 11) Test description This test verifies that the power button is detected correctly by the operating system. In Windows 11 OS the default function assigned to this key is sleep mode. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Proceed with the Installing updates and drivers section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Wait 30 seconds for the system to load fully. Press the power button once and note the result. Expected result Pressing the button once should make laptop enter sleep mode. The power LED should be blinking green, indicating the laptop is sleeping. ECR020.001 Buttons (button: lid switch) in OS (Ubuntu 22.04) Test description This test verifies that the lid switch is detected correctly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open one terminal window and run the following command: sudo systemd-inhibit --what handle-lid-switch --mode block watch echo \"Inhibiting lid switch\" Open another terminal and run the command sleep 5 && cat /proc/acpi/button/lid/LID0/state to read the state of the lid while it is closed. Close the lid and wait 5 seconds. Open the lid and note the output of the command. Run the command cat /proc/acpi/button/lid/LID0/state while the lid is open and note the output. Expected result The output of the second command should report that the lid is closed. The output of the third command should report that the lid is open. ECR020.002 Buttons (button: lid switch) in OS (Windows 11) Test description This test verifies that the lid switch is detected correctly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Proceed with the Installing updates and drivers section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Wait 30 seconds for the system to load fully. Close the lid and note the effect on the power LED. Expected result Pressing the button once should make laptop enter sleep mode. The power LED should be blinking green, indicating the laptop is sleeping. ECR021.001 Keyboard (function key: RGB keyboard toggle) in OS (Ubuntu 22.04) Test description This test verifies that the RGB keyboard toggle hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard toggle hotkey twice and note the result each time. Expected result Pressing the button once should disable the keyboard backlight. Pressing the button again should re-enable the keyboard backlight. ECR021.002 Keyboard (function key: RGB keyboard toggle) in OS (Windows 11) Test description This test verifies that the RGB keyboard toggle hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard toggle hotkey twice and note the result each time. Expected result Pressing the button once should disable the keyboard backlight. Pressing the button again should re-enable the keyboard backlight. ECR022.001 RGB keyboard next color FN key in OS (Ubuntu 22.04) Test description This test verifies that the RGB keyboard's next color hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard color hotkey repeatedly until the keyboard cycles through all color modes. Expected result Pressing the button once should switch the keyboard color. All color modes according to product documentation should be accessible. ECR022.002 RGB keyboard next color FN key in OS (Windows 11) Test description This test verifies that the RGB keyboard's next color hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard color hotkey repeatedly until the keyboard cycles through all color modes. Expected result Pressing the button once should switch the keyboard color. All color modes according to product documentation should be accessible. ECR023.001 RGB keyboard brightness down FN key in OS (Ubuntu 22.04) Test description This test verifies that the RGB keyboard brightness down hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard brightness down hotkey and note the result. Expected result Pressing the button once should lower the keyboard backlight ECR023.002 RGB keyboard brightness down FN key in OS (Windows 11) Test description This test verifies that the RGB keyboard brightness down hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard brightness down hotkey and note the result. Expected result Pressing the button once should lower the keyboard backlight. ECR024.001 RGB keyboard brightness up FN key in OS (Ubuntu 22.04) Test description This test verifies that the RGB keyboard brightness up hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard brightness up hotkey and note the result. Expected result Pressing the button once should increase the keyboard backlight. ECR024.002 RGB keyboard brightness up FN key in OS (Windows 11) Test description This test verifies that the RGB keyboard brightness up hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard brightness up hotkey and note the result. Expected result Pressing the button once should increase the keyboard backlight. ECR025.001 Permanent keyboard illumination after cold-boot (Firmware) Test description This test aims to verify that after performing cold-boot, keyboard still illuminates in firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Set keyboard brightness and color to arbitrary settings. Disconnect power source, and remove battery if present. Connect power and battery again. Power on the DUT again and press the BIOS_SETUP_KEY to enter the setup menu. Expected result After cold-boot keyboard brightness and colors settings remain the same. ECR025.002 Permanent keyboard illumination after cold-boot (Ubuntu 22.04) Test description This test aims to verify that after performing cold-boot, keyboard still illuminates in Ubuntu 22.04. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Disconnect power source, and remove battery if present. Connect power and battery again. Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Expected result After cold-boot keyboard brightness and colors settings remain the same. ECR025.003 Permanent keyboard illumination after cold-boot (Windows 11) Test description This test aims to verify that after performing cold-boot, keyboard still illuminates in Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Disconnect power source, and remove battery if present. Connect power and battery again. Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Expected result After cold-boot keyboard brightness and colors settings remain the same. ECR026.001 Permanent keyboard illumination after warm-boot (Firmware) Test description This test aims to verify that after performing warm-boot, keyboard still illuminates in firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Set keyboard brightness and color to arbitrary settings. Power off the DUT using power button. Power on the DUT again and press the BIOS_SETUP_KEY to enter the setup menu. Expected result After warm-boot keyboard brightness and colors settings remain the same. ECR026.002 Permanent keyboard illumination after warm-boot (Ubuntu 22.04) Test description This test aims to verify that after performing warm-boot, keyboard still illuminates in Ubuntu 22.04. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Power off the DUT using power button. Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Expected result After warm-boot keyboard brightness and colors settings remain the same. ECR026.003 Permanent keyboard illumination after warm-boot (Windows 11) Test description This test aims to verify that after performing warm-boot, keyboard still illuminates in Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Power off the DUT using power button. Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Expected result After warm-boot keyboard brightness and colors settings remain the same. ECR027.001 Permanent keyboard illumination after reboot (Firmware) Test description This test aims to verify that after performing reboot, keyboard still illuminates in firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Set keyboard brightness and color to arbitrary settings. Select Reset option from the bottom of the list. During boot press the BIOS_SETUP_KEY to enter the setup menu. Expected result After reboot keyboard brightness and colors settings remain the same. ECR027.002 Permanent keyboard illumination after reboot (Ubuntu 22.04) Test description This test aims to verify that after performing reboot, keyboard still illuminates in Ubuntu 22.04 Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Reboot the device using: sudo reboot now Expected result After reboot keyboard brightness and colors settings remain the same. ECR027.003 Permanent keyboard illumination after reboot (Windows 11) Test description This test aims to verify that after performing reboot, keyboard still illuminates in Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Reboot the device executing in PowerShell: Restart-Computer Expected result After reboot keyboard brightness and colors settings remain the same. ECR028.001 Permanent keyboard illumination after suspension (Firmware) Test description This test aims to verify that after performing suspension, keyboard still illuminates in firmware. Test configuration data FIRMWARE = Dasharo SUSPEND_KEY = Fn + F12 Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Set keyboard brightness and color to arbitrary settings. Suspend the DUT using SUSPEND_KEY . Wake the device from suspend pressing any key on keyboard. Expected result After suspend keyboard brightness and colors settings remain the same. ECR028.002 Permanent keyboard illumination after suspension (Ubuntu 22.04) Test description This test aims to verify that after performing suspension, keyboard still illuminates in Ubuntu 22.04 Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 SUSPEND_KEY = Fn + F12 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Suspend the DUT using SUSPEND_KEY . Wake the device from suspend pressing any key on keyboard. Expected result After suspend keyboard brightness and colors settings remain the same. ECR028.003 Permanent keyboard illumination after suspension (Windows 11) Test description This test aims to verify that after performing suspension, keyboard still illuminates in Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 SUSPEND_KEY = Fn + F12 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Suspend the DUT using SUSPEND_KEY . Wake the device from suspend pressing any key on keyboard. Expected result After suspend keyboard brightness and colors settings remain the same. ECR029.001 FnLock Hotkey (Ubuntu 22.04) Test description This test aims to verify that FnLock hotkey functionality works properly on Ubuntu 22.04. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 FN_LOCK_KEY = Fn + CapsLock Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Use FN_LOCK_KEY to activate Fn lock functionality. Test function keys F1 - F12 and note the results. Expected result The function keys F1 - F12 behave as if Fn key is pressed. ECR029.002 FnLock Hotkey (Windows 11) Test description This test aims to verify that FnLock hotkey functionality works properly on Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 FN_LOCK_KEY = Fn + CapsLock Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Use FN_LOCK_KEY to activate Fn lock functionality. Test function keys F1 - F12 and note the results. Expected result The function keys F1 - F12 behave as if Fn key is pressed. SIO001.001 PS/2 mouse in OS - (Ubuntu 22.04) Test description This test verifies that the touchpad is initialized correctly and is detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect PS/2 mouse to the green PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Verify that the cursor can be moved with the PS/2 mouse and that clicking works. Expected result Moving the cursor and clicking working correctly in the operating system. SIO001.002 PS/2 mouse in OS - (Windows 11) Test description This test verifies that the touchpad is initialized correctly and is detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect PS/2 mouse to the green PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Verify that the cursor can be moved with the PS/2 mouse and that clicking works. Expected result Moving the cursor and clicking working correctly in the operating system. SIO002.001 PS/2 keyboard in firmware Test description This test verifies that the keyboard is detected correctly by the firmware and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo BIOS_SETUP_KEY = Esc Test setup Proceed with the Generic test setup: firmware Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Use the arrow keys and the Enter key to navigate the menus. Expected result All menus can be entered using the PS/2 keyboard. SIO002.002 PS/2 keyboard in OS (Ubuntu 22.04) Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo BIOS_SETUP_KEY = Esc OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run sudo libinput debug-events --show-keycodes in the terminal. Press keyboard keys and check the generated keycode. Expected result All standard keyboard keys generate the correct keycodes and events as per their labels. Key combinations are detected correctly. SIO002.003 PS/2 keyboard in OS (Windows 11) Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open notepad Test the alphanumeric keys and note the generated characters Test non-alphanumeric keys and verify that they generate the signs Test key combinations with the Shift , and Alt modifier keys Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. Check if On-Screen Keyboard correctly highlights it. Open Start menu and press Esc . Check if Start menu is properly closed. Expected result All standard keyboard keys generate correct characters or actions when pressed. Key combinations are detected correctly. SIO003.001 PS/2 keyboard wake in OS (Ubuntu 22.04) Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo BIOS_SETUP_KEY = Esc OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Suspend the system to RAM. Press a keyboard key to wake the platform. Expected result Platform is resuming to the OS from sleep after pressing the key. SIO003.002 PS/2 keyboard wake in OS (Windows 11) Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Suspend the system to RAM. Press a keyboard key to wake the platform. Expected result Platform is resuming to the OS from sleep after pressing the key. SIO004.001 Serial port in firmware Test description This test verifies that the serial port is detected correctly by the firmware and the menu can be traversed with serial console. Test configuration data FIRMWARE = Dasharo BIOS_SETUP_KEY = Esc Test setup Proceed with the Generic test setup: firmware Connect DB9 null modem cable to RS232/USB adapter and the onboard serial port connector. Test steps Open the terminal emulator, e.g. minicom, on the RS232/USB adapter. Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Use the arrow keys and the Enter key to navigate the menus. Expected result All menus can be entered using the serial console. SIO004.002 Serial port in OS (Ubuntu 22.04) Test description This test verifies that the serial port is detected correctly by the operating system and can be utilized as serial console. Test configuration data FIRMWARE = Dasharo BIOS_SETUP_KEY = Esc OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect DB9 null modem cable to RS232/USB adapter and the onboard serial port connector. Configure Linux kernel parameters to use serial console, e.g. console=ttyS0,115200 Test steps Open the terminal emulator, e.g. minicom, on the RS232/USB adapter. Power on the DUT. Boot into the system. Log into the system by using the proper login and password through serial console. Expected result Serial port can be used as Linux console to log in. Serial port can be used to execute commands in bash/shell.","title":"Embedded Controller and Super I/O initialization "},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#dasharo-compatibility-embedded-controller-and-super-io-initialization","text":"","title":"Dasharo Compatibility: Embedded Controller and Super I/O initialization"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr001001-battery-monitoring-charge-level-in-os-ubuntu-2204","text":"Test description This test verifies whether the battery charge level is reported in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Locate the power menu in the upper right corner of the screen. Open the power menu and locate the battery status indicator. Expected result The battery status indicator should show the current charge level (percentage left).","title":"ECR001.001 Battery monitoring - charge level in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr001002-battery-monitoring-charge-level-in-os-windows-11","text":"Test description This test verifies whether the battery charge level is reported in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Locate the power menu in the lower right corner of the screen. Expected result The battery status indicator should show the current charge level (percentage left).","title":"ECR001.002 Battery monitoring - charge level in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr002001-battery-monitoring-charging-state-in-os-ubuntu-2204","text":"Test description This test verifies that the power supply state is detected correctly in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Locate the power menu in the upper right corner of the screen. Open the power menu and locate the battery status indicator. Note the current state. Unplug the power supply and wait for the battery charge state to change to Discharging . Plug in the power supply and wait for the battery charge state to change to Charging . Expected result The battery charge indicator should correctly show whether the power supply is plugged in or not. The battery charge indicator should detect the AC adapter state change within seconds of the adapter being plugged in/out.","title":"ECR002.001 Battery monitoring - charging state in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr002002-battery-monitoring-charging-state-in-os-windows-11","text":"Test description This test verifies that the power supply state is detected correctly in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Locate the power menu in the lower right corner of the screen. Open the power menu and locate the battery status indicator. Note the current state. Unplug the power supply and wait for the battery charge state to change to on battery . Plug in the power supply and wait for the battery charge state to change to plugged in . Expected result The battery charge indicator should correctly show whether the power supply is plugged in or not. The battery charge indicator should detect the AC adapter state change within seconds of the adapter being plugged in / out.","title":"ECR002.002 Battery monitoring - charging state in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr003001-touchpad-in-os-ubuntu-2204","text":"Test description This test verifies that the touchpad is initialized correctly and is detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install libinput-tools on the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Verify that the cursor can be moved with the touchpad and that clicking works (test both clicking and tapping). Run sudo libinput debug-events in the terminal: Verify that scrolling with 2 fingers generates a POINTER_AXIS event, Verify that pinching with 2 fingers generates a GESTURE_PINCH_UPDATE event. Press Ctrl + C to terminate the libinput program. Expected result Moving the cursor, clicking, zooming and scrolling are detected correctly by the operating system.","title":"ECR003.001 Touchpad in OS - (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr003002-touchpad-in-os-windows-11","text":"Test description This test verifies that the touchpad is initialized correctly and is detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Verify that the cursor can be moved with the touchpad and that clicking works (test both clicking and tapping). Open C:\\Windows in Windows Explorer Verify that scrolling with 2 fingers moves the content of the window, Verify that pinching with 2 fingers zooms in and zooms out the content. Expected result Moving the cursor, clicking, zooming and scrolling are detected correctly by the operating system.","title":"ECR003.002 Touchpad in OS - (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr004001-keyboard-standard-keypad-in-firmware","text":"Test description This test verifies that the keyboard is detected correctly by the firmware and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Use the arrow keys and the Enter key to navigate the menus. Expected result All menus can be entered using the internal keyboard.","title":"ECR004.001 Keyboard (standard keypad) in firmware"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr004002-keyboard-standard-keypad-in-os-ubuntu-2204","text":"Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install libinput-tools on the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run sudo libinput debug-events --show-keycodes in the terminal. Press each keyboard key and check the generated keycode. Expected result All standard keyboard keys generate the correct keycodes and events as per their labels. Key combinations are detected correctly.","title":"ECR004.002 Keyboard (standard keypad) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr004003-keyboard-standard-keypad-in-os-windows-11","text":"Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open notepad Test the alphanumeric keys and note the generated characters Test non-alphanumeric keys and verify that they generate the signs Test key combinations with the Shift , and Alt modifier keys Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. Check if On-Screen Keyboard correctly highlights it. Open Start menu and press Esc . Check if Start menu is properly closed. Expected result All standard keyboard keys generate correct characters or actions when pressed. Key combinations are detected correctly.","title":"ECR004.003 Keyboard (standard keypad) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr005001-keyboard-function-key-playpause-in-os-ubuntu-2204","text":"Test description This test verifies that the play/pause hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Install libinput-tools on the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run sudo libinput debug-events --show-keycodes in the terminal. Verify that pressing the play/pause key generates a KEY_PLAYPAUSE event. Expected result Pressing the play/pause hotkey generates a KEY_PLAYPAUSE event.","title":"ECR005.001 Keyboard (function key: play/pause) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr005002-keyboard-function-key-playpause-in-os-windows-11","text":"Test description This test verifies that the play/pause hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Start Groove Music Verify that when pressing the play/pause button, player menu appears in the upper left part of the screen for a few seconds. Expected result Pressing the play/pause hotkey is properly detected by the OS","title":"ECR005.002 Keyboard (function key: play/pause) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr006001-keyboard-function-key-cooling-mode-in-os-ubuntu-2204","text":"Test description This test verifies that the cooling mode hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the cooling mode hotkey (Fn + 1) once and note the effect. Press the cooling mode hotkey once again and note the effect. Expected result Pressing the hotkey once should activate the cooling mode (fans should spin up to their maximum speed). Pressing the hotkey again should deactivate the cooling mode (fans should return to normal).","title":"ECR006.001 Keyboard (function key: cooling mode) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr006002-keyboard-function-key-cooling-mode-in-os-windows-11","text":"Test description This test verifies that the cooling mode hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the cooling mode hotkey (Fn + 1) once and note the effect. Press the cooling mode hotkey once again and note the effect. Expected result Pressing the hotkey once should activate the cooling mode (fans should spin up to their maximum speed). Pressing the hotkey again should deactivate the cooling mode (fans should return to normal).","title":"ECR006.002 Keyboard (function key: cooling mode) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr007001-keyboard-function-key-touchpad-onoff-in-os-ubuntu-2204","text":"Test description This test verifies that the touchpad on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Proceed with the Test cases common documentation section. Create a file /etc/udev/hwdb.d/60-keyboard.hwdb with the following contents: evdev:atkbd:dmi:bvn*:bvr*:svnNotebook:pnNV4XMB,ME,MZ:* KEYBOARD_KEY_f7 = 191 KEYBOARD_KEY_f8 = 191 Execute the following commands: sudo systemd-hwdb update sudo udevadm trigger Test steps Press the touchpad on/off key and try to use the touchpad. Press the touchpad on/off key once again and try to use the touchpad again. Expected result Pressing the hotkey once should deactivate the touchpad (touchpad should be completely inoperable). Pressing the hotkey again should reactivate the touchpad.","title":"ECR007.001 Keyboard (function key: touchpad on/off) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr007002-keyboard-function-key-touchpad-onoff-in-os-windows-11","text":"Test description This test verifies that the touchpad on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the touchpad on/off key and try to use the touchpad. Press the touchpad on/off key once again and try to use the touchpad again. Expected result Pressing the hotkey once should deactivate the touchpad (touchpad should be completely inoperable). Pressing the hotkey again should reactivate the touchpad.","title":"ECR007.002 Keyboard (function key: touchpad on/off) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr008001-keyboard-function-key-display-onoff-in-os-ubuntu-2204","text":"Test description This test verifies that the display on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the display on/off hotkey once and note the effect. Press any key on the keyboard and note the effect. Expected result Pressing the hotkey once should turn the internal LCD panel off. Pressing any key on the keyboard should power the internal LCD panel back on.","title":"ECR008.001 Keyboard (function key: display on/off) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr008002-keyboard-function-key-display-onoff-in-os-windows-11","text":"Test description This test verifies that the display on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the display on/off hotkey once and note the effect. Press any key on the keyboard and note the effect. Expected result Pressing the hotkey once should turn the internal LCD panel off. Pressing any key on the keyboard should power the internal LCD panel back on.","title":"ECR008.002 Keyboard (function key: display on/off) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr009001-keyboard-function-key-mute-in-os-ubuntu-2204","text":"Test description This test verifies that the volume mute hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the volume mute hotkey twice and note the effect each keypress has. Expected result Pressing the hotkey should mute or unmute the currently enabled audio output. Each keypress should cause a mute/unmute notification to appear in the middle of the screen.","title":"ECR009.001 Keyboard (function key: mute) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr009002-keyboard-function-key-mute-in-os-windows-11","text":"Test description This test verifies that the mute hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the mute hotkey once and check the volume indicator in the bottom right part of the screen. Press the mute hotkey once and check the volume indicator again. Expected result Pressing the hotkey once should mute the device Pressing the hotkey again should re-enable the sound","title":"ECR009.002 Keyboard (function key: mute) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr010001-keyboard-function-key-keyboard-backlight-in-os-ubuntu-2204","text":"Test description This test verifies that the keyboard backlight hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the keyboard backlight hotkey 6 times and note the effect on the keyboard backlight after each keypress. Expected result The keyboard has 6 backlight settings from 0% to 100% Each keypress should set the keyboard to the next mode, with the last mode wrapping back around to the first.","title":"ECR010.001 Keyboard (function key: keyboard backlight) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr010002-keyboard-function-key-keyboard-backlight-in-os-windows-11","text":"Test description This test verifies that the keyboard backlight hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the keyboard backlight hotkey 6 times and note the effect on the keyboard backlight after each keypress. Expected result The keyboard has 6 backlight settings from 0% to 100% Each keypress should set the keyboard to the next mode, with the last mode wrapping back around to the first.","title":"ECR010.002 Keyboard (function key: keyboard backlight) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr011001-keyboard-function-key-volume-down-in-os-ubuntu-2204","text":"Test description This test verifies that the volume down hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the volume down hotkey once and note the effects. Expected result Pressing the hotkey should decrease the volume of the currently enabled audio output. Each key press should cause a volume down notification to appear in the middle of the screen.","title":"ECR011.001 Keyboard (function key: volume down) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr011002-keyboard-function-key-volume-down-in-os-windows-11","text":"Test description This test verifies that the volume down hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the volume down hotkey once and note the effects. Expected result Pressing the hotkey should decrease the volume of the currently enabled audio output. Each key press should cause a volume down notification to appear in the upper left part of the screen.","title":"ECR011.002 Keyboard (function key: volume down) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr012001-keyboard-function-key-volume-up-in-os-ubuntu-2204","text":"Test description This test verifies that the volume up hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the volume up hotkey once and note the effects. Expected result Pressing the hotkey should increase the volume of the currently enabled audio output. Each key press should cause a volume up notification to appear in the middle of the screen.","title":"ECR012.001 Keyboard (function key: volume up) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr012002-keyboard-function-key-volume-up-in-os-windows-11","text":"Test description This test verifies that the volume up hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the volume down hotkey once and note the effects. Expected result Pressing the hotkey should increase the volume of the currently enabled audio output. Each key press should cause a volume up notification to appear in the upper left part of the screen.","title":"ECR012.002 Keyboard (function key: volume up) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr013001-keyboard-function-key-display-switch-in-os-ubuntu-2204","text":"Test description This test verifies that the display switch hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install libinput-tools on the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run sudo libinput debug-events --show-keycodes in the terminal. Press the display switch hotkey once and note the effect. Expected result Pressing the hotkey should yield the following output in the terminal: -event3 KEYBOARD_KEY +0.000s KEY_LEFTMETA ( 125 ) pressed event3 KEYBOARD_KEY +0.004s KEY_P ( 25 ) pressed event3 KEYBOARD_KEY +0.010s KEY_P ( 25 ) released event3 KEYBOARD_KEY +0.015s KEY_LEFTMETA ( 125 ) released","title":"ECR013.001 Keyboard (function key: display switch) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr013002-keyboard-function-key-display-switch-in-os-windows-11","text":"Test description This test verifies that the display switch hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the display switch hotkey once and note the effect. Expected result Pressing the hotkey should cause the display settings bar to appear on the right part of the screen.","title":"ECR013.002 Keyboard (function key: display switch) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr014001-keyboard-function-key-brightness-down-in-os-ubuntu-2204","text":"Test description This test verifies that the brightness down hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test steps Press the brightness down hotkey once and note the effects. Expected result Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Pressing the hotkey should decrease the brightness of the internal LCD display. Each key press should cause a brightness down notification to appear in the middle of the screen.","title":"ECR014.001 Keyboard (function key: brightness down) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr014002-keyboard-function-key-brightness-down-in-os-windows-11","text":"Test description This test verifies that the brightness down hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the brightness down hotkey once and note the effects. Expected result Pressing the hotkey should decrease the brightness of the internal LCD display. Each key press should cause a brightness down notification to appear in the top left of the screen.","title":"ECR014.002 Keyboard (function key: brightness down) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr015001-keyboard-function-key-brightness-up-in-os-ubuntu-2204","text":"Test description This test verifies that the brightness up hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the brightness up hotkey once and note the effects. Expected result Pressing the hotkey should increase the brightness of the internal LCD display. Each key press should cause a brightness up notification to appear in the middle of the screen.","title":"ECR015.001 Keyboard (function key: brightness up) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr015002-keyboard-function-key-brightness-up-in-os-windows-11","text":"Test description This test verifies that the brightness down hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the brightness up hotkey once and note the effects. Expected result Pressing the hotkey should increase the brightness of the internal LCD display. Each key press should cause a brightness up notification to appear in the top left of the screen.","title":"ECR015.002 Keyboard (function key: brightness up) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr016001-keyboard-function-key-camera-onoff-in-os-ubuntu-2204","text":"Test description This test verifies that the camera on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the terminal and run the command: watch -n1 lsusb . Press the camera on/off hotkey twice and note the effect after each keypress. Expected result Pressing the hotkey once should make the Chicony Electronics Co., Ltd Chicony USB2.0 Camera device disappear from the output of lsusb . Pressing the hotkey again should make the USB device reappear.","title":"ECR016.001 Keyboard (function key: camera on/off) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr016002-keyboard-function-key-camera-onoff-in-os-windows-11","text":"Test description This test verifies that the camera on/off hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the Camera app. Press the camera on/off hotkey twice and note the effect after a few seconds after the keypress. Expected result Pressing the hotkey once should make the camera image disappear. Pressing the hotkey again should make the camera image appear again after a few seconds.","title":"ECR016.002 Keyboard (function key: camera on/off) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr017001-keyboard-function-key-flight-mode-in-os-ubuntu-2204","text":"Test description This test verifies that the flight mode hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Locate and open the power menu in the upper right corner of the screen. Enter Settings and navigate to the Wi-Fi panel. Note the current state of the Airplane Mode switch. Press the flight mode hotkey twice and note the result of each keypress. Expected result Pressing the hotkey once should enable airplane mode. Pressing the hotkey again should disable airplane mode.","title":"ECR017.001 Keyboard (function key: flight mode) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr017002-keyboard-function-key-flight-mode-in-os-windows-11","text":"Test description This test verifies that the flight mode hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the camera on/off hotkey twice and note the effect after the key press. Expected result Pressing the hotkey once should enable airplane mode and cause airplane mode on notification to appear in the top right part of the screen. Pressing the hotkey again should disable airplane mode and cause airplane mode off notification to appear in the top right part of the screen.","title":"ECR017.002 Keyboard (function key: flight mode) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr018001-keyboard-function-key-sleep-in-os-ubuntu-2204","text":"Test description This test verifies that the sleep hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the sleep hotkey once and note the result. Expected result The laptop should go to sleep within seconds of the hotkey being pressed. The power LED should be blinking green, indicating the laptop is sleeping.","title":"ECR018.001 Keyboard (function key: sleep) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr018002-keyboard-function-key-sleep-in-os-windows-11","text":"Test description This test verifies that the sleep hotkey works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Proceed with the Installing updates and drivers section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Wait 30 seconds for the system to load fully. Press the sleep hotkey once and note the result. Expected result The laptop should go to sleep within seconds of the hotkey being pressed. The power LED should be blinking green, indicating the laptop is sleeping.","title":"ECR018.002 Keyboard (function key: sleep) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr019001-buttons-button-power-in-os-ubuntu-2204","text":"Test description This test verifies that the power button is detected correctly by the operating system. In Ubuntu 22.04 OS the default function assigned to this key is suspend mode. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the terminal and run the following command to check the power button action: gsettings get org.gnome.settings-daemon.plugins.power power-button-action If the status is other than suspend run the following command to change the power button action: gsettings set org.gnome.settings-daemon.plugins.power power-button-action \"suspend\" Check the power button action again by running the following command: gsettings get org.gnome.settings-daemon.plugins.power power-button-action Press the power button once and note the result. Press Enter and note the result. Run the following command to check last finished operation: journalctl | grep systemd-logind | tail -1 Expected result Pressing the button once should make laptop enter sleep mode. The power LED should be blinking green, indicating the laptop is sleeping. After completing the 5th step device should wake up. The output of the last command should contain the line: Operation 'sleep' finished","title":"ECR019.001 Buttons (button: power) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr019002-buttons-button-power-in-os-windows-11","text":"Test description This test verifies that the power button is detected correctly by the operating system. In Windows 11 OS the default function assigned to this key is sleep mode. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Proceed with the Installing updates and drivers section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Wait 30 seconds for the system to load fully. Press the power button once and note the result. Expected result Pressing the button once should make laptop enter sleep mode. The power LED should be blinking green, indicating the laptop is sleeping.","title":"ECR019.002 Buttons (button: power) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr020001-buttons-button-lid-switch-in-os-ubuntu-2204","text":"Test description This test verifies that the lid switch is detected correctly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open one terminal window and run the following command: sudo systemd-inhibit --what handle-lid-switch --mode block watch echo \"Inhibiting lid switch\" Open another terminal and run the command sleep 5 && cat /proc/acpi/button/lid/LID0/state to read the state of the lid while it is closed. Close the lid and wait 5 seconds. Open the lid and note the output of the command. Run the command cat /proc/acpi/button/lid/LID0/state while the lid is open and note the output. Expected result The output of the second command should report that the lid is closed. The output of the third command should report that the lid is open.","title":"ECR020.001 Buttons (button: lid switch) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr020002-buttons-button-lid-switch-in-os-windows-11","text":"Test description This test verifies that the lid switch is detected correctly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Proceed with the Installing updates and drivers section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Wait 30 seconds for the system to load fully. Close the lid and note the effect on the power LED. Expected result Pressing the button once should make laptop enter sleep mode. The power LED should be blinking green, indicating the laptop is sleeping.","title":"ECR020.002 Buttons (button: lid switch) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr021001-keyboard-function-key-rgb-keyboard-toggle-in-os-ubuntu-2204","text":"Test description This test verifies that the RGB keyboard toggle hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard toggle hotkey twice and note the result each time. Expected result Pressing the button once should disable the keyboard backlight. Pressing the button again should re-enable the keyboard backlight.","title":"ECR021.001 Keyboard (function key: RGB keyboard toggle) in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr021002-keyboard-function-key-rgb-keyboard-toggle-in-os-windows-11","text":"Test description This test verifies that the RGB keyboard toggle hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard toggle hotkey twice and note the result each time. Expected result Pressing the button once should disable the keyboard backlight. Pressing the button again should re-enable the keyboard backlight.","title":"ECR021.002 Keyboard (function key: RGB keyboard toggle) in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr022001-rgb-keyboard-next-color-fn-key-in-os-ubuntu-2204","text":"Test description This test verifies that the RGB keyboard's next color hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard color hotkey repeatedly until the keyboard cycles through all color modes. Expected result Pressing the button once should switch the keyboard color. All color modes according to product documentation should be accessible.","title":"ECR022.001 RGB keyboard next color FN key in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr022002-rgb-keyboard-next-color-fn-key-in-os-windows-11","text":"Test description This test verifies that the RGB keyboard's next color hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard color hotkey repeatedly until the keyboard cycles through all color modes. Expected result Pressing the button once should switch the keyboard color. All color modes according to product documentation should be accessible.","title":"ECR022.002 RGB keyboard next color FN key in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr023001-rgb-keyboard-brightness-down-fn-key-in-os-ubuntu-2204","text":"Test description This test verifies that the RGB keyboard brightness down hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard brightness down hotkey and note the result. Expected result Pressing the button once should lower the keyboard backlight","title":"ECR023.001 RGB keyboard brightness down FN key in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr023002-rgb-keyboard-brightness-down-fn-key-in-os-windows-11","text":"Test description This test verifies that the RGB keyboard brightness down hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard brightness down hotkey and note the result. Expected result Pressing the button once should lower the keyboard backlight.","title":"ECR023.002 RGB keyboard brightness down FN key in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr024001-rgb-keyboard-brightness-up-fn-key-in-os-ubuntu-2204","text":"Test description This test verifies that the RGB keyboard brightness up hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard brightness up hotkey and note the result. Expected result Pressing the button once should increase the keyboard backlight.","title":"ECR024.001 RGB keyboard brightness up FN key in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr024002-rgb-keyboard-brightness-up-fn-key-in-os-windows-11","text":"Test description This test verifies that the RGB keyboard brightness up hotkey is handled properly by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Press the RGB keyboard brightness up hotkey and note the result. Expected result Pressing the button once should increase the keyboard backlight.","title":"ECR024.002 RGB keyboard brightness up FN key in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr025001-permanent-keyboard-illumination-after-cold-boot-firmware","text":"Test description This test aims to verify that after performing cold-boot, keyboard still illuminates in firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Set keyboard brightness and color to arbitrary settings. Disconnect power source, and remove battery if present. Connect power and battery again. Power on the DUT again and press the BIOS_SETUP_KEY to enter the setup menu. Expected result After cold-boot keyboard brightness and colors settings remain the same.","title":"ECR025.001 Permanent keyboard illumination after cold-boot (Firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr025002-permanent-keyboard-illumination-after-cold-boot-ubuntu-2204","text":"Test description This test aims to verify that after performing cold-boot, keyboard still illuminates in Ubuntu 22.04. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Disconnect power source, and remove battery if present. Connect power and battery again. Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Expected result After cold-boot keyboard brightness and colors settings remain the same.","title":"ECR025.002 Permanent keyboard illumination after cold-boot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr025003-permanent-keyboard-illumination-after-cold-boot-windows-11","text":"Test description This test aims to verify that after performing cold-boot, keyboard still illuminates in Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Disconnect power source, and remove battery if present. Connect power and battery again. Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Expected result After cold-boot keyboard brightness and colors settings remain the same.","title":"ECR025.003 Permanent keyboard illumination after cold-boot (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr026001-permanent-keyboard-illumination-after-warm-boot-firmware","text":"Test description This test aims to verify that after performing warm-boot, keyboard still illuminates in firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Set keyboard brightness and color to arbitrary settings. Power off the DUT using power button. Power on the DUT again and press the BIOS_SETUP_KEY to enter the setup menu. Expected result After warm-boot keyboard brightness and colors settings remain the same.","title":"ECR026.001 Permanent keyboard illumination after warm-boot (Firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr026002-permanent-keyboard-illumination-after-warm-boot-ubuntu-2204","text":"Test description This test aims to verify that after performing warm-boot, keyboard still illuminates in Ubuntu 22.04. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Power off the DUT using power button. Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Expected result After warm-boot keyboard brightness and colors settings remain the same.","title":"ECR026.002 Permanent keyboard illumination after warm-boot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr026003-permanent-keyboard-illumination-after-warm-boot-windows-11","text":"Test description This test aims to verify that after performing warm-boot, keyboard still illuminates in Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Power off the DUT using power button. Power on the DUT. Boot into the OPERATING_SYSTEM . Log into the OPERATING_SYSTEM by using the proper login and password. Expected result After warm-boot keyboard brightness and colors settings remain the same.","title":"ECR026.003 Permanent keyboard illumination after warm-boot (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr027001-permanent-keyboard-illumination-after-reboot-firmware","text":"Test description This test aims to verify that after performing reboot, keyboard still illuminates in firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Set keyboard brightness and color to arbitrary settings. Select Reset option from the bottom of the list. During boot press the BIOS_SETUP_KEY to enter the setup menu. Expected result After reboot keyboard brightness and colors settings remain the same.","title":"ECR027.001 Permanent keyboard illumination after reboot (Firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr027002-permanent-keyboard-illumination-after-reboot-ubuntu-2204","text":"Test description This test aims to verify that after performing reboot, keyboard still illuminates in Ubuntu 22.04 Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Reboot the device using: sudo reboot now Expected result After reboot keyboard brightness and colors settings remain the same.","title":"ECR027.002 Permanent keyboard illumination after reboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr027003-permanent-keyboard-illumination-after-reboot-windows-11","text":"Test description This test aims to verify that after performing reboot, keyboard still illuminates in Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Reboot the device executing in PowerShell: Restart-Computer Expected result After reboot keyboard brightness and colors settings remain the same.","title":"ECR027.003 Permanent keyboard illumination after reboot (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr028001-permanent-keyboard-illumination-after-suspension-firmware","text":"Test description This test aims to verify that after performing suspension, keyboard still illuminates in firmware. Test configuration data FIRMWARE = Dasharo SUSPEND_KEY = Fn + F12 Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Set keyboard brightness and color to arbitrary settings. Suspend the DUT using SUSPEND_KEY . Wake the device from suspend pressing any key on keyboard. Expected result After suspend keyboard brightness and colors settings remain the same.","title":"ECR028.001 Permanent keyboard illumination after suspension (Firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr028002-permanent-keyboard-illumination-after-suspension-ubuntu-2204","text":"Test description This test aims to verify that after performing suspension, keyboard still illuminates in Ubuntu 22.04 Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 SUSPEND_KEY = Fn + F12 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Suspend the DUT using SUSPEND_KEY . Wake the device from suspend pressing any key on keyboard. Expected result After suspend keyboard brightness and colors settings remain the same.","title":"ECR028.002 Permanent keyboard illumination after suspension (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr028003-permanent-keyboard-illumination-after-suspension-windows-11","text":"Test description This test aims to verify that after performing suspension, keyboard still illuminates in Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 SUSPEND_KEY = Fn + F12 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Set keyboard brightness and color to arbitrary settings. Suspend the DUT using SUSPEND_KEY . Wake the device from suspend pressing any key on keyboard. Expected result After suspend keyboard brightness and colors settings remain the same.","title":"ECR028.003 Permanent keyboard illumination after suspension (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr029001-fnlock-hotkey-ubuntu-2204","text":"Test description This test aims to verify that FnLock hotkey functionality works properly on Ubuntu 22.04. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 FN_LOCK_KEY = Fn + CapsLock Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Use FN_LOCK_KEY to activate Fn lock functionality. Test function keys F1 - F12 and note the results. Expected result The function keys F1 - F12 behave as if Fn key is pressed.","title":"ECR029.001 FnLock Hotkey (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#ecr029002-fnlock-hotkey-windows-11","text":"Test description This test aims to verify that FnLock hotkey functionality works properly on Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 FN_LOCK_KEY = Fn + CapsLock Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Use FN_LOCK_KEY to activate Fn lock functionality. Test function keys F1 - F12 and note the results. Expected result The function keys F1 - F12 behave as if Fn key is pressed.","title":"ECR029.002 FnLock Hotkey (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#sio001001-ps2-mouse-in-os-ubuntu-2204","text":"Test description This test verifies that the touchpad is initialized correctly and is detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect PS/2 mouse to the green PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Verify that the cursor can be moved with the PS/2 mouse and that clicking works. Expected result Moving the cursor and clicking working correctly in the operating system.","title":"SIO001.001 PS/2 mouse in OS - (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#sio001002-ps2-mouse-in-os-windows-11","text":"Test description This test verifies that the touchpad is initialized correctly and is detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect PS/2 mouse to the green PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Verify that the cursor can be moved with the PS/2 mouse and that clicking works. Expected result Moving the cursor and clicking working correctly in the operating system.","title":"SIO001.002 PS/2 mouse in OS - (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#sio002001-ps2-keyboard-in-firmware","text":"Test description This test verifies that the keyboard is detected correctly by the firmware and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo BIOS_SETUP_KEY = Esc Test setup Proceed with the Generic test setup: firmware Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Use the arrow keys and the Enter key to navigate the menus. Expected result All menus can be entered using the PS/2 keyboard.","title":"SIO002.001 PS/2 keyboard in firmware"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#sio002002-ps2-keyboard-in-os-ubuntu-2204","text":"Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo BIOS_SETUP_KEY = Esc OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run sudo libinput debug-events --show-keycodes in the terminal. Press keyboard keys and check the generated keycode. Expected result All standard keyboard keys generate the correct keycodes and events as per their labels. Key combinations are detected correctly.","title":"SIO002.002 PS/2 keyboard in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#sio002003-ps2-keyboard-in-os-windows-11","text":"Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open notepad Test the alphanumeric keys and note the generated characters Test non-alphanumeric keys and verify that they generate the signs Test key combinations with the Shift , and Alt modifier keys Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. Check if On-Screen Keyboard correctly highlights it. Open Start menu and press Esc . Check if Start menu is properly closed. Expected result All standard keyboard keys generate correct characters or actions when pressed. Key combinations are detected correctly.","title":"SIO002.003 PS/2 keyboard in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#sio003001-ps2-keyboard-wake-in-os-ubuntu-2204","text":"Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo BIOS_SETUP_KEY = Esc OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Suspend the system to RAM. Press a keyboard key to wake the platform. Expected result Platform is resuming to the OS from sleep after pressing the key.","title":"SIO003.001 PS/2 keyboard wake in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#sio003002-ps2-keyboard-wake-in-os-windows-11","text":"Test description This test verifies that the keyboard is detected correctly by the operating system and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 splitter (if the board has a unified, black PS/2 connector) Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Suspend the system to RAM. Press a keyboard key to wake the platform. Expected result Platform is resuming to the OS from sleep after pressing the key.","title":"SIO003.002 PS/2 keyboard wake in OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#sio004001-serial-port-in-firmware","text":"Test description This test verifies that the serial port is detected correctly by the firmware and the menu can be traversed with serial console. Test configuration data FIRMWARE = Dasharo BIOS_SETUP_KEY = Esc Test setup Proceed with the Generic test setup: firmware Connect DB9 null modem cable to RS232/USB adapter and the onboard serial port connector. Test steps Open the terminal emulator, e.g. minicom, on the RS232/USB adapter. Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu. Use the arrow keys and the Enter key to navigate the menus. Expected result All menus can be entered using the serial console.","title":"SIO004.001 Serial port in firmware"},{"location":"unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/#sio004002-serial-port-in-os-ubuntu-2204","text":"Test description This test verifies that the serial port is detected correctly by the operating system and can be utilized as serial console. Test configuration data FIRMWARE = Dasharo BIOS_SETUP_KEY = Esc OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect DB9 null modem cable to RS232/USB adapter and the onboard serial port connector. Configure Linux kernel parameters to use serial console, e.g. console=ttyS0,115200 Test steps Open the terminal emulator, e.g. minicom, on the RS232/USB adapter. Power on the DUT. Boot into the system. Log into the system by using the proper login and password through serial console. Expected result Serial port can be used as Linux console to log in. Serial port can be used to execute commands in bash/shell.","title":"SIO004.002 Serial port in OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/","text":"Dasharo Compatibility: USB-C/Thunderbolt support with charging and display Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . UTC001.001 USB Type-A charging capability Test description This test verifies that the USB-A ports are able to provide charging to a connected smartphone. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect a phone to the USB Type-A port located on the left side of the laptop using a USB cable. Note the charging status on the phone screen. Connect a phone to the USB Type-A port located on the right side of the laptop using a USB cable. Note the charging status on the phone screen. Expected result The smartphone should indicate that it's charging when connected to either USB Type-A port. UTC002.001 Thunderbolt 4 USB Type-C charging capability Test description This test verifies that the Thunderbolt 4 port is able to provide charging to a connected smartphone. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect a phone to the Thunderbolt 4 USB Type-C port located on the left side of the laptop using a USB cable. Note the charging status on the phone screen. Expected result The smartphone should indicate that it's charging. UTC003.001 USB Type-C PD laptop charging (Ubuntu 22.04) Test description This test verifies that the laptop can be charged using a USB Type-C PD power supply connected to the Thunderbolt 4 port. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Disconnect any charger from the DUT. Connect the charger plug to the docking station. Open a terminal window and run the following command: cat /sys/class/power_supply/BAT0/status Expected result Output of the command should show one of this: Charging or Full . That means laptop is charged properly. UTC003.002 USB Type-C PD laptop charging (Windows 11) Test description This test verifies that the laptop can be charged using a USB Type-C PD power supply connected to the Thunderbolt 4 port. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Disconnect any charger from the DUT. Connect the charger plug to the docking station. Open PowerShell and and run the following command: Get-WmiObject win32_battery Expected result If BatteryStatus is equal 2, that means laptop is charged properly. Example part of output: BatteryStatus : 2 UTC004.001 USB Type-C Display output (Ubuntu 22.04) Test description This test verifies that DUT output video to a display connected via the Thunderbolt 4 USB Type-C port. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect a display to the Thunderbolt 4 USB Type-C port using a USB Type-C hub Open the Settings application and select the Displays panel in the left menu. Verify that the attached external monitor can be selected. Select and enable the monitor. Expected result The monitor connected to the laptop via the Thunderbolt 4 port should power on and display video from the laptop. UTC004.002 USB Type-C Display output (Windows 11) Test description This test verifies that DUT output video to a display connected via the Thunderbolt 4 USB Type-C port. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect a display to the Thunderbolt 4 USB Type-C port using a USB Type-C hub. Right click on the desktop to open the desktop context menu. Select Display Settings to open the display settings window. Verify that the attached external monitor can be selected. Select and enable the monitor. Expected result The monitor connected to the laptop via the Thunderbolt 4 port should power on and display video from the laptop. UTC005.001 USB Type-C docking station HDMI display (Ubuntu 22.04) Test description This test aims to verify that the display connected with the HDMI cable to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect an HDMI cable to the docking station and a display. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. If using more than one display, switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the external HDMI-connected display in Mirror and Join Displays modes. UTC005.002 USB Type-C docking station HDMI display (Windows 11) Test description This test aims to verify that the display connected with the HDMI cable to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect an HDMI cable to the docking station and a display. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the external HDMI-connected display in Duplicate and Extend modes. UTC006.001 USB Type-C docking station DP display (Ubuntu 22.04) Test description This test aims to verify that the display connected with the HDMI cable to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect a Display Port cable to the docking station and a display. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. If using more than one display, switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the external DisplayPort-connected display in Mirror and Join Displays modes. UTC006.002 USB Type-C docking station DP display (Windows 11) Test description This test aims to verify that the display connected with the DisplayPort cable to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect a DisplayPort cable to the docking station and a display. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the external DisplayPort-connected display in Duplicate and Extend modes. UTC007.001 USB Type-C docking station Triple display (Ubuntu 22.04) Test description This test aims to verify that the three display simultaneously connected to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect three displays using HDMI/DisplayPort cables, depending on the specifications of the docking station. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the three external displays in Mirror and Join Displays modes. UTC007.002 USB Type-C docking station Triple display (Windows 11) Test description This test aims to verify that the three display simultaneously connected to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect three displays using HDMI/DisplayPort cables, depending on the specifications of the docking station. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the three external displays in Duplicate and Extend modes. UTC008.001 USB Type-C docking station detection after coldboot (Ubuntu 22.04) Test description This test aims to verify that the DUT properly detects the docking station after coldboot (realized by power supply cutting off then restoring back). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result After lsusb command the docking station entries should be displayed, but output can be different depending on the model of the docking station. Example entries signifing the docking station: Bus 002 Device 010 : Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter Bus 002 Device 009 : Prolific Technology, Inc. USB SD Card Reader Bus 002 Device 008 : VIA Labs, Inc. USB3.0 Hub UTC009.001 USB Type-C docking station detection after warmboot (Ubuntu 22.04) Test description This test aims to verify that the DUT properly detects the docking station after warmboot (realized by device turning off then turning on). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result After lsusb command the docking station entries should be displayed, but output can be different depending on the model of the docking station. Example entries signifing the docking station: Bus 002 Device 010 : Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter Bus 002 Device 009 : Prolific Technology, Inc. USB SD Card Reader Bus 002 Device 008 : VIA Labs, Inc. USB3.0 Hub UTC010.001 USB Type-C docking station detection after reboot (Ubuntu 22.04) Test description This test aims to verify that the DUT properly detects the docking station after system reboot (performed by relevant command). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result After lsusb command the docking station entries should be displayed, but output can be different depending on the model of the docking station. Example entries signifing the docking station: Bus 002 Device 010 : Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter Bus 002 Device 009 : Prolific Technology, Inc. USB SD Card Reader Bus 002 Device 008 : VIA Labs, Inc. USB3.0 Hub UTC011.001 USB Type-C docking station USB devices recognition (firmware) Test description This test aims to verify that the external USB devices connected to the docking station are recognized correctly by the FIRMWARE . Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The USB storage connected to the USB-C docking station . Test steps Power on the DUT. Hold the BIOS_MENU_KEY to enter the BIOS Menu. Check if the USB storage is available on the list. Expected result The USB storage is available which confirms successful recognition. UTC011.002 USB Type-C docking station USB devices recognition (Ubuntu 22.04) Test description This test aims to verify that the external USB devices connected to the docking station are recognized correctly by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The USB storage connected to the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: watch -n1 lsusb Connect(or Disconnect) external USB devices to the USB ports on the docking station and note the result. Expected result After each device is connected to the USB port, a new USB device entry in lsusb command output should appear. After each device is disconnected from the USB port, a USB device entry in lsusb command output should disappear. UTC011.003 USB Type-C docking station USB devices recognition (Windows 11) Test description This test aims to verify that the external USB devices connected to the docking station are recognized correctly by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The USB storage connected to the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and and run the following command: Get-PnpDevice -PresentOnly | Where-Object { $_ . InstanceId -match '^USB' } Note the results. Expected result After executing the command, a list containing all USB devices should be displayed. The list should contain the USB storage , which is plug in. Example output: ```bash Status Class FriendlyName ------ ----- ------------ OK DiskDrive Mass Storage Device USB Device OK USB Generic USB Hub OK HIDClass USB Input Device OK Bluetooth Intel(R) Wireless Bluetooth(R) OK DiskDrive USB SanDisk 3.2Gen1 USB Device OK USB USB Root Hub (USB 3.0) OK Net TP-LINK Gigabit Ethernet USB Adapter OK USB Generic USB Hub OK USB USB Mass Storage Device ``` UTC012.001 USB Type-C docking station USB keyboard (firmware) Test description This test aims to verify that the external USB keyboard connected to the docking station is detected correctly by the FIRMWARE and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The external USB keyboard connected to the docking station. Test steps Power on the DUT Hold the BIOS_MENU_KEY to enter the Bios Menu. Use the arrow keys, Esc key and the Enter key to navigate the menus. Expected result All menus can be entered using the external USB keyboard. UTC012.002 USB Type-C docking station USB keyboard (Ubuntu 22.04) Test description This test aims to verify that the external USB keyboard connected to the docking station is detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the libinput-tools package: sudo apt install libinput-tools . The USB-C docking station connected to the USB-C port. The external USB keyboard connected to the docking station. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Run the following command in the terminal: libinput debug-events --show-keycodes Test the alphanumeric keys and note the generated keycodes. Test non-alphanumeric keys and verify that they generate the correct keycodes. Test key combinations with the Shift , Ctrl and Alt modifier keys (this tests 2-key rollover). Expected result The external USB keyboard is detected in OS. All standard keyboard keys generate the correct keycodes and events as per their labels. Key combinations are detected correctly. UTC012.003 USB Type-C docking station USB keyboard (Windows 11) Test description This test aims to verify that the external USB keyboard is detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The external USB keyboard connected to the docking station. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and and run the following command: Get-CimInstance win32_KEYBOARD Note the results. Open notepad . Test the alphanumeric keys and note the generated characters. Test non-alphanumeric keys and verify that they generate the signs. Test key combinations with the Shift , and Alt modifier keys. Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. Check if On-Screen Keyboard correctly highlights it. Open Start menu and press Esc . Check if Start menu is properly closed. Expected result After running the PowerShell command information about connected keyboards should be displayed. One of keyboard should have identical part of output: Description : USB Input Device All standard keyboard keys generate correct characters or actions when pressed. Key combinations are detected correctly. UTC013.001 USB Type-C docking station upload 1GB file on USB storage (Ubuntu 22.04) Test description This test aims to verify that the 1GB file can be transferred from the OPERATING_SYSTEM to the USB storage connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The USB storage connected to the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command to generate 1GB file: openssl rand -out test_file.txt -base64 $(( 2 ** 30 * 3 / 4 )) Read the path to the USB storage by running the following command: lsblk Copy the generated file to the USB storage by running the following command: cp test_file.txt { path_to_usb_storage } Verify that the files are the same by running the following command: sha256sum test_file.txt { path_to_usb_storage } /test_file.txt Expected result The output from the last command should contain 2 identical checksums: f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb test_file.txt f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb { path_to_usb_storage } /test_file.txt UTC013.002 USB Type-C docking station upload 1GB file on USB storage(Windows 11) Test description This test aims to verify that the 1GB file can be transferred from the OPERATING_SYSTEM to the USB storage connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The USB storage connected to the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open powershell as administrator and run the following command to generate 1GB file: fsutil file createnew test_file . txt 1073741824 Read the drive letter assigned to the USB storage by running the following command: ( Get-Volume | where drivetype -eq removable ). driveletter Copy the generated file to the USB storage by running the following command: Copy-Item -Path C :\\ Windows \\ system32 \\ test_file . txt { drive_letter }: Verify that the files are the same by running the following commands: Get-FileHash test_file . txt Get-FileHash { drive_letter }:\\ test_file . txt Expected result The output from the last commands should have equal hash: Algorithm Hash Path --------- ---- ---- SHA256 F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB C \\ Windows \\ system3 ... Algorithm Hash Path --------- ---- ---- SHA256 F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB E :\\ test_file . txt UTC014.001 USB Type-C docking station Ethernet connection (Ubuntu 22.04) Test description This test aims to verify that the connection to internet via docking station's Ethernet port can be obtained on Ubuntu 22.04. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to docking station. Wait for internet connection to initialize. Ping 3mdeb.com using command in terminal: ping 3mdeb.com Expected result Command should return ping info: PING 3mdeb.com ( 178 .32.205.96 ) 56 ( 84 ) bytes of data. 64 bytes from cluster026.hosting.ovh.net ( 178 .32.205.96 ) : icmp_seq = 1 ttl = 50 time = 44 .3 ms 64 bytes from cluster026.hosting.ovh.net ( 178 .32.205.96 ) : icmp_seq = 2 ttl = 50 time = 47 .7 ms 64 bytes from cluster026.hosting.ovh.net ( 178 .32.205.96 ) : icmp_seq = 3 ttl = 50 time = 41 .1 ms ... Log should not contain phrase information that host is unreachable. Failed ping for Ubuntu 22.04: ping: connect: Network is unreachable UTC014.002 USB Type-C docking station Ethernet connection (Windows 11) Test description This test aims to verify that the connection to internet via docking station's Ethernet port can be obtained on Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to docking station. Wait for internet connection to initialize. Ping 3mdeb.com using command in PowerShell: ping 3mdeb . com Expected result Command should return ping info: Pinging 3mdeb . com [ 178 . 32 . 205 . 96 ] with 32 bytes of data : Reply from 178 . 32 . 205 . 96 : bytes = 32 time = 50ms TTL = 50 Reply from 178 . 32 . 205 . 96 : bytes = 32 time = 47ms TTL = 50 Reply from 178 . 32 . 205 . 96 : bytes = 32 time = 46ms TTL = 50 Log should not contain phrase information that host is unreachable. Failed ping for Windows 11: Ping request could not find host 3mdeb . com . Please check the name and try again . UTC015.001 USB Type-C docking station audio recognition (Ubuntu 22.04) Test description This test aims to verify that the external headset is properly recognized after plugging in the 3.5 mm jack into the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station. When the Select Audio Device menu appears, select what type of external device has been connected to the laptop (headset). Open a terminal window and run the following command: watch -n1 lsusb Connect(or Disconnect) external headset to the 3.5 mm jack on the docking station and note the result. Expected result After connecting the external headset to the 3.5 mm jack, a new entry in lsusb command output should appear. After disconnecting the external headset from the 3.5 mm jack, a headset entry in lsusb command output should disappear. UTC015.002 USB Type-C docking station audio recognition (Windows 11) Test description This test aims to verify that the external headset is properly recognized after plugging in the 3.5 mm jack into the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station After the Which device did you plug in menu appearing, select what type of external device has been connected to the laptop (headset). Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Connect(or Disconnect) external headset to the 3.5 mm jack on the docking station and note the result. Expected result After connecting the external headset to the 3.5 mm jack, new entries regarding the connected headphones should appear in the Output devices and Input devices sections. After disconnecting the external headset from the 3.5 mm jack, the entries for connected headset should disappear from the Output devices and Input devices sections. UTC016.001 USB Type-C docking station audio playback (Ubuntu 22.04) Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external headset speakers connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station. When the Select Audio Device menu appears, select what type of external device has been connected to the laptop (headset). Open a terminal window and execute the following command: pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo 0 pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535 speaker-test Expected result Sound should be played from the external speakers. UTC016.002 USB Type-C docking station audio playback (Windows 11) Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external headset speakers connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station. Find the Speakers icon in the bottom right part of the screen and click it using the left mouse button to open volume menu. After the Which device did you plug in menu appearing, select what type of external device has been connected to the laptop (headset). In the volume menu, click the rightmost part of it and note the reult. Expected result Sound should be played from the external speakers. UTC017.001 USB Type-C docking station audio capture (Ubuntu 22.04) Test description This test aims to verify that the audio subsystem is able to capture audio from external headset connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station. When the Select Audio Device menu appears, select what type of external device has been connected to the laptop (headset). Open a terminal window and execute the following command: arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic.wav Make some noise for the headset. For example, say something. Execute the following command: aplay /tmp/test-mic.wav Expected result The recorded audio clip is recorded correctly and played back. UTC017.002 USB Type-C docking station audio capture (Windows 11) Test description This test aims to verify that the audio subsystem is able to capture audio from external headset connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station. After the Which device did you plug in menu appearing, select what type of external device has been connected to the laptop (headset). Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Select the Microphone position in the Input devices section. Click on the Start Test bar in the Input settings section. Create some noise for the DUT to capture and note the result. For example, say something. Click on the Stop Test bar. Expected result The Input volume bar located in the Input settings section should raise when some noise is being created. The result of the test after clicking the Stop Test bar should be more than 0% of the total volume. UTC018.001 USB Type-C docking station SD Card reader detection (Ubuntu 22.04) Test description This test aims to verify that the SD Card reader built into the docking station is enumerated correctly and might be detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The SD card put into the slot on the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: lsusb | grep \"Card Reader\" Note the result. Expected result The output from the command should contain information about the connected USB SD Card Reader. Example output: Bus 002 Device 007 : ID 067b:2733 Prolific Technology, Inc. USB SD Card Reader UTC018.002 USB Type-C docking station SD Card reader detection (Windows 11) Test description This test aims to verify that the SD Card reader built into the docking station is enumerated correctly and can be detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The SD card put into the slot on the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and execute the following command: Get-PnpDevice -Status \"OK\" -Class \"DiskDrive\" Note the result. Expected result The output from the command should contain information about the connected USB SD Card Reader. Example output: OK DiskDrive SD Card Reader USB Device UTC019.001 USB Type-C docking station SD Card read/write (Ubuntu 22.04) Test description This test aims to verify that the SD Card reader is initialized correctly and can be used from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The SD card put into the slot on the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands to identify the SD card mounting point: lsblk | grep \"sd\" Execute the following commands for generating, copying and comparing generated file: dd if = /dev/urandom of = /tmp/in.bin bs = 4K count = 100 dd if = /tmp/in.bin of = /dev/sda bs = 4K count = 100 dd if = /dev/sda of = /tmp/out.bin bs = 4K count = 100 sha256sum /tmp/in.bin /tmp/out.bin Note the result. Expected result The output from the command to identify the SD card mounting point should return information about the SD card mounting location. Example output: sda 8 :0 1 29 ,5G 0 disk \u2514\u2500sda1 8 :1 1 29 ,5G 0 part /media/user/DCB0-C7E8 sdb 8 :16 1 0B 0 disk The output from the last command should contain 2 identical checksums. Example output 2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb /tmp/in.bin 2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb /tmp/out.bin UTC019.002 USB Type-C docking station SD Card read/write (Windows 11) Test description This test aims to verify that the SD Card reader is initialized correctly and can be used from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The SD card put into the slot on the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Determine the localization of the mounted SD card. Open PowerShell and execute the following commands: New-Item -Path \"${drive_location}:\\\" -Name \"testfile.txt\" -ItemType \"file\" -Value \"This is a test string.\" Get-Content -Path \"${drive_location}:\\testfile.txt\" Note the result. Expected result The last command should return the following message: This is a test string.","title":"USB-C support"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#dasharo-compatibility-usb-cthunderbolt-support-with-charging-and-display","text":"","title":"Dasharo Compatibility: USB-C/Thunderbolt support with charging and display"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc001001-usb-type-a-charging-capability","text":"Test description This test verifies that the USB-A ports are able to provide charging to a connected smartphone. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect a phone to the USB Type-A port located on the left side of the laptop using a USB cable. Note the charging status on the phone screen. Connect a phone to the USB Type-A port located on the right side of the laptop using a USB cable. Note the charging status on the phone screen. Expected result The smartphone should indicate that it's charging when connected to either USB Type-A port.","title":"UTC001.001 USB Type-A charging capability"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc002001-thunderbolt-4-usb-type-c-charging-capability","text":"Test description This test verifies that the Thunderbolt 4 port is able to provide charging to a connected smartphone. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect a phone to the Thunderbolt 4 USB Type-C port located on the left side of the laptop using a USB cable. Note the charging status on the phone screen. Expected result The smartphone should indicate that it's charging.","title":"UTC002.001 Thunderbolt 4 USB Type-C charging capability"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc003001-usb-type-c-pd-laptop-charging-ubuntu-2204","text":"Test description This test verifies that the laptop can be charged using a USB Type-C PD power supply connected to the Thunderbolt 4 port. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Disconnect any charger from the DUT. Connect the charger plug to the docking station. Open a terminal window and run the following command: cat /sys/class/power_supply/BAT0/status Expected result Output of the command should show one of this: Charging or Full . That means laptop is charged properly.","title":"UTC003.001 USB Type-C PD laptop charging (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc003002-usb-type-c-pd-laptop-charging-windows-11","text":"Test description This test verifies that the laptop can be charged using a USB Type-C PD power supply connected to the Thunderbolt 4 port. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Disconnect any charger from the DUT. Connect the charger plug to the docking station. Open PowerShell and and run the following command: Get-WmiObject win32_battery Expected result If BatteryStatus is equal 2, that means laptop is charged properly. Example part of output: BatteryStatus : 2","title":"UTC003.002 USB Type-C PD laptop charging (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc004001-usb-type-c-display-output-ubuntu-2204","text":"Test description This test verifies that DUT output video to a display connected via the Thunderbolt 4 USB Type-C port. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect a display to the Thunderbolt 4 USB Type-C port using a USB Type-C hub Open the Settings application and select the Displays panel in the left menu. Verify that the attached external monitor can be selected. Select and enable the monitor. Expected result The monitor connected to the laptop via the Thunderbolt 4 port should power on and display video from the laptop.","title":"UTC004.001 USB Type-C Display output (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc004002-usb-type-c-display-output-windows-11","text":"Test description This test verifies that DUT output video to a display connected via the Thunderbolt 4 USB Type-C port. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect a display to the Thunderbolt 4 USB Type-C port using a USB Type-C hub. Right click on the desktop to open the desktop context menu. Select Display Settings to open the display settings window. Verify that the attached external monitor can be selected. Select and enable the monitor. Expected result The monitor connected to the laptop via the Thunderbolt 4 port should power on and display video from the laptop.","title":"UTC004.002 USB Type-C Display output (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc005001-usb-type-c-docking-station-hdmi-display-ubuntu-2204","text":"Test description This test aims to verify that the display connected with the HDMI cable to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect an HDMI cable to the docking station and a display. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. If using more than one display, switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the external HDMI-connected display in Mirror and Join Displays modes.","title":"UTC005.001 USB Type-C docking station HDMI display (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc005002-usb-type-c-docking-station-hdmi-display-windows-11","text":"Test description This test aims to verify that the display connected with the HDMI cable to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect an HDMI cable to the docking station and a display. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the external HDMI-connected display in Duplicate and Extend modes.","title":"UTC005.002 USB Type-C docking station HDMI display (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc006001-usb-type-c-docking-station-dp-display-ubuntu-2204","text":"Test description This test aims to verify that the display connected with the HDMI cable to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect a Display Port cable to the docking station and a display. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. If using more than one display, switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the external DisplayPort-connected display in Mirror and Join Displays modes.","title":"UTC006.001 USB Type-C docking station DP display (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc006002-usb-type-c-docking-station-dp-display-windows-11","text":"Test description This test aims to verify that the display connected with the DisplayPort cable to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect a DisplayPort cable to the docking station and a display. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the external DisplayPort-connected display in Duplicate and Extend modes.","title":"UTC006.002 USB Type-C docking station DP display (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc007001-usb-type-c-docking-station-triple-display-ubuntu-2204","text":"Test description This test aims to verify that the three display simultaneously connected to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Connect three displays using HDMI/DisplayPort cables, depending on the specifications of the docking station. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Switch the display mode between Mirror and Join Displays . Expected result The image should be displayed on the three external displays in Mirror and Join Displays modes.","title":"UTC007.001 USB Type-C docking station Triple display (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc007002-usb-type-c-docking-station-triple-display-windows-11","text":"Test description This test aims to verify that the three display simultaneously connected to the docking station is correctly recognized by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Connect three displays using HDMI/DisplayPort cables, depending on the specifications of the docking station. The USB-C docking station connected to the USB-C port. If the docking station is not directly connected to the DUT, but with a USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with 5A current capability. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. If using more than one display, switch the display mode between Duplicate and Extend . Expected result The image should be displayed on the three external displays in Duplicate and Extend modes.","title":"UTC007.002 USB Type-C docking station Triple display (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc008001-usb-type-c-docking-station-detection-after-coldboot-ubuntu-2204","text":"Test description This test aims to verify that the DUT properly detects the docking station after coldboot (realized by power supply cutting off then restoring back). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result After lsusb command the docking station entries should be displayed, but output can be different depending on the model of the docking station. Example entries signifing the docking station: Bus 002 Device 010 : Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter Bus 002 Device 009 : Prolific Technology, Inc. USB SD Card Reader Bus 002 Device 008 : VIA Labs, Inc. USB3.0 Hub","title":"UTC008.001 USB Type-C docking station detection after coldboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc009001-usb-type-c-docking-station-detection-after-warmboot-ubuntu-2204","text":"Test description This test aims to verify that the DUT properly detects the docking station after warmboot (realized by device turning off then turning on). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result After lsusb command the docking station entries should be displayed, but output can be different depending on the model of the docking station. Example entries signifing the docking station: Bus 002 Device 010 : Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter Bus 002 Device 009 : Prolific Technology, Inc. USB SD Card Reader Bus 002 Device 008 : VIA Labs, Inc. USB3.0 Hub","title":"UTC009.001 USB Type-C docking station detection after warmboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc010001-usb-type-c-docking-station-detection-after-reboot-ubuntu-2204","text":"Test description This test aims to verify that the DUT properly detects the docking station after system reboot (performed by relevant command). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result After lsusb command the docking station entries should be displayed, but output can be different depending on the model of the docking station. Example entries signifing the docking station: Bus 002 Device 010 : Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter Bus 002 Device 009 : Prolific Technology, Inc. USB SD Card Reader Bus 002 Device 008 : VIA Labs, Inc. USB3.0 Hub","title":"UTC010.001 USB Type-C docking station detection after reboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc011001-usb-type-c-docking-station-usb-devices-recognition-firmware","text":"Test description This test aims to verify that the external USB devices connected to the docking station are recognized correctly by the FIRMWARE . Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The USB storage connected to the USB-C docking station . Test steps Power on the DUT. Hold the BIOS_MENU_KEY to enter the BIOS Menu. Check if the USB storage is available on the list. Expected result The USB storage is available which confirms successful recognition.","title":"UTC011.001 USB Type-C docking station USB devices recognition (firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc011002-usb-type-c-docking-station-usb-devices-recognition-ubuntu-2204","text":"Test description This test aims to verify that the external USB devices connected to the docking station are recognized correctly by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The USB storage connected to the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: watch -n1 lsusb Connect(or Disconnect) external USB devices to the USB ports on the docking station and note the result. Expected result After each device is connected to the USB port, a new USB device entry in lsusb command output should appear. After each device is disconnected from the USB port, a USB device entry in lsusb command output should disappear.","title":"UTC011.002 USB Type-C docking station USB devices recognition (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc011003-usb-type-c-docking-station-usb-devices-recognition-windows-11","text":"Test description This test aims to verify that the external USB devices connected to the docking station are recognized correctly by the OPERATING_SYSTEM . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The USB storage connected to the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and and run the following command: Get-PnpDevice -PresentOnly | Where-Object { $_ . InstanceId -match '^USB' } Note the results. Expected result After executing the command, a list containing all USB devices should be displayed. The list should contain the USB storage , which is plug in. Example output: ```bash Status Class FriendlyName ------ ----- ------------ OK DiskDrive Mass Storage Device USB Device OK USB Generic USB Hub OK HIDClass USB Input Device OK Bluetooth Intel(R) Wireless Bluetooth(R) OK DiskDrive USB SanDisk 3.2Gen1 USB Device OK USB USB Root Hub (USB 3.0) OK Net TP-LINK Gigabit Ethernet USB Adapter OK USB Generic USB Hub OK USB USB Mass Storage Device ```","title":"UTC011.003 USB Type-C docking station USB devices recognition (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc012001-usb-type-c-docking-station-usb-keyboard-firmware","text":"Test description This test aims to verify that the external USB keyboard connected to the docking station is detected correctly by the FIRMWARE and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The external USB keyboard connected to the docking station. Test steps Power on the DUT Hold the BIOS_MENU_KEY to enter the Bios Menu. Use the arrow keys, Esc key and the Enter key to navigate the menus. Expected result All menus can be entered using the external USB keyboard.","title":"UTC012.001 USB Type-C docking station USB keyboard (firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc012002-usb-type-c-docking-station-usb-keyboard-ubuntu-2204","text":"Test description This test aims to verify that the external USB keyboard connected to the docking station is detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the libinput-tools package: sudo apt install libinput-tools . The USB-C docking station connected to the USB-C port. The external USB keyboard connected to the docking station. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Run the following command in the terminal: libinput debug-events --show-keycodes Test the alphanumeric keys and note the generated keycodes. Test non-alphanumeric keys and verify that they generate the correct keycodes. Test key combinations with the Shift , Ctrl and Alt modifier keys (this tests 2-key rollover). Expected result The external USB keyboard is detected in OS. All standard keyboard keys generate the correct keycodes and events as per their labels. Key combinations are detected correctly.","title":"UTC012.002 USB Type-C docking station USB keyboard (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc012003-usb-type-c-docking-station-usb-keyboard-windows-11","text":"Test description This test aims to verify that the external USB keyboard is detected correctly by the OPERATING_SYSTEM and all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The external USB keyboard connected to the docking station. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and and run the following command: Get-CimInstance win32_KEYBOARD Note the results. Open notepad . Test the alphanumeric keys and note the generated characters. Test non-alphanumeric keys and verify that they generate the signs. Test key combinations with the Shift , and Alt modifier keys. Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. Check if On-Screen Keyboard correctly highlights it. Open Start menu and press Esc . Check if Start menu is properly closed. Expected result After running the PowerShell command information about connected keyboards should be displayed. One of keyboard should have identical part of output: Description : USB Input Device All standard keyboard keys generate correct characters or actions when pressed. Key combinations are detected correctly.","title":"UTC012.003 USB Type-C docking station USB keyboard (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc013001-usb-type-c-docking-station-upload-1gb-file-on-usb-storage-ubuntu-2204","text":"Test description This test aims to verify that the 1GB file can be transferred from the OPERATING_SYSTEM to the USB storage connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The USB storage connected to the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command to generate 1GB file: openssl rand -out test_file.txt -base64 $(( 2 ** 30 * 3 / 4 )) Read the path to the USB storage by running the following command: lsblk Copy the generated file to the USB storage by running the following command: cp test_file.txt { path_to_usb_storage } Verify that the files are the same by running the following command: sha256sum test_file.txt { path_to_usb_storage } /test_file.txt Expected result The output from the last command should contain 2 identical checksums: f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb test_file.txt f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb { path_to_usb_storage } /test_file.txt","title":"UTC013.001 USB Type-C docking station upload 1GB file on USB storage (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc013002-usb-type-c-docking-station-upload-1gb-file-on-usb-storagewindows-11","text":"Test description This test aims to verify that the 1GB file can be transferred from the OPERATING_SYSTEM to the USB storage connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The USB storage connected to the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open powershell as administrator and run the following command to generate 1GB file: fsutil file createnew test_file . txt 1073741824 Read the drive letter assigned to the USB storage by running the following command: ( Get-Volume | where drivetype -eq removable ). driveletter Copy the generated file to the USB storage by running the following command: Copy-Item -Path C :\\ Windows \\ system32 \\ test_file . txt { drive_letter }: Verify that the files are the same by running the following commands: Get-FileHash test_file . txt Get-FileHash { drive_letter }:\\ test_file . txt Expected result The output from the last commands should have equal hash: Algorithm Hash Path --------- ---- ---- SHA256 F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB C \\ Windows \\ system3 ... Algorithm Hash Path --------- ---- ---- SHA256 F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB E :\\ test_file . txt","title":"UTC013.002 USB Type-C docking station upload 1GB file on USB storage(Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc014001-usb-type-c-docking-station-ethernet-connection-ubuntu-2204","text":"Test description This test aims to verify that the connection to internet via docking station's Ethernet port can be obtained on Ubuntu 22.04. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to docking station. Wait for internet connection to initialize. Ping 3mdeb.com using command in terminal: ping 3mdeb.com Expected result Command should return ping info: PING 3mdeb.com ( 178 .32.205.96 ) 56 ( 84 ) bytes of data. 64 bytes from cluster026.hosting.ovh.net ( 178 .32.205.96 ) : icmp_seq = 1 ttl = 50 time = 44 .3 ms 64 bytes from cluster026.hosting.ovh.net ( 178 .32.205.96 ) : icmp_seq = 2 ttl = 50 time = 47 .7 ms 64 bytes from cluster026.hosting.ovh.net ( 178 .32.205.96 ) : icmp_seq = 3 ttl = 50 time = 41 .1 ms ... Log should not contain phrase information that host is unreachable. Failed ping for Ubuntu 22.04: ping: connect: Network is unreachable","title":"UTC014.001 USB Type-C docking station Ethernet connection (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc014002-usb-type-c-docking-station-ethernet-connection-windows-11","text":"Test description This test aims to verify that the connection to internet via docking station's Ethernet port can be obtained on Windows 11. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to docking station. Wait for internet connection to initialize. Ping 3mdeb.com using command in PowerShell: ping 3mdeb . com Expected result Command should return ping info: Pinging 3mdeb . com [ 178 . 32 . 205 . 96 ] with 32 bytes of data : Reply from 178 . 32 . 205 . 96 : bytes = 32 time = 50ms TTL = 50 Reply from 178 . 32 . 205 . 96 : bytes = 32 time = 47ms TTL = 50 Reply from 178 . 32 . 205 . 96 : bytes = 32 time = 46ms TTL = 50 Log should not contain phrase information that host is unreachable. Failed ping for Windows 11: Ping request could not find host 3mdeb . com . Please check the name and try again .","title":"UTC014.002 USB Type-C docking station Ethernet connection (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc015001-usb-type-c-docking-station-audio-recognition-ubuntu-2204","text":"Test description This test aims to verify that the external headset is properly recognized after plugging in the 3.5 mm jack into the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station. When the Select Audio Device menu appears, select what type of external device has been connected to the laptop (headset). Open a terminal window and run the following command: watch -n1 lsusb Connect(or Disconnect) external headset to the 3.5 mm jack on the docking station and note the result. Expected result After connecting the external headset to the 3.5 mm jack, a new entry in lsusb command output should appear. After disconnecting the external headset from the 3.5 mm jack, a headset entry in lsusb command output should disappear.","title":"UTC015.001 USB Type-C docking station audio recognition (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc015002-usb-type-c-docking-station-audio-recognition-windows-11","text":"Test description This test aims to verify that the external headset is properly recognized after plugging in the 3.5 mm jack into the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station After the Which device did you plug in menu appearing, select what type of external device has been connected to the laptop (headset). Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Connect(or Disconnect) external headset to the 3.5 mm jack on the docking station and note the result. Expected result After connecting the external headset to the 3.5 mm jack, new entries regarding the connected headphones should appear in the Output devices and Input devices sections. After disconnecting the external headset from the 3.5 mm jack, the entries for connected headset should disappear from the Output devices and Input devices sections.","title":"UTC015.002 USB Type-C docking station audio recognition (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc016001-usb-type-c-docking-station-audio-playback-ubuntu-2204","text":"Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external headset speakers connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station. When the Select Audio Device menu appears, select what type of external device has been connected to the laptop (headset). Open a terminal window and execute the following command: pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo 0 pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535 speaker-test Expected result Sound should be played from the external speakers.","title":"UTC016.001 USB Type-C docking station audio playback (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc016002-usb-type-c-docking-station-audio-playback-windows-11","text":"Test description This test aims to verify that the audio subsystem is able to playback audio recordings by using the external headset speakers connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station. Find the Speakers icon in the bottom right part of the screen and click it using the left mouse button to open volume menu. After the Which device did you plug in menu appearing, select what type of external device has been connected to the laptop (headset). In the volume menu, click the rightmost part of it and note the reult. Expected result Sound should be played from the external speakers.","title":"UTC016.002 USB Type-C docking station audio playback (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc017001-usb-type-c-docking-station-audio-capture-ubuntu-2204","text":"Test description This test aims to verify that the audio subsystem is able to capture audio from external headset connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station. When the Select Audio Device menu appears, select what type of external device has been connected to the laptop (headset). Open a terminal window and execute the following command: arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic.wav Make some noise for the headset. For example, say something. Execute the following command: aplay /tmp/test-mic.wav Expected result The recorded audio clip is recorded correctly and played back.","title":"UTC017.001 USB Type-C docking station audio capture (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc017002-usb-type-c-docking-station-audio-capture-windows-11","text":"Test description This test aims to verify that the audio subsystem is able to capture audio from external headset connected to the docking station. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a headset jack into the docking station. After the Which device did you plug in menu appearing, select what type of external device has been connected to the laptop (headset). Find the Speakers icon in the bottom right part of the screen and click it using the right mouse button then using the left mouse button click Sound Settings . Locate the All sound device bar and click on it. Select the Microphone position in the Input devices section. Click on the Start Test bar in the Input settings section. Create some noise for the DUT to capture and note the result. For example, say something. Click on the Stop Test bar. Expected result The Input volume bar located in the Input settings section should raise when some noise is being created. The result of the test after clicking the Stop Test bar should be more than 0% of the total volume.","title":"UTC017.002 USB Type-C docking station audio capture (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc018001-usb-type-c-docking-station-sd-card-reader-detection-ubuntu-2204","text":"Test description This test aims to verify that the SD Card reader built into the docking station is enumerated correctly and might be detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The SD card put into the slot on the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: lsusb | grep \"Card Reader\" Note the result. Expected result The output from the command should contain information about the connected USB SD Card Reader. Example output: Bus 002 Device 007 : ID 067b:2733 Prolific Technology, Inc. USB SD Card Reader","title":"UTC018.001 USB Type-C docking station SD Card reader detection (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc018002-usb-type-c-docking-station-sd-card-reader-detection-windows-11","text":"Test description This test aims to verify that the SD Card reader built into the docking station is enumerated correctly and can be detected by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The SD card put into the slot on the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and execute the following command: Get-PnpDevice -Status \"OK\" -Class \"DiskDrive\" Note the result. Expected result The output from the command should contain information about the connected USB SD Card Reader. Example output: OK DiskDrive SD Card Reader USB Device","title":"UTC018.002 USB Type-C docking station SD Card reader detection (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc019001-usb-type-c-docking-station-sd-card-readwrite-ubuntu-2204","text":"Test description This test aims to verify that the SD Card reader is initialized correctly and can be used from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The SD card put into the slot on the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands to identify the SD card mounting point: lsblk | grep \"sd\" Execute the following commands for generating, copying and comparing generated file: dd if = /dev/urandom of = /tmp/in.bin bs = 4K count = 100 dd if = /tmp/in.bin of = /dev/sda bs = 4K count = 100 dd if = /dev/sda of = /tmp/out.bin bs = 4K count = 100 sha256sum /tmp/in.bin /tmp/out.bin Note the result. Expected result The output from the command to identify the SD card mounting point should return information about the SD card mounting location. Example output: sda 8 :0 1 29 ,5G 0 disk \u2514\u2500sda1 8 :1 1 29 ,5G 0 part /media/user/DCB0-C7E8 sdb 8 :16 1 0B 0 disk The output from the last command should contain 2 identical checksums. Example output 2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb /tmp/in.bin 2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb /tmp/out.bin","title":"UTC019.001 USB Type-C docking station SD Card read/write (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31H-usb-type-c/#utc019002-usb-type-c-docking-station-sd-card-readwrite-windows-11","text":"Test description This test aims to verify that the SD Card reader is initialized correctly and can be used from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. The USB-C docking station connected to the USB-C port. The SD card put into the slot on the USB-C docking station . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Determine the localization of the mounted SD card. Open PowerShell and execute the following commands: New-Item -Path \"${drive_location}:\\\" -Name \"testfile.txt\" -ItemType \"file\" -Value \"This is a test string.\" Get-Content -Path \"${drive_location}:\\testfile.txt\" Note the result. Expected result The last command should return the following message: This is a test string.","title":"UTC019.002 USB Type-C docking station SD Card read/write (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31I-nvme-switching/","text":"Dasharo Compatibility: M.2 automatic SATA/NVMe switching support MSS001.001 M.2 automatic SATA/NVMe switching support (Ubuntu 22.04) Test description This test aims to verify detection of the NVMe and SATA disk in M.2 hybrid slot via the Operating System slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Insert an NVMe disk into the M.2 slot on the DUT. Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute sudo parted -l . Check if the connected disk is present on the list. Power off the DUT. Replace the NVMe disk with SATA M.2 disk. Repeat steps 1-5. Expected result The NVMe M.2 disk is detected in OS: Model: SAMSUNG MZVLB256HBHQ-00000 ( nvme ) Disk /dev/nvme0n1: 256GB Sector size ( logical/physical ) : 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB 2 2097kB 540MB 538MB fat32 EFI System Partition boot, esp 3 540MB 67 ,6GB 67 ,1GB ext4 6 67 ,6GB 126GB 57 ,9GB ext4 4 126GB 193GB 67 ,7GB ext4 5 193GB 256GB 62 ,9GB ext4 The SATA M.2 disk is detected in OS: Model: ATA Hoodisk SSD ( scsi ) Disk /dev/sda: 32 ,0GB Sector size ( logical/physical ) : 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 538MB 537MB fat32 EFI System Partition boot, esp 2 538MB 32 ,0GB 31 ,5GB ext4","title":"M.2 automatic SATA/NVMe switching support"},{"location":"unified-test-documentation/dasharo-compatibility/31I-nvme-switching/#dasharo-compatibility-m2-automatic-satanvme-switching-support","text":"","title":"Dasharo Compatibility: M.2 automatic SATA/NVMe switching support"},{"location":"unified-test-documentation/dasharo-compatibility/31I-nvme-switching/#mss001001-m2-automatic-satanvme-switching-support-ubuntu-2204","text":"Test description This test aims to verify detection of the NVMe and SATA disk in M.2 hybrid slot via the Operating System slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Insert an NVMe disk into the M.2 slot on the DUT. Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute sudo parted -l . Check if the connected disk is present on the list. Power off the DUT. Replace the NVMe disk with SATA M.2 disk. Repeat steps 1-5. Expected result The NVMe M.2 disk is detected in OS: Model: SAMSUNG MZVLB256HBHQ-00000 ( nvme ) Disk /dev/nvme0n1: 256GB Sector size ( logical/physical ) : 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 2097kB 1049kB 2 2097kB 540MB 538MB fat32 EFI System Partition boot, esp 3 540MB 67 ,6GB 67 ,1GB ext4 6 67 ,6GB 126GB 57 ,9GB ext4 4 126GB 193GB 67 ,7GB ext4 5 193GB 256GB 62 ,9GB ext4 The SATA M.2 disk is detected in OS: Model: ATA Hoodisk SSD ( scsi ) Disk /dev/sda: 32 ,0GB Sector size ( logical/physical ) : 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 538MB 537MB fat32 EFI System Partition boot, esp 2 538MB 32 ,0GB 31 ,5GB ext4","title":"MSS001.001 M.2 automatic SATA/NVMe switching support (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31J-sleep-mode/","text":"Dasharo Compatibility: Sleep mode Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . SLM001.001 Sleep mode - battery monitoring (Ubuntu 22.04) Test description This test verifies how quickly the battery discharges while in sleep mode in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Charge the battery fully (note: due to the manufacturer's settings the maximum battery charge level is limited to 90%; also, the battery charging process can only be started if the current battery level is less than 80%). Disconnect the power supply. Close the lid. Wake up the DUT in the following timestamps and note the battery level: 1 hour from fully charging, 2 hours from fully charging, 3 hours from fully charging, 6 hours from fully charging, (optional) 24 hours from fully charging. Expected result The battery should discharge at a similar rate as in the table below (take the battery wear into account). Time Battery level 0h 90% 1h 88% 2h 86% 3h 84% 6h 80% 24h (optional) 57% SLM000.002 Sleep mode - battery monitoring (Windows 11) Test description This test verifies how quickly the battery discharges while in sleep mode in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Charge the battery fully (note: due to the manufacturer's settings the maximum battery charge level is limited to 90%; also, the battery charging process can only be started if the current battery level is less than 80%). Wait 30 seconds for the system to load fully. Disconnect the power supply. Close the lid. Wake up the DUT in the following timestamps and note the battery level: 1 hour from fully charging, 2 hours from fully charging, 3 hours from fully charging, 6 hours from fully charging, Expected result The battery should discharge at a similar rate as in the table below (take the battery wear into account). Time Battery level 0h 90% 1h 79% 2h 69% 3h 58% 6h 26%","title":"Sleep mode"},{"location":"unified-test-documentation/dasharo-compatibility/31J-sleep-mode/#dasharo-compatibility-sleep-mode","text":"","title":"Dasharo Compatibility: Sleep mode"},{"location":"unified-test-documentation/dasharo-compatibility/31J-sleep-mode/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31J-sleep-mode/#slm001001-sleep-mode-battery-monitoring-ubuntu-2204","text":"Test description This test verifies how quickly the battery discharges while in sleep mode in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Charge the battery fully (note: due to the manufacturer's settings the maximum battery charge level is limited to 90%; also, the battery charging process can only be started if the current battery level is less than 80%). Disconnect the power supply. Close the lid. Wake up the DUT in the following timestamps and note the battery level: 1 hour from fully charging, 2 hours from fully charging, 3 hours from fully charging, 6 hours from fully charging, (optional) 24 hours from fully charging. Expected result The battery should discharge at a similar rate as in the table below (take the battery wear into account). Time Battery level 0h 90% 1h 88% 2h 86% 3h 84% 6h 80% 24h (optional) 57%","title":"SLM001.001 Sleep mode - battery monitoring (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31J-sleep-mode/#slm000002-sleep-mode-battery-monitoring-windows-11","text":"Test description This test verifies how quickly the battery discharges while in sleep mode in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Charge the battery fully (note: due to the manufacturer's settings the maximum battery charge level is limited to 90%; also, the battery charging process can only be started if the current battery level is less than 80%). Wait 30 seconds for the system to load fully. Disconnect the power supply. Close the lid. Wake up the DUT in the following timestamps and note the battery level: 1 hour from fully charging, 2 hours from fully charging, 3 hours from fully charging, 6 hours from fully charging, Expected result The battery should discharge at a similar rate as in the table below (take the battery wear into account). Time Battery level 0h 90% 1h 79% 2h 69% 3h 58% 6h 26%","title":"SLM000.002 Sleep mode - battery monitoring (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/","text":"Dasharo Compatibility: miniPCIe slot verification Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . MWL001.001 Wireless card detection (Ubuntu 22.04) Test description This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: lspci | grep \"Network controller\" Expected result The output of the command should contain information about mounted on the board network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a ) MWL001.002 Wireless card detection (Windows 11) Test description This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and execute following command: Get-PnpDevice -PresentOnly | Select-String -Pattern \"Wi-Fi\" Note the result. Expected result The output of the command should contain information about mounted on the board network controller. Example output: Intel ( R ) Wi-Fi 6AX200 160MHz MWL002.001 Wi-Fi scanning (Ubuntu 22.04) Test description This test aims to verify that the Wi-Fi functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Make sure to have any Wi-Fi signal available. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands as root: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of the last command should return a list of available Wi-Fi networks, for example: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2 MWL002.002 Wi-Fi scanning (Windows 11) Test description This test aims to verify that the Wi-Fi functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Make sure to have any Wi-Fi signal available Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and execute following command: netsh wlan show network Note the result. Expected result Output should contain 3mdeb_abr and/or 3mdeb_abr_5GHz . Example output: SSID 1 : 3mdeb_abr Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 2 : Sonoff1 192 . 168 . 4 . 208 Hotspot Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 3 : Orange_Swiatlowod_F1A0 Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 4 : Sonoff1 Fallback Hotspot Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 5 : DIRECT-KRM288x Series Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP MWL003.001 Bluetooth scanning (Ubuntu 22.04) Test description This test aims to verify that the Bluetooth functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Enable Bluetooth and make it discoverable in any device nearby DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands: bluetoothctl power on scan on # Wait ~5 seconds devices Expected result The output of the last command should return a list of detectable Bluetooth devices, for example: Device XX:XX:XX:XX:XX:XX Device 1 Device XX:XX:XX:XX:XX:XX Wojtek N Device XX:XX:XX:XX:XX:XX Mi Smart Band 4 Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic ( PHLM ) Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic ( PHLM ) Device XX:XX:XX:XX:XX:XX Device 2 Device XX:XX:XX:XX:XX:XX [ Signage ] Samsung QMR Series Device XX:XX:XX:XX:XX:XX [ Signage ] Samsung QMR Series Device XX:XX:XX:XX:XX:XX Device 3 Device XX:XX:XX:XX:XX:XX Device 4 Device XX:XX:XX:XX:XX:XX Device 5 Device XX:XX:XX:XX:XX:XX Device 6 MWL003.002 Bluetooth scanning (Windows 11) Test description This test aims to verify that the Bluetooth functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Enable Bluetooth and make it discoverable in any device nearby DUT Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Enter Notification Center in the bottom right part of the screen. Using right mouse button click on the Bluetooth icon. In shown drop-down menu click Go to settings . Click the + icon described as Add Bluetooth or other device . In the Add a device menu click Bluetooth . Wait a few moments until DUT scans for nearby Bluetooth devices and note the result. Expected result Available Bluetooth devices should appear in the Add a device window. MWL004.001 LTE card detection (Ubuntu 22.04) Test description This test aims to verify that the LTE card is detected correctly in the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Plug the LTE card into miniPCIe slot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute lsusb Expected result The output of the command should return a list of USB devices including LTE module, for example: Bus 001 Device 004 : ID 05c6:9215 Qualcomm, Inc. Quectel EC20 LTE modem","title":"miniPCIe slot verification"},{"location":"unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/#dasharo-compatibility-minipcie-slot-verification","text":"","title":"Dasharo Compatibility: miniPCIe slot verification"},{"location":"unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/#mwl001001-wireless-card-detection-ubuntu-2204","text":"Test description This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: lspci | grep \"Network controller\" Expected result The output of the command should contain information about mounted on the board network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a )","title":"MWL001.001 Wireless card detection (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/#mwl001002-wireless-card-detection-windows-11","text":"Test description This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and execute following command: Get-PnpDevice -PresentOnly | Select-String -Pattern \"Wi-Fi\" Note the result. Expected result The output of the command should contain information about mounted on the board network controller. Example output: Intel ( R ) Wi-Fi 6AX200 160MHz","title":"MWL001.002 Wireless card detection (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/#mwl002001-wi-fi-scanning-ubuntu-2204","text":"Test description This test aims to verify that the Wi-Fi functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Make sure to have any Wi-Fi signal available. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands as root: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of the last command should return a list of available Wi-Fi networks, for example: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2","title":"MWL002.001 Wi-Fi scanning (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/#mwl002002-wi-fi-scanning-windows-11","text":"Test description This test aims to verify that the Wi-Fi functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Make sure to have any Wi-Fi signal available Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open PowerShell and execute following command: netsh wlan show network Note the result. Expected result Output should contain 3mdeb_abr and/or 3mdeb_abr_5GHz . Example output: SSID 1 : 3mdeb_abr Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 2 : Sonoff1 192 . 168 . 4 . 208 Hotspot Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 3 : Orange_Swiatlowod_F1A0 Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 4 : Sonoff1 Fallback Hotspot Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP SSID 5 : DIRECT-KRM288x Series Network type : Infrastructure Authentication : WPA2-Personal Encryption : CCMP","title":"MWL002.002 Wi-Fi scanning (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/#mwl003001-bluetooth-scanning-ubuntu-2204","text":"Test description This test aims to verify that the Bluetooth functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Enable Bluetooth and make it discoverable in any device nearby DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following commands: bluetoothctl power on scan on # Wait ~5 seconds devices Expected result The output of the last command should return a list of detectable Bluetooth devices, for example: Device XX:XX:XX:XX:XX:XX Device 1 Device XX:XX:XX:XX:XX:XX Wojtek N Device XX:XX:XX:XX:XX:XX Mi Smart Band 4 Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic ( PHLM ) Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic ( PHLM ) Device XX:XX:XX:XX:XX:XX Device 2 Device XX:XX:XX:XX:XX:XX [ Signage ] Samsung QMR Series Device XX:XX:XX:XX:XX:XX [ Signage ] Samsung QMR Series Device XX:XX:XX:XX:XX:XX Device 3 Device XX:XX:XX:XX:XX:XX Device 4 Device XX:XX:XX:XX:XX:XX Device 5 Device XX:XX:XX:XX:XX:XX Device 6","title":"MWL003.001 Bluetooth scanning (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/#mwl003002-bluetooth-scanning-windows-11","text":"Test description This test aims to verify that the Bluetooth functionality of card is initialized correctly and can be used from within the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Enable Bluetooth and make it discoverable in any device nearby DUT Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Enter Notification Center in the bottom right part of the screen. Using right mouse button click on the Bluetooth icon. In shown drop-down menu click Go to settings . Click the + icon described as Add Bluetooth or other device . In the Add a device menu click Bluetooth . Wait a few moments until DUT scans for nearby Bluetooth devices and note the result. Expected result Available Bluetooth devices should appear in the Add a device window.","title":"MWL003.002 Bluetooth scanning (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/#mwl004001-lte-card-detection-ubuntu-2204","text":"Test description This test aims to verify that the LTE card is detected correctly in the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Plug the LTE card into miniPCIe slot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute lsusb Expected result The output of the command should return a list of USB devices including LTE module, for example: Bus 001 Device 004 : ID 05c6:9215 Qualcomm, Inc. Quectel EC20 LTE modem","title":"MWL004.001 LTE card detection (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/","text":"Dasharo compatibility: SMBIOS Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Install the dmidecode package: sudo apt-get install dmidecode . DMI001.001 Verify the serial number Test description This test aims to verify that the serial number field is filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t system In the BIOS Information section, check the Serial number field against the Dasharo SMBIOS guidelines . Expected result The fields should be filled in according to the Dasharo SMBIOS guidelines. DMI002.001 Verify the firmware version Test description This test aims to verify that the firmware version field is filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t bios In the BIOS Information section, check the Version field against the Dasharo SMBIOS guidelines . Expected result The fields should be filled in according to the Dasharo SMBIOS guidelines. DMI003.001 Verify the firmware product name Test description This test aims to verify that the firmware product name fields are filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t system In the System Information section, check the Product Name field against the Dasharo SMBIOS guidelines . Execute the following command in the terminal: dmidecode -t baseboard In the Base Board Information section, check the Product Name field against the Dasharo SMBIOS guidelines . Expected result The fields should be filled in according to the Dasharo SMBIOS guidelines. DMI004.001 Verify the firmware release date Test description This test aims to verify that the firmware release date field are filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t bios In the System Information section, check the Release Date field against the Dasharo SMBIOS guidelines . Expected result The field should be filled in according to the Dasharo SMBIOS guidelines. DMI005.001 Verify the firmware manufacturer Test description This test aims to verify that the firmware manufacturer fields are filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t system In the System Information section, check the Manufacturer field against the Dasharo SMBIOS guidelines . Execute the following command in the terminal: dmidecode -t baseboard In the Base Board Information section, check the Manufacturer field against the Dasharo SMBIOS guidelines . Expected result The fields should be filled in according to the Dasharo SMBIOS guidelines. DMI006.001 Verify the firmware vendor Test description This test aims to verify that the firmware vendor field is filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t bios In the BIOS Information section, check the Vendor field against the Dasharo SMBIOS guidelines . Expected result The field should be filled in according to the Dasharo SMBIOS guidelines. DMI007.001 Verify the firmware family Test description This test aims to verify that the firmware family field is filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t system In the System Information section, check the Family field against the Dasharo SMBIOS guidelines . Expected result The field should be filled in according to the Dasharo SMBIOS guidelines. DMI008.001 Verify the firmware type Test description This test aims to verify that the firmware type field is filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t chassis In the Chassis Information section, check the Type field against the Dasharo SMBIOS guidelines . Expected result The field should be filled in according to the Dasharo SMBIOS guidelines.","title":"SMBIOS"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/#dasharo-compatibility-smbios","text":"","title":"Dasharo compatibility: SMBIOS"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Install the dmidecode package: sudo apt-get install dmidecode .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/#dmi001001-verify-the-serial-number","text":"Test description This test aims to verify that the serial number field is filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t system In the BIOS Information section, check the Serial number field against the Dasharo SMBIOS guidelines . Expected result The fields should be filled in according to the Dasharo SMBIOS guidelines.","title":"DMI001.001 Verify the serial number"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/#dmi002001-verify-the-firmware-version","text":"Test description This test aims to verify that the firmware version field is filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t bios In the BIOS Information section, check the Version field against the Dasharo SMBIOS guidelines . Expected result The fields should be filled in according to the Dasharo SMBIOS guidelines.","title":"DMI002.001 Verify the firmware version"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/#dmi003001-verify-the-firmware-product-name","text":"Test description This test aims to verify that the firmware product name fields are filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t system In the System Information section, check the Product Name field against the Dasharo SMBIOS guidelines . Execute the following command in the terminal: dmidecode -t baseboard In the Base Board Information section, check the Product Name field against the Dasharo SMBIOS guidelines . Expected result The fields should be filled in according to the Dasharo SMBIOS guidelines.","title":"DMI003.001 Verify the firmware product name"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/#dmi004001-verify-the-firmware-release-date","text":"Test description This test aims to verify that the firmware release date field are filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t bios In the System Information section, check the Release Date field against the Dasharo SMBIOS guidelines . Expected result The field should be filled in according to the Dasharo SMBIOS guidelines.","title":"DMI004.001 Verify the firmware release date"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/#dmi005001-verify-the-firmware-manufacturer","text":"Test description This test aims to verify that the firmware manufacturer fields are filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t system In the System Information section, check the Manufacturer field against the Dasharo SMBIOS guidelines . Execute the following command in the terminal: dmidecode -t baseboard In the Base Board Information section, check the Manufacturer field against the Dasharo SMBIOS guidelines . Expected result The fields should be filled in according to the Dasharo SMBIOS guidelines.","title":"DMI005.001 Verify the firmware manufacturer"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/#dmi006001-verify-the-firmware-vendor","text":"Test description This test aims to verify that the firmware vendor field is filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t bios In the BIOS Information section, check the Vendor field against the Dasharo SMBIOS guidelines . Expected result The field should be filled in according to the Dasharo SMBIOS guidelines.","title":"DMI006.001 Verify the firmware vendor"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/#dmi007001-verify-the-firmware-family","text":"Test description This test aims to verify that the firmware family field is filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t system In the System Information section, check the Family field against the Dasharo SMBIOS guidelines . Expected result The field should be filled in according to the Dasharo SMBIOS guidelines.","title":"DMI007.001 Verify the firmware family"},{"location":"unified-test-documentation/dasharo-compatibility/31L-smbios/#dmi008001-verify-the-firmware-type","text":"Test description This test aims to verify that the firmware type field is filled in correctly according to the Dasharo SMBIOS guidelines . Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: dmidecode -t chassis In the Chassis Information section, check the Type field against the Dasharo SMBIOS guidelines . Expected result The field should be filled in according to the Dasharo SMBIOS guidelines.","title":"DMI008.001 Verify the firmware type"},{"location":"unified-test-documentation/dasharo-compatibility/31M-emmc-support/","text":"Dasharo Compatibility: eMMC support MMC001.001 eMMC support (Ubuntu 22.04) Test description This test aims to verify detection of the eMMC driver via the Operating System. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute sudo parted -l . Check if the eMMC is present on the list. Expected result The eMMC disk is detected in OS: Model: MMC 8GTF4R ( sd/mmc ) Disk /dev/mmcblk0: 7818MB Sector size ( logical/physical ) : 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 538MB 537MB primary fat32 2 538MB 1076MB 538MB primary fat32 boot, esp 3 1077MB 7817MB 6740MB extended 5 1077MB 7817MB 6740MB logical ext4","title":"eMMC support"},{"location":"unified-test-documentation/dasharo-compatibility/31M-emmc-support/#dasharo-compatibility-emmc-support","text":"","title":"Dasharo Compatibility: eMMC support"},{"location":"unified-test-documentation/dasharo-compatibility/31M-emmc-support/#mmc001001-emmc-support-ubuntu-2204","text":"Test description This test aims to verify detection of the eMMC driver via the Operating System. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute sudo parted -l . Check if the eMMC is present on the list. Expected result The eMMC disk is detected in OS: Model: MMC 8GTF4R ( sd/mmc ) Disk /dev/mmcblk0: 7818MB Sector size ( logical/physical ) : 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 538MB 537MB primary fat32 2 538MB 1076MB 538MB primary fat32 boot, esp 3 1077MB 7817MB 6740MB extended 5 1077MB 7817MB 6740MB logical ext4","title":"MMC001.001 eMMC support (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/","text":"Dasharo Compatibility: Platform suspend and resume Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . SUSP001.001 Platform suspend and resume (Ubuntu 22.04, wakeup flag) Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, the wakeup flag is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the pm-utils package: sudo apt-get install pm-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command to set the wakeup flag: rtcwake --mode no --seconds 60 Execute the following command to enter the DUT into sleep mode: pm-suspend Wait 60 seconds. Log into the system again. Execute the following command to get the results of suspend process: cat /var/log/pm-suspend.log | grep 'suspend suspend: ' Execute the following command to get the results of resume process: cat /var/log/pm-suspend.log | grep 'resume suspend: ' Note the results. Expected result After entering the second command the DUT should enter sleep mode. The DUT should automatically awaken after 60 seconds. The output of the third and fourth commands should contain information about suspend and resume procedure hooks' status. For none of them, an error message should be returned. Example output for the suspend process: /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success. /usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success. /usr/lib/pm-utils/sleep.d/00logging suspend suspend: success. /usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success. /etc/pm/sleep.d/10_grub-common suspend suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success. /usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success. /usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success. /usr/lib/pm-utils/sleep.d/99video suspend suspend: success. Example output for the resume process: /usr/lib/pm-utils/sleep.d/99video resume suspend: success. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success. /usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success. /usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success. /usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/75modules resume suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success. /etc/pm/sleep.d/10_grub-common resume suspend: success. /usr/lib/pm-utils/sleep.d/00powersave resume suspend: success. /usr/lib/pm-utils/sleep.d/00logging resume suspend: success. /usr/lib/pm-utils/sleep.d/000record-status resume suspend: success. /usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success. SUSP001.003 Platform suspend and resume (QubesOS, wakeup flag) Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, the wakeup flag is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window in dom0 and execute the following command to set the wakeup flag: rtcwake --mode no --seconds 60 Execute the following command to enter the DUT into sleep mode: sudo systemctl suspend Wait 60 seconds. Log into the system again. Execute the following command to get the results of process: journalctl | grep systemd-sleep Note the results. Expected result After entering the sudo systemctl suspend command the DUT should enter sleep mode. The output of the second command should contain information about performed suspend and resume operations. Each suspend and resume of the system should be reported in the output of this command with the correct date, an example of reporting one suspend and resume operation: Feb 10 16 :38:55 dom0 systemd-sleep [ 14729 ] : Suspending system... Feb 10 16 :39:10 dom0 systemd-sleep [ 14729 ] : System resumed. SUSP002.001 Platform suspend and resume (Ubuntu 22.04, press key) Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, pressing any key on the keyboard is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the pm-utils package: sudo apt-get install pm-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command to enter DUT into sleep mode: pm-suspend Wait 15 seconds. Press any key on the keyboard to resume the system. Log into the system again. Execute the following command to get the results of suspend process: cat /var/log/pm-suspend.log | grep 'suspend suspend: ' Execute the following command to get the results of resume process: cat /var/log/pm-suspend.log | grep 'resume suspend: ' Note the results. Expected result After entering the first command the DUT should enter sleep mode. The output of the second and third commands should contain information about suspend and resume procedure hooks' status. For none of them, an error message should be returned. Example output for the suspend process: /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success. /usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success. /usr/lib/pm-utils/sleep.d/00logging suspend suspend: success. /usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success. /etc/pm/sleep.d/10_grub-common suspend suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success. /usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success. /usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success. /usr/lib/pm-utils/sleep.d/99video suspend suspend: success. Example output for the resume process: /usr/lib/pm-utils/sleep.d/99video resume suspend: success. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success. /usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success. /usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success. /usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/75modules resume suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success. /etc/pm/sleep.d/10_grub-common resume suspend: success. /usr/lib/pm-utils/sleep.d/00powersave resume suspend: success. /usr/lib/pm-utils/sleep.d/00logging resume suspend: success. /usr/lib/pm-utils/sleep.d/000record-status resume suspend: success. /usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success. SUSP002.003 Platform suspend and resume (QubesOS, press key) Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, pressing any key on the keyboard is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window in dom0 and execute the following command to enter the DUT into sleep mode: sudo systemctl suspend Wait 15 seconds. Press any key on the keyboard to resume the system. Log into the system again. Execute the following command to get the results of process: journalctl | grep systemd-sleep Note the results. Expected result After entering the first command the DUT should enter sleep mode. The output of the second command should contain information about performed suspend and resume operations. Each suspend and resume of the system should be reported in the output of this command with the correct date, an example of reporting one suspend and resume operation: Feb 10 16 :38:55 dom0 systemd-sleep [ 14729 ] : Suspending system... Feb 10 16 :39:10 dom0 systemd-sleep [ 14729 ] : System resumed. SUSP003.001 Platform suspend and resume (Ubuntu 22.04, push power button) Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, pushing the power button is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the pm-utils package: sudo apt-get install pm-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command to enter DUT into sleep mode: pm-suspend Wait 15 seconds. Push the power button to resume the system. Log into the system again. Execute the following command to get the results of suspend process: cat /var/log/pm-suspend.log | grep 'suspend suspend: ' Execute the following command to get the results of resume process: cat /var/log/pm-suspend.log | grep 'resume suspend: ' Note the results. Expected result After entering the first command the DUT should enter sleep mode. The output of the second and third commands should contain information about suspend and resume procedure hooks' status. For none of them, an error message should be returned. Example output for the suspend process: /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success. /usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success. /usr/lib/pm-utils/sleep.d/00logging suspend suspend: success. /usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success. /etc/pm/sleep.d/10_grub-common suspend suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success. /usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success. /usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success. /usr/lib/pm-utils/sleep.d/99video suspend suspend: success. Example output for the resume process: /usr/lib/pm-utils/sleep.d/99video resume suspend: success. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success. /usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success. /usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success. /usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/75modules resume suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success. /etc/pm/sleep.d/10_grub-common resume suspend: success. /usr/lib/pm-utils/sleep.d/00powersave resume suspend: success. /usr/lib/pm-utils/sleep.d/00logging resume suspend: success. /usr/lib/pm-utils/sleep.d/000record-status resume suspend: success. /usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success. SUSP003.003 Platform suspend and resume (QubesOS, push power button) Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, pushing the power button is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window in dom0 and execute the following command to enter the DUT into sleep mode: sudo systemctl suspend Wait 15 seconds. Push the power button to resume the system. Log into the system again. Execute the following command to get the results of process: journalctl | grep systemd-sleep Note the results. Expected result After entering the first command the DUT should enter sleep mode. The output of the second command should contain information about performed suspend and resume operations. Each suspend and resume of the system should be reported in the output of this command with the correct date, an example of reporting one suspend and resume operation: Feb 10 16 :38:55 dom0 systemd-sleep [ 14729 ] : Suspending system... Feb 10 16 :39:10 dom0 systemd-sleep [ 14729 ] : System resumed. SUSP004.001 Platform suspend and resume (Ubuntu 22.04, Wake-on-LAN) Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, the Wake-on-LAN mechanism is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the pm-utils package: sudo apt-get install pm-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command to obtain the device lowest MAC address: ip address Note, that the output of the above command might include information about all communication interfaces with their MAC addresses. In the Wake-on-LAN procedure, only the lowest MAC address of the active interface will be needed. Execute the following command to enter DUT into sleep mode: pm-suspend Wait 15 seconds. On another active machine execute the following command to send a magic pocket: wakeonlan Log into the system (on the DUT) again. Execute the following command to get the results of suspend process: cat /var/log/pm-suspend.log | grep 'suspend suspend: ' Execute the following command to get the results of resume process: cat /var/log/pm-suspend.log | grep 'resume suspend: ' Note the results. Expected result After entering the first command the DUT should enter sleep mode. The output of the second and third commands should contain information about suspend and resume procedure hooks' status. For none of them, an error message should be returned. Example output for the suspend process: /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success. /usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success. /usr/lib/pm-utils/sleep.d/00logging suspend suspend: success. /usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success. /etc/pm/sleep.d/10_grub-common suspend suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success. /usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success. /usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success. /usr/lib/pm-utils/sleep.d/99video suspend suspend: success. Example output for the resume process: /usr/lib/pm-utils/sleep.d/99video resume suspend: success. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success. /usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success. /usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success. /usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/75modules resume suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success. /etc/pm/sleep.d/10_grub-common resume suspend: success. /usr/lib/pm-utils/sleep.d/00powersave resume suspend: success. /usr/lib/pm-utils/sleep.d/00logging resume suspend: success. /usr/lib/pm-utils/sleep.d/000record-status resume suspend: success. /usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success. SUSP005.001 Cyclic platform suspend and resume (Ubuntu 22.04) Test description This test aims to verify that the DUT platform suspend and resume procedure performed cyclically works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the Firmware test suite package. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo fwts s3 --results-output = stderr Note: suspend test duration is set defaultly to 30 seconds. After that time the device should be woken up automatically. Log into the system again. Note the results. Repeat steps 4-6 to determine the stability of suspend and resume procedure. Expected result Each time, the suspend and resume procedure is performed, the output of the command should contain information about test results (section Test Failure Summary ). The test case passes only if after every iteration of the suspend and resume procedure the summary section shows that all minor tests included in s3 test have been passed. Example output for one iteration: Test Failure Summary ================================================================================ Critical failures: NONE High failures: NONE Medium failures: NONE Low failures: NONE Other failures: NONE Test | Pass | Fail | Abort | Warn | Skip | Info | ---------------+-----+-----+-----+-----+-----+-----+ s3 | 9 | | | | | | ---------------+-----+-----+-----+-----+-----+-----+ Total: | 9 | 0 | 0 | 0 | 0 | 0 | ---------------+-----+-----+-----+-----+-----+-----+","title":"Platform suspend and resume"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/#dasharo-compatibility-platform-suspend-and-resume","text":"","title":"Dasharo Compatibility: Platform suspend and resume"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/#susp001001-platform-suspend-and-resume-ubuntu-2204-wakeup-flag","text":"Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, the wakeup flag is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the pm-utils package: sudo apt-get install pm-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command to set the wakeup flag: rtcwake --mode no --seconds 60 Execute the following command to enter the DUT into sleep mode: pm-suspend Wait 60 seconds. Log into the system again. Execute the following command to get the results of suspend process: cat /var/log/pm-suspend.log | grep 'suspend suspend: ' Execute the following command to get the results of resume process: cat /var/log/pm-suspend.log | grep 'resume suspend: ' Note the results. Expected result After entering the second command the DUT should enter sleep mode. The DUT should automatically awaken after 60 seconds. The output of the third and fourth commands should contain information about suspend and resume procedure hooks' status. For none of them, an error message should be returned. Example output for the suspend process: /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success. /usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success. /usr/lib/pm-utils/sleep.d/00logging suspend suspend: success. /usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success. /etc/pm/sleep.d/10_grub-common suspend suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success. /usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success. /usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success. /usr/lib/pm-utils/sleep.d/99video suspend suspend: success. Example output for the resume process: /usr/lib/pm-utils/sleep.d/99video resume suspend: success. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success. /usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success. /usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success. /usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/75modules resume suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success. /etc/pm/sleep.d/10_grub-common resume suspend: success. /usr/lib/pm-utils/sleep.d/00powersave resume suspend: success. /usr/lib/pm-utils/sleep.d/00logging resume suspend: success. /usr/lib/pm-utils/sleep.d/000record-status resume suspend: success. /usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success.","title":"SUSP001.001 Platform suspend and resume (Ubuntu 22.04, wakeup flag)"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/#susp001003-platform-suspend-and-resume-qubesos-wakeup-flag","text":"Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, the wakeup flag is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window in dom0 and execute the following command to set the wakeup flag: rtcwake --mode no --seconds 60 Execute the following command to enter the DUT into sleep mode: sudo systemctl suspend Wait 60 seconds. Log into the system again. Execute the following command to get the results of process: journalctl | grep systemd-sleep Note the results. Expected result After entering the sudo systemctl suspend command the DUT should enter sleep mode. The output of the second command should contain information about performed suspend and resume operations. Each suspend and resume of the system should be reported in the output of this command with the correct date, an example of reporting one suspend and resume operation: Feb 10 16 :38:55 dom0 systemd-sleep [ 14729 ] : Suspending system... Feb 10 16 :39:10 dom0 systemd-sleep [ 14729 ] : System resumed.","title":"SUSP001.003 Platform suspend and resume (QubesOS, wakeup flag)"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/#susp002001-platform-suspend-and-resume-ubuntu-2204-press-key","text":"Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, pressing any key on the keyboard is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the pm-utils package: sudo apt-get install pm-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command to enter DUT into sleep mode: pm-suspend Wait 15 seconds. Press any key on the keyboard to resume the system. Log into the system again. Execute the following command to get the results of suspend process: cat /var/log/pm-suspend.log | grep 'suspend suspend: ' Execute the following command to get the results of resume process: cat /var/log/pm-suspend.log | grep 'resume suspend: ' Note the results. Expected result After entering the first command the DUT should enter sleep mode. The output of the second and third commands should contain information about suspend and resume procedure hooks' status. For none of them, an error message should be returned. Example output for the suspend process: /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success. /usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success. /usr/lib/pm-utils/sleep.d/00logging suspend suspend: success. /usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success. /etc/pm/sleep.d/10_grub-common suspend suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success. /usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success. /usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success. /usr/lib/pm-utils/sleep.d/99video suspend suspend: success. Example output for the resume process: /usr/lib/pm-utils/sleep.d/99video resume suspend: success. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success. /usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success. /usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success. /usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/75modules resume suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success. /etc/pm/sleep.d/10_grub-common resume suspend: success. /usr/lib/pm-utils/sleep.d/00powersave resume suspend: success. /usr/lib/pm-utils/sleep.d/00logging resume suspend: success. /usr/lib/pm-utils/sleep.d/000record-status resume suspend: success. /usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success.","title":"SUSP002.001 Platform suspend and resume (Ubuntu 22.04, press key)"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/#susp002003-platform-suspend-and-resume-qubesos-press-key","text":"Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, pressing any key on the keyboard is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window in dom0 and execute the following command to enter the DUT into sleep mode: sudo systemctl suspend Wait 15 seconds. Press any key on the keyboard to resume the system. Log into the system again. Execute the following command to get the results of process: journalctl | grep systemd-sleep Note the results. Expected result After entering the first command the DUT should enter sleep mode. The output of the second command should contain information about performed suspend and resume operations. Each suspend and resume of the system should be reported in the output of this command with the correct date, an example of reporting one suspend and resume operation: Feb 10 16 :38:55 dom0 systemd-sleep [ 14729 ] : Suspending system... Feb 10 16 :39:10 dom0 systemd-sleep [ 14729 ] : System resumed.","title":"SUSP002.003 Platform suspend and resume (QubesOS, press key)"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/#susp003001-platform-suspend-and-resume-ubuntu-2204-push-power-button","text":"Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, pushing the power button is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the pm-utils package: sudo apt-get install pm-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command to enter DUT into sleep mode: pm-suspend Wait 15 seconds. Push the power button to resume the system. Log into the system again. Execute the following command to get the results of suspend process: cat /var/log/pm-suspend.log | grep 'suspend suspend: ' Execute the following command to get the results of resume process: cat /var/log/pm-suspend.log | grep 'resume suspend: ' Note the results. Expected result After entering the first command the DUT should enter sleep mode. The output of the second and third commands should contain information about suspend and resume procedure hooks' status. For none of them, an error message should be returned. Example output for the suspend process: /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success. /usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success. /usr/lib/pm-utils/sleep.d/00logging suspend suspend: success. /usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success. /etc/pm/sleep.d/10_grub-common suspend suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success. /usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success. /usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success. /usr/lib/pm-utils/sleep.d/99video suspend suspend: success. Example output for the resume process: /usr/lib/pm-utils/sleep.d/99video resume suspend: success. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success. /usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success. /usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success. /usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/75modules resume suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success. /etc/pm/sleep.d/10_grub-common resume suspend: success. /usr/lib/pm-utils/sleep.d/00powersave resume suspend: success. /usr/lib/pm-utils/sleep.d/00logging resume suspend: success. /usr/lib/pm-utils/sleep.d/000record-status resume suspend: success. /usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success.","title":"SUSP003.001 Platform suspend and resume (Ubuntu 22.04, push power button)"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/#susp003003-platform-suspend-and-resume-qubesos-push-power-button","text":"Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, pushing the power button is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window in dom0 and execute the following command to enter the DUT into sleep mode: sudo systemctl suspend Wait 15 seconds. Push the power button to resume the system. Log into the system again. Execute the following command to get the results of process: journalctl | grep systemd-sleep Note the results. Expected result After entering the first command the DUT should enter sleep mode. The output of the second command should contain information about performed suspend and resume operations. Each suspend and resume of the system should be reported in the output of this command with the correct date, an example of reporting one suspend and resume operation: Feb 10 16 :38:55 dom0 systemd-sleep [ 14729 ] : Suspending system... Feb 10 16 :39:10 dom0 systemd-sleep [ 14729 ] : System resumed.","title":"SUSP003.003 Platform suspend and resume (QubesOS, push power button)"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/#susp004001-platform-suspend-and-resume-ubuntu-2204-wake-on-lan","text":"Test description This test aims to verify that the DUT platform suspend and resume functionality works correctly. As a way to wake up the device, the Wake-on-LAN mechanism is tested in this case. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the pm-utils package: sudo apt-get install pm-utils . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command to obtain the device lowest MAC address: ip address Note, that the output of the above command might include information about all communication interfaces with their MAC addresses. In the Wake-on-LAN procedure, only the lowest MAC address of the active interface will be needed. Execute the following command to enter DUT into sleep mode: pm-suspend Wait 15 seconds. On another active machine execute the following command to send a magic pocket: wakeonlan Log into the system (on the DUT) again. Execute the following command to get the results of suspend process: cat /var/log/pm-suspend.log | grep 'suspend suspend: ' Execute the following command to get the results of resume process: cat /var/log/pm-suspend.log | grep 'resume suspend: ' Note the results. Expected result After entering the first command the DUT should enter sleep mode. The output of the second and third commands should contain information about suspend and resume procedure hooks' status. For none of them, an error message should be returned. Example output for the suspend process: /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success. /usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success. /usr/lib/pm-utils/sleep.d/00logging suspend suspend: success. /usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success. /etc/pm/sleep.d/10_grub-common suspend suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success. /usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success. /usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success. /usr/lib/pm-utils/sleep.d/99video suspend suspend: success. Example output for the resume process: /usr/lib/pm-utils/sleep.d/99video resume suspend: success. /usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success. /usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success. /usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success. /usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable. /usr/lib/pm-utils/sleep.d/75modules resume suspend: success. /usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success. /usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success. /usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success. /etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success. /etc/pm/sleep.d/10_grub-common resume suspend: success. /usr/lib/pm-utils/sleep.d/00powersave resume suspend: success. /usr/lib/pm-utils/sleep.d/00logging resume suspend: success. /usr/lib/pm-utils/sleep.d/000record-status resume suspend: success. /usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success.","title":"SUSP004.001 Platform suspend and resume (Ubuntu 22.04, Wake-on-LAN)"},{"location":"unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/#susp005001-cyclic-platform-suspend-and-resume-ubuntu-2204","text":"Test description This test aims to verify that the DUT platform suspend and resume procedure performed cyclically works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the Firmware test suite package. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo fwts s3 --results-output = stderr Note: suspend test duration is set defaultly to 30 seconds. After that time the device should be woken up automatically. Log into the system again. Note the results. Repeat steps 4-6 to determine the stability of suspend and resume procedure. Expected result Each time, the suspend and resume procedure is performed, the output of the command should contain information about test results (section Test Failure Summary ). The test case passes only if after every iteration of the suspend and resume procedure the summary section shows that all minor tests included in s3 test have been passed. Example output for one iteration: Test Failure Summary ================================================================================ Critical failures: NONE High failures: NONE Medium failures: NONE Low failures: NONE Other failures: NONE Test | Pass | Fail | Abort | Warn | Skip | Info | ---------------+-----+-----+-----+-----+-----+-----+ s3 | 9 | | | | | | ---------------+-----+-----+-----+-----+-----+-----+ Total: | 9 | 0 | 0 | 0 | 0 | 0 | ---------------+-----+-----+-----+-----+-----+-----+","title":"SUSP005.001 Cyclic platform suspend and resume (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31N-usb-boot/","text":"Dasharo Compatibility: USB Boot UBT001.001 USB detect and boot after coldboot Test description This test aims to verify that the DUT properly detects USB device and boots into the operating system after coldboot (reboot realized by power supply cutting off then restoring back). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Cut the power off. Restore power to the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Select the proper number for USB_STICK option. Wait for Debian GNU/Linux . Expected result The Debian GNU/Linux is visible and confirms successful boot into OS after coldboot. UBT002.001 USB detect and boot after warmboot Test description This test aims to verify that the DUT properly detects USB device and boots into the operating system after warmboot (reboot realized by device turning off then turning on). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Select the proper number for USB_STICK option. Wait for Debian GNU/Linux . Expected result The Debian GNU/Linux is visible and confirms successful boot into OS after warmboot. UBT003.001 USB detect and boot after system reboot Test description This test aims to verify that the DUT properly detects USB device and boots into the operating system after system reboot (reboot performed by relevant command). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Select the proper number for USB_STICK option. Wait for Debian GNU/Linux . Wait for debian login: . Type the root login. Wait for Password: . Type the proper password. Wait for root@debian:~# . Execute reboot command. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Select the proper number for USB_STICK option. Wait for Debian GNU/Linux . Expected result The Debian GNU/Linux is visible and confirms successful boot into OS after system reboot.","title":"USB booting"},{"location":"unified-test-documentation/dasharo-compatibility/31N-usb-boot/#dasharo-compatibility-usb-boot","text":"","title":"Dasharo Compatibility: USB Boot"},{"location":"unified-test-documentation/dasharo-compatibility/31N-usb-boot/#ubt001001-usb-detect-and-boot-after-coldboot","text":"Test description This test aims to verify that the DUT properly detects USB device and boots into the operating system after coldboot (reboot realized by power supply cutting off then restoring back). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Cut the power off. Restore power to the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Select the proper number for USB_STICK option. Wait for Debian GNU/Linux . Expected result The Debian GNU/Linux is visible and confirms successful boot into OS after coldboot.","title":"UBT001.001 USB detect and boot after coldboot"},{"location":"unified-test-documentation/dasharo-compatibility/31N-usb-boot/#ubt002001-usb-detect-and-boot-after-warmboot","text":"Test description This test aims to verify that the DUT properly detects USB device and boots into the operating system after warmboot (reboot realized by device turning off then turning on). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Select the proper number for USB_STICK option. Wait for Debian GNU/Linux . Expected result The Debian GNU/Linux is visible and confirms successful boot into OS after warmboot.","title":"UBT002.001 USB detect and boot after warmboot"},{"location":"unified-test-documentation/dasharo-compatibility/31N-usb-boot/#ubt003001-usb-detect-and-boot-after-system-reboot","text":"Test description This test aims to verify that the DUT properly detects USB device and boots into the operating system after system reboot (reboot performed by relevant command). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Select the proper number for USB_STICK option. Wait for Debian GNU/Linux . Wait for debian login: . Type the root login. Wait for Password: . Type the proper password. Wait for root@debian:~# . Execute reboot command. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Select the proper number for USB_STICK option. Wait for Debian GNU/Linux . Expected result The Debian GNU/Linux is visible and confirms successful boot into OS after system reboot.","title":"UBT003.001 USB detect and boot after system reboot"},{"location":"unified-test-documentation/dasharo-compatibility/31O-usb-detect/","text":"Dasharo Compatibility: USB Detection UDT001.001 USB detection after coldboot Test description This test aims to verify that the DUT properly detects USB device after coldboot (reboot realized by power supply cutting off then restoring back). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Cut the power off. Restore power to the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Expected result The USB_STICK entry is visible which confirms successful detection after coldboot. UDT002.001 USB detection after warmboot Test description This test aims to verify that the DUT properly detects USB device after warmboot (reboot realized by device turning off then turning on). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Expected result The USB_STICK entry is visible which confirms successful detection after warmboot. UDT003.001 USB detection after system reboot Test description This test aims to verify that the DUT properly detects USB device after system reboot (reboot performed by relevant command). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Select the key with a proper number for iPXE . Press Ctrl+B when prompted to stop iPXE from booting automatically. Wait until iPXE> prompt appears. Type in dhcp to obtain an IP address. Type in chain and local iPXE address after a single space to load a network boot menu. Select Debian stable netboot 4.14.y option below iPXE boot menu header. Wait for debian login: . Type the root login. Wait for Password: . Type the proper password. Wait for root@debian:~# . Execute reboot command. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Expected result The USB_STICK entry is visible which confirms successful detection after system reboot.","title":"USB detection"},{"location":"unified-test-documentation/dasharo-compatibility/31O-usb-detect/#dasharo-compatibility-usb-detection","text":"","title":"Dasharo Compatibility: USB Detection"},{"location":"unified-test-documentation/dasharo-compatibility/31O-usb-detect/#udt001001-usb-detection-after-coldboot","text":"Test description This test aims to verify that the DUT properly detects USB device after coldboot (reboot realized by power supply cutting off then restoring back). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Cut the power off. Restore power to the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Expected result The USB_STICK entry is visible which confirms successful detection after coldboot.","title":"UDT001.001 USB detection after coldboot"},{"location":"unified-test-documentation/dasharo-compatibility/31O-usb-detect/#udt002001-usb-detection-after-warmboot","text":"Test description This test aims to verify that the DUT properly detects USB device after warmboot (reboot realized by device turning off then turning on). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Expected result The USB_STICK entry is visible which confirms successful detection after warmboot.","title":"UDT002.001 USB detection after warmboot"},{"location":"unified-test-documentation/dasharo-compatibility/31O-usb-detect/#udt003001-usb-detection-after-system-reboot","text":"Test description This test aims to verify that the DUT properly detects USB device after system reboot (reboot performed by relevant command). This test case may be re-done several times to specify the platform and connection stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Select the key with a proper number for iPXE . Press Ctrl+B when prompted to stop iPXE from booting automatically. Wait until iPXE> prompt appears. Type in dhcp to obtain an IP address. Type in chain and local iPXE address after a single space to load a network boot menu. Select Debian stable netboot 4.14.y option below iPXE boot menu header. Wait for debian login: . Type the root login. Wait for Password: . Type the proper password. Wait for root@debian:~# . Execute reboot command. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Check if USB_STICK entry is available. Expected result The USB_STICK entry is visible which confirms successful detection after system reboot.","title":"UDT003.001 USB detection after system reboot"},{"location":"unified-test-documentation/dasharo-compatibility/31P-flash-write-protection/","text":"Dasharo Security: Flash write protection Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Make yourself familiar with SPI hardware write protection . HWP001.001 Hardware flash write protection support Test description This test aims to verify whether the DUT supports hardware write protection mechanism. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: sudo ./flashrom -p internal --wp-list Expected result The output of the command should contain the information about lst of available write protection ranges, example has been shown below: Available write protection ranges: start = 0x00000000 length = 0x00000000 ( none ) start = 0x00000000 length = 0x00001000 ( lower 1 /2048 ) start = 0x007ff000 length = 0x00001000 ( upper 1 /2048 ) start = 0x00000000 length = 0x00002000 ( lower 1 /1024 ) start = 0x007fe000 length = 0x00002000 ( upper 1 /1024 ) start = 0x00000000 length = 0x00004000 ( lower 1 /512 ) start = 0x007fc000 length = 0x00004000 ( upper 1 /512 ) start = 0x00000000 length = 0x00008000 ( lower 1 /256 ) start = 0x007f8000 length = 0x00008000 ( upper 1 /256 ) start = 0x00000000 length = 0x00020000 ( lower 1 /64 ) start = 0x007e0000 length = 0x00020000 ( upper 1 /64 ) start = 0x00000000 length = 0x00040000 ( lower 1 /32 ) start = 0x007c0000 length = 0x00040000 ( upper 1 /32 ) start = 0x00000000 length = 0x00080000 ( lower 1 /16 ) start = 0x00780000 length = 0x00080000 ( upper 1 /16 ) start = 0x00000000 length = 0x00100000 ( lower 1 /8 ) start = 0x00700000 length = 0x00100000 ( upper 1 /8 ) start = 0x00000000 length = 0x00200000 ( lower 1 /4 ) start = 0x00600000 length = 0x00200000 ( upper 1 /4 ) start = 0x00000000 length = 0x00400000 ( lower 1 /2 ) start = 0x00400000 length = 0x00400000 ( upper 1 /2 ) start = 0x00000000 length = 0x00600000 ( lower 3 /4 ) start = 0x00200000 length = 0x00600000 ( upper 3 /4 ) start = 0x00000000 length = 0x00700000 ( lower 7 /8 ) start = 0x00100000 length = 0x00700000 ( upper 7 /8 ) start = 0x00000000 length = 0x00780000 ( lower 15 /16 ) start = 0x00080000 length = 0x00780000 ( upper 15 /16 ) start = 0x00000000 length = 0x007c0000 ( lower 31 /32 ) start = 0x00040000 length = 0x007c0000 ( upper 31 /32 ) start = 0x00000000 length = 0x007e0000 ( lower 63 /64 ) start = 0x00020000 length = 0x007e0000 ( upper 63 /64 ) start = 0x00000000 length = 0x007f8000 ( lower 255 /256 ) start = 0x00008000 length = 0x007f8000 ( upper 255 /256 ) start = 0x00000000 length = 0x007fc000 ( lower 511 /512 ) start = 0x00004000 length = 0x007fc000 ( upper 511 /512 ) start = 0x00000000 length = 0x007fe000 ( lower 1023 /1024 ) start = 0x00002000 length = 0x007fe000 ( upper 1023 /1024 ) start = 0x00000000 length = 0x007ff000 ( lower 2047 /2048 ) start = 0x00001000 length = 0x007ff000 ( upper 2047 /2048 ) start = 0x00000000 length = 0x00800000 ( all ) HWP002.001 Hardware flash write protection enable / disable Test description This test aims to verify whether there is a possibility to set and erase hardware write protection on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Test cases common documentation section. Test steps Based on the documentation erase current write protection. Based on the documentation set write protection for a specific range. Execute the following command in the terminal to check the status and the range of write protection: sudo ./flashrom -p internal --wp-status Expected result The output of the command should contain the information about protection mode: Protection mode: hardware Protection range: read from the command output and set before should be the same.","title":"Flash write protection"},{"location":"unified-test-documentation/dasharo-compatibility/31P-flash-write-protection/#dasharo-security-flash-write-protection","text":"","title":"Dasharo Security: Flash write protection"},{"location":"unified-test-documentation/dasharo-compatibility/31P-flash-write-protection/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Make yourself familiar with SPI hardware write protection .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31P-flash-write-protection/#hwp001001-hardware-flash-write-protection-support","text":"Test description This test aims to verify whether the DUT supports hardware write protection mechanism. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: sudo ./flashrom -p internal --wp-list Expected result The output of the command should contain the information about lst of available write protection ranges, example has been shown below: Available write protection ranges: start = 0x00000000 length = 0x00000000 ( none ) start = 0x00000000 length = 0x00001000 ( lower 1 /2048 ) start = 0x007ff000 length = 0x00001000 ( upper 1 /2048 ) start = 0x00000000 length = 0x00002000 ( lower 1 /1024 ) start = 0x007fe000 length = 0x00002000 ( upper 1 /1024 ) start = 0x00000000 length = 0x00004000 ( lower 1 /512 ) start = 0x007fc000 length = 0x00004000 ( upper 1 /512 ) start = 0x00000000 length = 0x00008000 ( lower 1 /256 ) start = 0x007f8000 length = 0x00008000 ( upper 1 /256 ) start = 0x00000000 length = 0x00020000 ( lower 1 /64 ) start = 0x007e0000 length = 0x00020000 ( upper 1 /64 ) start = 0x00000000 length = 0x00040000 ( lower 1 /32 ) start = 0x007c0000 length = 0x00040000 ( upper 1 /32 ) start = 0x00000000 length = 0x00080000 ( lower 1 /16 ) start = 0x00780000 length = 0x00080000 ( upper 1 /16 ) start = 0x00000000 length = 0x00100000 ( lower 1 /8 ) start = 0x00700000 length = 0x00100000 ( upper 1 /8 ) start = 0x00000000 length = 0x00200000 ( lower 1 /4 ) start = 0x00600000 length = 0x00200000 ( upper 1 /4 ) start = 0x00000000 length = 0x00400000 ( lower 1 /2 ) start = 0x00400000 length = 0x00400000 ( upper 1 /2 ) start = 0x00000000 length = 0x00600000 ( lower 3 /4 ) start = 0x00200000 length = 0x00600000 ( upper 3 /4 ) start = 0x00000000 length = 0x00700000 ( lower 7 /8 ) start = 0x00100000 length = 0x00700000 ( upper 7 /8 ) start = 0x00000000 length = 0x00780000 ( lower 15 /16 ) start = 0x00080000 length = 0x00780000 ( upper 15 /16 ) start = 0x00000000 length = 0x007c0000 ( lower 31 /32 ) start = 0x00040000 length = 0x007c0000 ( upper 31 /32 ) start = 0x00000000 length = 0x007e0000 ( lower 63 /64 ) start = 0x00020000 length = 0x007e0000 ( upper 63 /64 ) start = 0x00000000 length = 0x007f8000 ( lower 255 /256 ) start = 0x00008000 length = 0x007f8000 ( upper 255 /256 ) start = 0x00000000 length = 0x007fc000 ( lower 511 /512 ) start = 0x00004000 length = 0x007fc000 ( upper 511 /512 ) start = 0x00000000 length = 0x007fe000 ( lower 1023 /1024 ) start = 0x00002000 length = 0x007fe000 ( upper 1023 /1024 ) start = 0x00000000 length = 0x007ff000 ( lower 2047 /2048 ) start = 0x00001000 length = 0x007ff000 ( upper 2047 /2048 ) start = 0x00000000 length = 0x00800000 ( all )","title":"HWP001.001 Hardware flash write protection support"},{"location":"unified-test-documentation/dasharo-compatibility/31P-flash-write-protection/#hwp002001-hardware-flash-write-protection-enable-disable","text":"Test description This test aims to verify whether there is a possibility to set and erase hardware write protection on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Test cases common documentation section. Test steps Based on the documentation erase current write protection. Based on the documentation set write protection for a specific range. Execute the following command in the terminal to check the status and the range of write protection: sudo ./flashrom -p internal --wp-status Expected result The output of the command should contain the information about protection mode: Protection mode: hardware Protection range: read from the command output and set before should be the same.","title":"HWP002.001 Hardware flash write protection enable / disable"},{"location":"unified-test-documentation/dasharo-compatibility/31R-pcie-ports/","text":"Dasharo Compatibility: PCI Express ports support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . PEX001.001 PCI Express card detection (Ubuntu 22.04) Test description This test aims to verify that the PCI Express extension card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Plug the PCI Express extension card to the tested slot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: lspci Expected result The output of the command should contain the plugged device name: 01 :00.0 VGA compatible controller: Advanced Micro Devices, Inc. [ AMD/ATI ] Turks PRO [ Radeon HD 7570 ] The exact name and revision may be different depending on hardware configuration. PEX001.002 PCI Express card detection (Windows 11) Test description This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Plug the PCI Express extension card to the tested slot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open Device Manager and find the plugged device Note the device status. Expected result The device status in the Device Manager should indicate that the device is working properly and has no problems.","title":"Dasharo Compatibility: PCI Express ports support"},{"location":"unified-test-documentation/dasharo-compatibility/31R-pcie-ports/#dasharo-compatibility-pci-express-ports-support","text":"","title":"Dasharo Compatibility: PCI Express ports support"},{"location":"unified-test-documentation/dasharo-compatibility/31R-pcie-ports/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31R-pcie-ports/#pex001001-pci-express-card-detection-ubuntu-2204","text":"Test description This test aims to verify that the PCI Express extension card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Plug the PCI Express extension card to the tested slot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: lspci Expected result The output of the command should contain the plugged device name: 01 :00.0 VGA compatible controller: Advanced Micro Devices, Inc. [ AMD/ATI ] Turks PRO [ Radeon HD 7570 ] The exact name and revision may be different depending on hardware configuration.","title":"PEX001.001 PCI Express card detection (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31R-pcie-ports/#pex001002-pci-express-card-detection-windows-11","text":"Test description This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly and can be detected from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Plug the PCI Express extension card to the tested slot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open Device Manager and find the plugged device Note the device status. Expected result The device status in the Device Manager should indicate that the device is working properly and has no problems.","title":"PEX001.002 PCI Express card detection (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31S-sata-led-and-pc-speaker-error-indication/","text":"Dasharo Compatibility: SATA LED and PC speaker error indication ERR001.001 SATA LED and PC speaker error indication support (firmware) Test description This test aims to verify if SATA LED blink and PC speaker beeps on critical firmware errors. Test configuration data FIRMWARE = Dasharo DUT with PC speaker DUT with SATA LED DUT with removable RAM modules. Test setup Proceed with the Generic test setup: firmware . Test steps Remove power from DUT. Remove all RAM memory modules from the DUT. Connect power supply and power on the DUT. Observe the DUT starts blinking the SATA LED and beeps with PC speaker. Expected result When no memory modules are connected, this is considered a critical firmware error and the platform can not proceed with booting. Error indication path will be triggered causing the platform to beep and blink the SATA LED. There should be only 12 beeps, but the SATA LED should blink endlessly (until DUT is powered off or reset).","title":"SATA LED and PC speaker error indication"},{"location":"unified-test-documentation/dasharo-compatibility/31S-sata-led-and-pc-speaker-error-indication/#dasharo-compatibility-sata-led-and-pc-speaker-error-indication","text":"","title":"Dasharo Compatibility: SATA LED and PC speaker error indication"},{"location":"unified-test-documentation/dasharo-compatibility/31S-sata-led-and-pc-speaker-error-indication/#err001001-sata-led-and-pc-speaker-error-indication-support-firmware","text":"Test description This test aims to verify if SATA LED blink and PC speaker beeps on critical firmware errors. Test configuration data FIRMWARE = Dasharo DUT with PC speaker DUT with SATA LED DUT with removable RAM modules. Test setup Proceed with the Generic test setup: firmware . Test steps Remove power from DUT. Remove all RAM memory modules from the DUT. Connect power supply and power on the DUT. Observe the DUT starts blinking the SATA LED and beeps with PC speaker. Expected result When no memory modules are connected, this is considered a critical firmware error and the platform can not proceed with booting. Error indication path will be triggered causing the platform to beep and blink the SATA LED. There should be only 12 beeps, but the SATA LED should blink endlessly (until DUT is powered off or reset).","title":"ERR001.001 SATA LED and PC speaker error indication support (firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/","text":"Dasharo Compatibility: CPU Status Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . CPU001.001 CPU works (Ubuntu 22.04) Test description Check whether the mounted on the DUT CPU works. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM screen should be displayed. CPU001.002 CPU works (Windows 11) Test description Check whether the mounted on the DUT CPU works. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM screen should be displayed. CPU002.001 CPU cache enabled (Ubuntu 22.04) Test description Check whether all declared for the DUT cache levels are enabled. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Execute below command in terminal: getconf -a | grep CACHE Note the result. Expected result The output of the command should contain information about all cache levels, their size and association. Example output: LEVEL1_ICACHE_SIZE 32768 LEVEL1_ICACHE_ASSOC 32 LEVEL1_ICACHE_LINESIZE 128 LEVEL1_DCACHE_SIZE 32768 LEVEL1_DCACHE_ASSOC 32 LEVEL1_DCACHE_LINESIZE 128 LEVEL2_CACHE_SIZE 524288 LEVEL2_CACHE_ASSOC 2048 LEVEL2_CACHE_LINESIZE 32 LEVEL3_CACHE_SIZE 10485760 LEVEL3_CACHE_ASSOC 40960 LEVEL3_CACHE_LINESIZE 32 LEVEL4_CACHE_SIZE 0 LEVEL4_CACHE_ASSOC 0 LEVEL4_CACHE_LINESIZE 0 CPU002.002 CPU cache enabled (Windows 11) Test description Check whether all declared for the DUT cache levels are enabled. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Run PowerShell as an administrator and execute command: Get-Wmiobject -class win32_cachememory | fl Purpose , CacheType , InstalledSize Note the result. Expected result The output of the command should contain information about all cache levels, their size and association. Example output: Purpose : CACHE1 CacheType : 4 InstalledSize : 192 Purpose : CACHE1 CacheType : 3 InstalledSize : 128 Purpose : CACHE2 CacheType : 5 InstalledSize : 5120 Purpose : CACHE3 CacheType : 5 InstalledSize : 8192 CPU003.001 Multiple CPU support (Ubuntu 22.04) Test description Check whether the DUT has multiple CPU support. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Execute below command in terminal: lscpu Note the result. Expected result The output of the command should contain basic information about the CPU, including the number of the CPU (s) . If CPU(s) are more than 1, the DUT has multiple CPU support. Example results: Architecture: ppc64le Byte Order: Little Endian CPU ( s ) : 32 On-line CPU ( s ) list: 0 -31 Thread ( s ) per core: 4 Core ( s ) per socket: 4 Socket ( s ) : 2 NUMA node ( s ) : 2 CPU003.002 Multiple CPU support (Windows 11) Test description Check whether the DUT has multiple CPU support. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Run PowerShell as an administrator and execute command: WMIC CPU Get NumberOfCores Note the result. Expected result The output of the command should contain information about the CPUs. Example results: NumberOfCores 4 CPU004.001 Multiple-core support (Ubuntu 22.04) Test description Check whether the DUT has multi-core support. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Execute below command in terminal: lscpu Note the result. Expected result The output of the command should contain basic information about the CPU, including the number of the Core(s) per socket . If Core(s) per socket are more than 1, the DUT has multi-core support. Example results: Architecture: ppc64le Byte Order: Little Endian CPU ( s ) : 32 On-line CPU ( s ) list: 0 -31 Thread ( s ) per core: 4 Core ( s ) per socket: 4 Socket ( s ) : 2 NUMA node ( s ) : 2 CPU004.002 Multiple-core support (Windows 11) Test description Check whether the DUT has multi-core support. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Run PowerShell as an administrator and check total CPU cores by executing command: WMIC CPU Get NumberOfCores Note the result. Check total CPU socket number by executing command: ( Get-CimInstance -ClassName Win32_ComputerSystem ). NumberOfProcessors Note the result. Expected result If number of cores is higher than number of sockets then DUT has multi-core support. Example outputs: 1st command: NumberOfCores 4 2nd command: 1","title":"CPU status"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/#dasharo-compatibility-cpu-status","text":"","title":"Dasharo Compatibility: CPU Status"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/#cpu001001-cpu-works-ubuntu-2204","text":"Test description Check whether the mounted on the DUT CPU works. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM screen should be displayed.","title":"CPU001.001 CPU works (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/#cpu001002-cpu-works-windows-11","text":"Test description Check whether the mounted on the DUT CPU works. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM screen should be displayed.","title":"CPU001.002 CPU works (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/#cpu002001-cpu-cache-enabled-ubuntu-2204","text":"Test description Check whether all declared for the DUT cache levels are enabled. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Execute below command in terminal: getconf -a | grep CACHE Note the result. Expected result The output of the command should contain information about all cache levels, their size and association. Example output: LEVEL1_ICACHE_SIZE 32768 LEVEL1_ICACHE_ASSOC 32 LEVEL1_ICACHE_LINESIZE 128 LEVEL1_DCACHE_SIZE 32768 LEVEL1_DCACHE_ASSOC 32 LEVEL1_DCACHE_LINESIZE 128 LEVEL2_CACHE_SIZE 524288 LEVEL2_CACHE_ASSOC 2048 LEVEL2_CACHE_LINESIZE 32 LEVEL3_CACHE_SIZE 10485760 LEVEL3_CACHE_ASSOC 40960 LEVEL3_CACHE_LINESIZE 32 LEVEL4_CACHE_SIZE 0 LEVEL4_CACHE_ASSOC 0 LEVEL4_CACHE_LINESIZE 0","title":"CPU002.001 CPU cache enabled (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/#cpu002002-cpu-cache-enabled-windows-11","text":"Test description Check whether all declared for the DUT cache levels are enabled. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Run PowerShell as an administrator and execute command: Get-Wmiobject -class win32_cachememory | fl Purpose , CacheType , InstalledSize Note the result. Expected result The output of the command should contain information about all cache levels, their size and association. Example output: Purpose : CACHE1 CacheType : 4 InstalledSize : 192 Purpose : CACHE1 CacheType : 3 InstalledSize : 128 Purpose : CACHE2 CacheType : 5 InstalledSize : 5120 Purpose : CACHE3 CacheType : 5 InstalledSize : 8192","title":"CPU002.002 CPU cache enabled (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/#cpu003001-multiple-cpu-support-ubuntu-2204","text":"Test description Check whether the DUT has multiple CPU support. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Execute below command in terminal: lscpu Note the result. Expected result The output of the command should contain basic information about the CPU, including the number of the CPU (s) . If CPU(s) are more than 1, the DUT has multiple CPU support. Example results: Architecture: ppc64le Byte Order: Little Endian CPU ( s ) : 32 On-line CPU ( s ) list: 0 -31 Thread ( s ) per core: 4 Core ( s ) per socket: 4 Socket ( s ) : 2 NUMA node ( s ) : 2","title":"CPU003.001 Multiple CPU support (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/#cpu003002-multiple-cpu-support-windows-11","text":"Test description Check whether the DUT has multiple CPU support. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Run PowerShell as an administrator and execute command: WMIC CPU Get NumberOfCores Note the result. Expected result The output of the command should contain information about the CPUs. Example results: NumberOfCores 4","title":"CPU003.002 Multiple CPU support (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/#cpu004001-multiple-core-support-ubuntu-2204","text":"Test description Check whether the DUT has multi-core support. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Execute below command in terminal: lscpu Note the result. Expected result The output of the command should contain basic information about the CPU, including the number of the Core(s) per socket . If Core(s) per socket are more than 1, the DUT has multi-core support. Example results: Architecture: ppc64le Byte Order: Little Endian CPU ( s ) : 32 On-line CPU ( s ) list: 0 -31 Thread ( s ) per core: 4 Core ( s ) per socket: 4 Socket ( s ) : 2 NUMA node ( s ) : 2","title":"CPU004.001 Multiple-core support (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/31T-cpu-status/#cpu004002-multiple-core-support-windows-11","text":"Test description Check whether the DUT has multi-core support. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the OPERATING_SYSTEM to boot. Run PowerShell as an administrator and check total CPU cores by executing command: WMIC CPU Get NumberOfCores Note the result. Check total CPU socket number by executing command: ( Get-CimInstance -ClassName Win32_ComputerSystem ). NumberOfProcessors Note the result. Expected result If number of cores is higher than number of sockets then DUT has multi-core support. Example outputs: 1st command: NumberOfCores 4 2nd command: 1","title":"CPU004.002 Multiple-core support (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/","text":"Dasharo Compatibility: Heads bootloader support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . HDS001.001 Heads installation Test description This test aims to verify that Heads could be installed on the DUT. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Flash bootkernel partition with Heads in accordance with the documentation . Expected result The output of the pflash command should contain information, that flashing procedure has been ended without any errors. Example output: Programming & Verifying... [==================================================] 100 % ETA:0s HDS002.001 Boot into Heads Test description This test aims to verify that the DUT during the booting procedure reaches Heads bootloader. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Heads to boot and note the result. Expected result The Heads bootloader screen should be displayed. HDS003.001 Boot from USB option is available and works correctly Test description This test aims to verify that the Boot from USB option in the Default boot menu is available (if there is no option to boot OS from the Hard Disk) and allows to boot system mounted on the USB. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. USB storage with the installed OS. Test steps Plug the USB storage into DUT. Power on the DUT. Wait for the Default boot menu appears. Select Boot from USB option using the arrow keys and Enter. Select a partition from the USB storage from which the system will be booted. Note the results. Expected result The operating system from USB storage should boot properly. HDS004.001 Continue to the main menu option is available and works correctly Test description This test aims to verify that the Continue to the main menu option in the Default boot menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Note the results. Expected result After selecting Continue to the main menu , the Heads Boot Menu should be displayed. HDS005.001 Exit to recovery shell option is available and works correctly Test description This test aims to verify that the Exit to recovery shell option in the Default boot menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Exit to recovery shell option using the arrow keys and Enter. Note the results. Expected result After selecting Exit to recovery shell , the recovery shell should be shown. Example output: !!!!! User requested recovery shell !!!!! Starting recovery shell ~ # HDS006.001 Default boot option is available and works correctly Test description This test aims to verify that the Default boot option in the Heads boot menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Default boot option in the Heads boot menu . Note the results. Expected result After selecting Default boot , the Default boot menu should be displayed. HDS007.001 Options submenu is available and works correctly Test description This test aims to verify that the Options --> option in the Heads boot menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Note the results. Expected result After selecting Options --> , the HEADS Options menu should be displayed. Example view of HEADS Options : b Boot Options --> t TPM/TOTP/HOTP Options --> u Update checksums and sign all files in /boot c Change configuration settings --> f Flash/Update the BIOS --> g GPG Options --> F OEM Factory Reset --> x Exit to recovery shell r <-- Return to main menu HDS008.001 System info option is available and works correctly Test description This test aims to verify that the System Info option in the Heads boot menu allows displaying all basic system information. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the System Info option in the Heads boot menu . Note the results. Expected result After selecting System Info , the basic system information should be displayed. Example output: \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 System Info \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502 \u2502 Talos 2 Server \u2502 \u2502 \u2502 \u2502 FW_VER: v0.5.0 \u2502 \u2502 Kernel: Linux 5 .5.0-openpower1 \u2502 \u2502 \u2502 \u2502 CPU: IBM POWER9 \u201cSforza\u201d \u2502 \u2502 RAM: 8 GB \u2502 \u2502 \u2502 \u2502 Disk /dev/nvme0n1: 477 GB \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 HDS009.001 Power off option is available and works correctly Test description This test aims to verify that the Power Off option in the Heads boot menu allows turning off the DUT. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Power Off option in the Heads boot menu . Note the results. Expected result After selecting Power Off , the DUT should be turned off without any complications. HDS010.001 OEM Factory Reset option is available and works correctly Test description This test aims to verify that the OEM Factory Reset / Re-Ownership --> option in the HEADS Options submenu is available and works correctly. Test configuration data FIRMWARE = Dasharo USB Security Dongle Previously installed OS Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB Security Dongle into DUT. Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the OEM Factory Reset / Re-Ownership --> option in the HEADS Options submenu. Choose in the displayed OEM Factory Reset / Re-Ownership window using the arrow keys and Enter. Go through the installation process by answering the questions. Note the results. Expected result The Provisioned Security Components Secrets should be displayed at the end of the installation. The new GPG keys should be placed on the USB Security Dongle . HDS011.001 Add GPG key to running BIOS and reflash Test description This test aims to verify that the Add GPG key to running BIOS and reflash option in the GPG Management Menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB, with GPG public key Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB storage into DUT. Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the Add GPG key to running BIOS and reflash option in the GPG Management Menu . Choose in the displayed GPG public key required window using the arrow keys and Enter. Choose GPG public key from the USB storage and press Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the List GPG keys in your keyring option in the GPG Management Menu . Note the results. Expected result The GPG Keyring window should contain information about the given GPG key. HDS012.001 Add GPG key to standalone BIOS image and flash Test description This test aims to verify that the Add GPG key to standalone BIOS image and flash option in the GPG Management Menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB, with GPG public key and BIOS image Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB storage into DUT. Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the Add GPG key to standalone BIOS image and flash option in the GPG Management Menu . Choose in the displayed GPG public key required window using the arrow keys and Enter. Choose GPG public key from the USB storage and press Enter. Choose BIOS image(*.rom) from the USB storage and press Enter. Choose in the displayed Flash ROM? window using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the List GPG keys in your keyring option in the GPG Management Menu . Note the results. Expected result The GPG Keyring window should contain information about the given GPG key. HDS013.001 Replace GPG key(s) in the current ROM and reflash Test description This test aims to verify that the Replace GPG key(s) in the current ROM and reflash option in the GPG Management Menu is available and replaces GPG keys correctly. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB, with GPG public key Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB storage into DUT. Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the Replace GPG key(s) in the current ROM and reflash option in the GPG Management Menu . Choose in the displayed GPG public key required window using the arrow keys and Enter. Choose GPG public key from the USB storage and press Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the List GPG keys in your keyring option in the GPG Management Menu . Note the results. Expected result The GPG Keyring window should contain information about the given GPG key. HDS014.001 List GPG keys in your keyring Test description This test aims to verify that the List GPG keys in your keyring option in the GPG Management Menu is available and listed GPG keys correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the List GPG keys in your keyring option in the GPG Management Menu . Note the results. Expected result The GPG Keyring window should contain information about the GPG key if any was added. Example information in the GPG Keyring window: //.gnupg/pubring.kbx -------------------- pub rsa3072 2022 -11-22 [ SC ] AFA824E4660A265253BA1571B640E02380808C34 uid [ ultimate ] OEM Key ( OEM-generated key ) option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the Export public GPG key to USB drive option in the GPG Management Menu . Choose in the displayed Export Public Key(s) to USB drive? window using the arrow keys and Enter. Note the results. Expected result The GPG Key Copied Successfully window should be displayed. The public-key.asc file should be on USB storage . HDS016.001 Generate GPG keys manually on a USB security token Test description This test aims to verify that the Generate GPG keys manually on a USB security token option in the GPG Management Menu is available and works correctly. Test configuration data FIRMWARE = Dasharo USB Security Dongle Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB Security Dongle into DUT. Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the Generate GPG keys manually on a USB security token option in the GPG Management Menu . Confirm that the USB Security Dongle is inserted, type Y and press Enter. Wait for gpg/card> prompt is appeared. Type admin and press Enter. Type generate and press Enter. Answer y to question Replace existing keys? . Note the results. Expected result Information about the successful generation of GPG keys should be displayed. The new GPG keys are on the USB Security Dongle . HDS017.001 Clear GPG key(s) and reset all user settings Test description This test aims to verify that the Clear GPG key(s) and reset all user settings option in the Config Management Menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the Change configuration settings --> option in the HEADS Options submenu. Select the Clear GPG key(s) and reset all user settings option in the Config Management Menu . Choose in the displayed Reset Configuration? window using the arrow keys and Enter. Reboot the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the List GPG keys in your keyring option in the GPG Management Menu . Note the results. Expected result The GPG Keyring window should be empty. HDS018.001 Reset TPM option is available and works correctly Test description This test aims to verify that the Reset TPM option in the TPM/TOTP/HOTP Options submenu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the TPM/TOTP/HOTP Options --> option in the HEADS Options submenu. Select the Reset the TPM option in the TPM/TOTP/HOTP Options submenu. Choose in the displayed Reset the TPM window using the arrow keys and Enter. Set the TPM owner password. Scan the QR code using a mobile application to add the new TOTP secret and press Enter. Reboot the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Expected result After selecting the Continue to the main menu option, should be prompted for the TPM owner password. HDS019.001 Generate new TOTP/HOTP secret Test description This test aims to verify that the Generate new TOTP/HOTP secret option in the TPM/TOTP/HOTP Options submenu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the TPM/TOTP/HOTP Options --> option in the HEADS Options submenu. Select the Generate new TOTP/HOTP secret option in the TPM/TOTP/HOTP Options submenu. Scan the QR code using a mobile application to add the new TOTP secret and press Enter. Reboot the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Expected result After selecting the Continue to the main menu option, should be prompted for the TOTP password.","title":"Heads bootloader support"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#dasharo-compatibility-heads-bootloader-support","text":"","title":"Dasharo Compatibility: Heads bootloader support"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds001001-heads-installation","text":"Test description This test aims to verify that Heads could be installed on the DUT. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Flash bootkernel partition with Heads in accordance with the documentation . Expected result The output of the pflash command should contain information, that flashing procedure has been ended without any errors. Example output: Programming & Verifying... [==================================================] 100 % ETA:0s","title":"HDS001.001 Heads installation"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds002001-boot-into-heads","text":"Test description This test aims to verify that the DUT during the booting procedure reaches Heads bootloader. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Heads to boot and note the result. Expected result The Heads bootloader screen should be displayed.","title":"HDS002.001 Boot into Heads"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds003001-boot-from-usb-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the Boot from USB option in the Default boot menu is available (if there is no option to boot OS from the Hard Disk) and allows to boot system mounted on the USB. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. USB storage with the installed OS. Test steps Plug the USB storage into DUT. Power on the DUT. Wait for the Default boot menu appears. Select Boot from USB option using the arrow keys and Enter. Select a partition from the USB storage from which the system will be booted. Note the results. Expected result The operating system from USB storage should boot properly.","title":"HDS003.001 Boot from USB option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds004001-continue-to-the-main-menu-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the Continue to the main menu option in the Default boot menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Note the results. Expected result After selecting Continue to the main menu , the Heads Boot Menu should be displayed.","title":"HDS004.001 Continue to the main menu option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds005001-exit-to-recovery-shell-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the Exit to recovery shell option in the Default boot menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Exit to recovery shell option using the arrow keys and Enter. Note the results. Expected result After selecting Exit to recovery shell , the recovery shell should be shown. Example output: !!!!! User requested recovery shell !!!!! Starting recovery shell ~ #","title":"HDS005.001 Exit to recovery shell option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds006001-default-boot-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the Default boot option in the Heads boot menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Default boot option in the Heads boot menu . Note the results. Expected result After selecting Default boot , the Default boot menu should be displayed.","title":"HDS006.001 Default boot option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds007001-options-submenu-is-available-and-works-correctly","text":"Test description This test aims to verify that the Options --> option in the Heads boot menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Note the results. Expected result After selecting Options --> , the HEADS Options menu should be displayed. Example view of HEADS Options : b Boot Options --> t TPM/TOTP/HOTP Options --> u Update checksums and sign all files in /boot c Change configuration settings --> f Flash/Update the BIOS --> g GPG Options --> F OEM Factory Reset --> x Exit to recovery shell r <-- Return to main menu","title":"HDS007.001 Options submenu is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds008001-system-info-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the System Info option in the Heads boot menu allows displaying all basic system information. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the System Info option in the Heads boot menu . Note the results. Expected result After selecting System Info , the basic system information should be displayed. Example output: \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524 System Info \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502 \u2502 Talos 2 Server \u2502 \u2502 \u2502 \u2502 FW_VER: v0.5.0 \u2502 \u2502 Kernel: Linux 5 .5.0-openpower1 \u2502 \u2502 \u2502 \u2502 CPU: IBM POWER9 \u201cSforza\u201d \u2502 \u2502 RAM: 8 GB \u2502 \u2502 \u2502 \u2502 Disk /dev/nvme0n1: 477 GB \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518","title":"HDS008.001 System info option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds009001-power-off-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the Power Off option in the Heads boot menu allows turning off the DUT. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Power Off option in the Heads boot menu . Note the results. Expected result After selecting Power Off , the DUT should be turned off without any complications.","title":"HDS009.001 Power off option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds010001-oem-factory-reset-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the OEM Factory Reset / Re-Ownership --> option in the HEADS Options submenu is available and works correctly. Test configuration data FIRMWARE = Dasharo USB Security Dongle Previously installed OS Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB Security Dongle into DUT. Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the OEM Factory Reset / Re-Ownership --> option in the HEADS Options submenu. Choose in the displayed OEM Factory Reset / Re-Ownership window using the arrow keys and Enter. Go through the installation process by answering the questions. Note the results. Expected result The Provisioned Security Components Secrets should be displayed at the end of the installation. The new GPG keys should be placed on the USB Security Dongle .","title":"HDS010.001 OEM Factory Reset option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds011001-add-gpg-key-to-running-bios-and-reflash","text":"Test description This test aims to verify that the Add GPG key to running BIOS and reflash option in the GPG Management Menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB, with GPG public key Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB storage into DUT. Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the Add GPG key to running BIOS and reflash option in the GPG Management Menu . Choose in the displayed GPG public key required window using the arrow keys and Enter. Choose GPG public key from the USB storage and press Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the List GPG keys in your keyring option in the GPG Management Menu . Note the results. Expected result The GPG Keyring window should contain information about the given GPG key.","title":"HDS011.001 Add GPG key to running BIOS and reflash"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds012001-add-gpg-key-to-standalone-bios-image-and-flash","text":"Test description This test aims to verify that the Add GPG key to standalone BIOS image and flash option in the GPG Management Menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB, with GPG public key and BIOS image Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB storage into DUT. Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the Add GPG key to standalone BIOS image and flash option in the GPG Management Menu . Choose in the displayed GPG public key required window using the arrow keys and Enter. Choose GPG public key from the USB storage and press Enter. Choose BIOS image(*.rom) from the USB storage and press Enter. Choose in the displayed Flash ROM? window using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the List GPG keys in your keyring option in the GPG Management Menu . Note the results. Expected result The GPG Keyring window should contain information about the given GPG key.","title":"HDS012.001 Add GPG key to standalone BIOS image and flash"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds013001-replace-gpg-keys-in-the-current-rom-and-reflash","text":"Test description This test aims to verify that the Replace GPG key(s) in the current ROM and reflash option in the GPG Management Menu is available and replaces GPG keys correctly. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB, with GPG public key Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB storage into DUT. Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the Replace GPG key(s) in the current ROM and reflash option in the GPG Management Menu . Choose in the displayed GPG public key required window using the arrow keys and Enter. Choose GPG public key from the USB storage and press Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the List GPG keys in your keyring option in the GPG Management Menu . Note the results. Expected result The GPG Keyring window should contain information about the given GPG key.","title":"HDS013.001 Replace GPG key(s) in the current ROM and reflash"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds014001-list-gpg-keys-in-your-keyring","text":"Test description This test aims to verify that the List GPG keys in your keyring option in the GPG Management Menu is available and listed GPG keys correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the List GPG keys in your keyring option in the GPG Management Menu . Note the results. Expected result The GPG Keyring window should contain information about the GPG key if any was added. Example information in the GPG Keyring window: //.gnupg/pubring.kbx -------------------- pub rsa3072 2022 -11-22 [ SC ] AFA824E4660A265253BA1571B640E02380808C34 uid [ ultimate ] OEM Key ( OEM-generated key ) option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the Export public GPG key to USB drive option in the GPG Management Menu . Choose in the displayed Export Public Key(s) to USB drive? window using the arrow keys and Enter. Note the results. Expected result The GPG Key Copied Successfully window should be displayed. The public-key.asc file should be on USB storage .","title":"HDS015.001 Export public GPG key to USB drive"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds016001-generate-gpg-keys-manually-on-a-usb-security-token","text":"Test description This test aims to verify that the Generate GPG keys manually on a USB security token option in the GPG Management Menu is available and works correctly. Test configuration data FIRMWARE = Dasharo USB Security Dongle Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB Security Dongle into DUT. Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the Generate GPG keys manually on a USB security token option in the GPG Management Menu . Confirm that the USB Security Dongle is inserted, type Y and press Enter. Wait for gpg/card> prompt is appeared. Type admin and press Enter. Type generate and press Enter. Answer y to question Replace existing keys? . Note the results. Expected result Information about the successful generation of GPG keys should be displayed. The new GPG keys are on the USB Security Dongle .","title":"HDS016.001 Generate GPG keys manually on a USB security token"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds017001-clear-gpg-keys-and-reset-all-user-settings","text":"Test description This test aims to verify that the Clear GPG key(s) and reset all user settings option in the Config Management Menu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the Change configuration settings --> option in the HEADS Options submenu. Select the Clear GPG key(s) and reset all user settings option in the Config Management Menu . Choose in the displayed Reset Configuration? window using the arrow keys and Enter. Reboot the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the GPG Options --> option in the HEADS Options submenu. Select the List GPG keys in your keyring option in the GPG Management Menu . Note the results. Expected result The GPG Keyring window should be empty.","title":"HDS017.001 Clear GPG key(s) and reset all user settings"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds018001-reset-tpm-option-is-available-and-works-correctly","text":"Test description This test aims to verify that the Reset TPM option in the TPM/TOTP/HOTP Options submenu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the TPM/TOTP/HOTP Options --> option in the HEADS Options submenu. Select the Reset the TPM option in the TPM/TOTP/HOTP Options submenu. Choose in the displayed Reset the TPM window using the arrow keys and Enter. Set the TPM owner password. Scan the QR code using a mobile application to add the new TOTP secret and press Enter. Reboot the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Expected result After selecting the Continue to the main menu option, should be prompted for the TPM owner password.","title":"HDS018.001 Reset TPM option is available and works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/#hds019001-generate-new-totphotp-secret","text":"Test description This test aims to verify that the Generate new TOTP/HOTP secret option in the TPM/TOTP/HOTP Options submenu is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Select the Options --> option in the Heads boot menu . Select the TPM/TOTP/HOTP Options --> option in the HEADS Options submenu. Select the Generate new TOTP/HOTP secret option in the TPM/TOTP/HOTP Options submenu. Scan the QR code using a mobile application to add the new TOTP secret and press Enter. Reboot the DUT. Wait for the Default boot menu appears. Select the Continue to the main menu option using the arrow keys and Enter. Expected result After selecting the Continue to the main menu option, should be prompted for the TOTP password.","title":"HDS019.001 Generate new TOTP/HOTP secret"},{"location":"unified-test-documentation/dasharo-compatibility/31V-petitboot-payload-support/","text":"Dasharo Compatibility: Petitboot payload support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . PBT001.001 Boot into Petitboot Test description This test verifies that the DUT during booting procedure reaches Petitboot menu. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Petitboot to boot and note the result. Expected result The Petitbooot menu screen should be displayed. PBT002.001 Read System Information from Petitboot Test description This test verifies that Petitboot System Information option is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Petitboot to boot. Select the System Information option using the arrow keys and press Enter . Note the result. Expected result After select System Information option, device information tree should be displayed. PBT003.001 Rescan Devices by Petitboot Test description This test verifies that Petitboot Rescan Device option is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Petitboot to boot. Select the Rescan Devices option using the arrow keys and press Enter . Note the results. Attach USB Stick with bootable system to USB port in DUT. Select the Rescan Devices again and note the results. Expected result Information about the attached USB Stick should be displayed after the second use of the Rescan Devices option.","title":"Petitboot payload support"},{"location":"unified-test-documentation/dasharo-compatibility/31V-petitboot-payload-support/#dasharo-compatibility-petitboot-payload-support","text":"","title":"Dasharo Compatibility: Petitboot payload support"},{"location":"unified-test-documentation/dasharo-compatibility/31V-petitboot-payload-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31V-petitboot-payload-support/#pbt001001-boot-into-petitboot","text":"Test description This test verifies that the DUT during booting procedure reaches Petitboot menu. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Petitboot to boot and note the result. Expected result The Petitbooot menu screen should be displayed.","title":"PBT001.001 Boot into Petitboot"},{"location":"unified-test-documentation/dasharo-compatibility/31V-petitboot-payload-support/#pbt002001-read-system-information-from-petitboot","text":"Test description This test verifies that Petitboot System Information option is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Petitboot to boot. Select the System Information option using the arrow keys and press Enter . Note the result. Expected result After select System Information option, device information tree should be displayed.","title":"PBT002.001 Read System Information from Petitboot"},{"location":"unified-test-documentation/dasharo-compatibility/31V-petitboot-payload-support/#pbt003001-rescan-devices-by-petitboot","text":"Test description This test verifies that Petitboot Rescan Device option is available and works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Petitboot to boot. Select the Rescan Devices option using the arrow keys and press Enter . Note the results. Attach USB Stick with bootable system to USB port in DUT. Select the Rescan Devices again and note the results. Expected result Information about the attached USB Stick should be displayed after the second use of the Rescan Devices option.","title":"PBT003.001 Rescan Devices by Petitboot"},{"location":"unified-test-documentation/dasharo-compatibility/31W-device-tree/","text":"Dasharo compatibility: Device tree Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . DVT001.001 Node with coreboot exists Test description This test aims to verify whether the node with the coreboot exists in the Device Tree. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: xxd /sys/firmware/devicetree/base/firmware/coreboot/compatible Note the result. Expected result The output of the command should contain information about memory sectors dedicated for coreboot. Example output: 00000000 : 636f 7265 626f 6f74 00 coreboot DVT002.001 Memory for coreboot is reserved (Ubuntu 22.04) Test description This test aims to verify that in the system exists reserved memory for coreboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: xxd /sys/firmware/devicetree/base/firmware/coreboot/reg Note the results. Run the following command in the terminal: xxd /sys/firmware/devicetree/base/reserved-memory/ranges Expected result Output of the first command should contain information about memory ranges for corebotot. Output of the second command should contain information about reserved ranges. All memory range for coreboot (output from command 1) should be reserved (output from command 2).","title":"Device Tree"},{"location":"unified-test-documentation/dasharo-compatibility/31W-device-tree/#dasharo-compatibility-device-tree","text":"","title":"Dasharo compatibility: Device tree"},{"location":"unified-test-documentation/dasharo-compatibility/31W-device-tree/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/31W-device-tree/#dvt001001-node-with-coreboot-exists","text":"Test description This test aims to verify whether the node with the coreboot exists in the Device Tree. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: xxd /sys/firmware/devicetree/base/firmware/coreboot/compatible Note the result. Expected result The output of the command should contain information about memory sectors dedicated for coreboot. Example output: 00000000 : 636f 7265 626f 6f74 00 coreboot","title":"DVT001.001 Node with coreboot exists"},{"location":"unified-test-documentation/dasharo-compatibility/31W-device-tree/#dvt002001-memory-for-coreboot-is-reserved-ubuntu-2204","text":"Test description This test aims to verify that in the system exists reserved memory for coreboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: xxd /sys/firmware/devicetree/base/firmware/coreboot/reg Note the results. Run the following command in the terminal: xxd /sys/firmware/devicetree/base/reserved-memory/ranges Expected result Output of the first command should contain information about memory ranges for corebotot. Output of the second command should contain information about reserved ranges. All memory range for coreboot (output from command 1) should be reserved (output from command 2).","title":"DVT002.001 Memory for coreboot is reserved (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/320-fwupd-firmware-update/","text":"Dasharo Compatibility: Firmware update using fwupd Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Install the dmidecode package: sudo apt install dmidecode . Make yourself familiar with Updating firmware using fwupd FFW001.001 Firmware update by using fwupd Test description This test verify whether it is possible to update the firmware on the DUT by using fwupd demon. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Disable Secure Boot . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Configure environment in accordance with the documentation Start firmware updating procedure by executing the following command in the terminal: sudo fwupdmgr update Reboot the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command to verify results: sudo dmidecode -t bios Expected result The output of dmidecode command should contain information about current firmware. The current firmware version should be equal to the latest released firmware version. Example output: BIOS Information Vendor: 3mdeb Version: Dasharo ( coreboot+UEFI ) v1.1.0 Release Date: 03 /24/2022 ROM Size: 16 MB Characteristics: PCI is supported PC Card ( PCMCIA ) is supported BIOS is upgradeable BIOS shadowing is allowed Selectable boot is supported ACPI is supported USB legacy is supported Targeted content distribution is supported UEFI is supported BIOS Revision: 1 .1 Firmware Revision: 0 .0","title":"Firmware update using fwupd"},{"location":"unified-test-documentation/dasharo-compatibility/320-fwupd-firmware-update/#dasharo-compatibility-firmware-update-using-fwupd","text":"","title":"Dasharo Compatibility: Firmware update using fwupd"},{"location":"unified-test-documentation/dasharo-compatibility/320-fwupd-firmware-update/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Install the dmidecode package: sudo apt install dmidecode . Make yourself familiar with Updating firmware using fwupd","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/320-fwupd-firmware-update/#ffw001001-firmware-update-by-using-fwupd","text":"Test description This test verify whether it is possible to update the firmware on the DUT by using fwupd demon. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Disable Secure Boot . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Configure environment in accordance with the documentation Start firmware updating procedure by executing the following command in the terminal: sudo fwupdmgr update Reboot the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command to verify results: sudo dmidecode -t bios Expected result The output of dmidecode command should contain information about current firmware. The current firmware version should be equal to the latest released firmware version. Example output: BIOS Information Vendor: 3mdeb Version: Dasharo ( coreboot+UEFI ) v1.1.0 Release Date: 03 /24/2022 ROM Size: 16 MB Characteristics: PCI is supported PC Card ( PCMCIA ) is supported BIOS is upgradeable BIOS shadowing is allowed Selectable boot is supported ACPI is supported USB legacy is supported Targeted content distribution is supported UEFI is supported BIOS Revision: 1 .1 Firmware Revision: 0 .0","title":"FFW001.001 Firmware update by using fwupd"},{"location":"unified-test-documentation/dasharo-compatibility/325-custom-boot-order/","text":"Dasharo Compatibility: Custom Boot Order Test cases common documentation Test setup Proceed with the Generic test setup: firmware . CBO001.001 Custom boot order (SeaBIOS) Test description This test aims to verify that the DUT boot from the suitable source, with the possibility to boot from other sources. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT Press BOOT_MENU_KEY key to display boot menu. Compare the listed devices with the desired boot order. Expected result When there is a possibility for the platform to boot from different sources: Priority will be given to the system booted from SSD connected by mSATA. If above-mentioned SSD does not include system, it will be booted from USB. If it either not include system, it will be booted from SSD connected by SATA 2.5 If there is only one bootable medium the platform shall boot from it. Example boot menu: Select boot device: 1 . AHCI/0: SATA SSD ATA-11 Hard-Disk ( 15272 MiBytes ) 2 . USB MSC Drive USB Flash Memory PMAP 3 . USB MSC Drive SanDisk Ultra 1 .00 4 . USB MSC Drive Generic Flash Disk 8 .07 5 . AHCI/1: TOSHIBA MK2561GSYN ATA-8 Hard-Disk ( 232 GiBytes ) 6 . iPXE 7 . Payload [ memtest ] CBO001.002 Custom boot order (edk2) Test description This test aims to verify that the DUT boot from the suitable source, with the possibility to boot from other sources. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT Press SETUP MENU key to display boot menu. Select Boot Maintenance Manager and press ENTER . In Boot Maintenance Manager menu select Boot Options and press ENTER . In Change Boot Order menu select Change the order option and press ENTER . Set the desired boot order. Reboot the device. Press BOOT_MENU_KEY key to display boot menu. Compare the listed devices with the desired boot order. Expected result Current boot order option list should correspond to the desired boot order.","title":"Custom Boot Order"},{"location":"unified-test-documentation/dasharo-compatibility/325-custom-boot-order/#dasharo-compatibility-custom-boot-order","text":"","title":"Dasharo Compatibility: Custom Boot Order"},{"location":"unified-test-documentation/dasharo-compatibility/325-custom-boot-order/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/325-custom-boot-order/#cbo001001-custom-boot-order-seabios","text":"Test description This test aims to verify that the DUT boot from the suitable source, with the possibility to boot from other sources. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT Press BOOT_MENU_KEY key to display boot menu. Compare the listed devices with the desired boot order. Expected result When there is a possibility for the platform to boot from different sources: Priority will be given to the system booted from SSD connected by mSATA. If above-mentioned SSD does not include system, it will be booted from USB. If it either not include system, it will be booted from SSD connected by SATA 2.5 If there is only one bootable medium the platform shall boot from it. Example boot menu: Select boot device: 1 . AHCI/0: SATA SSD ATA-11 Hard-Disk ( 15272 MiBytes ) 2 . USB MSC Drive USB Flash Memory PMAP 3 . USB MSC Drive SanDisk Ultra 1 .00 4 . USB MSC Drive Generic Flash Disk 8 .07 5 . AHCI/1: TOSHIBA MK2561GSYN ATA-8 Hard-Disk ( 232 GiBytes ) 6 . iPXE 7 . Payload [ memtest ]","title":"CBO001.001 Custom boot order (SeaBIOS)"},{"location":"unified-test-documentation/dasharo-compatibility/325-custom-boot-order/#cbo001002-custom-boot-order-edk2","text":"Test description This test aims to verify that the DUT boot from the suitable source, with the possibility to boot from other sources. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT Press SETUP MENU key to display boot menu. Select Boot Maintenance Manager and press ENTER . In Boot Maintenance Manager menu select Boot Options and press ENTER . In Change Boot Order menu select Change the order option and press ENTER . Set the desired boot order. Reboot the device. Press BOOT_MENU_KEY key to display boot menu. Compare the listed devices with the desired boot order. Expected result Current boot order option list should correspond to the desired boot order.","title":"CBO001.002 Custom boot order (edk2)"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/","text":"Dasharo Compatibility: Dasharo Tools Suite Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Wired network connection. Disable Secure Boot. Prepare the bootable USB stick Make yourself familiar with Dasharo Tools Suite . DTS001.001 Booting DTS from USB works correctly Test description This test aims to verify that DTS is properly booting from USB. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Expected result After a while, the DTS menu should appear. DTS002.001 DTS option Creating Dasharo HCL report works correctly Test description This test aims to verify that the option Dasharo HCL report in the DTS menu properly creates the report. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 1 and press Enter . Wait for the question: Do you want to support Dasharo development by sending us logs with hardware configuration ? Type in y and press Enter. Expected result The whole process may take a few minutes. The report should be generated. The report should be sent to the cloud. In the summary should be displayed information that all calls exited without errors. Example summary output: SUMMARY ======= > All Curl calls exited without errors > Attempt to send completed > .tar.gz Thanks you for supporting Dasharo! DTS003.001 DTS option power-off DUT works correctly Test description This test aims to verify that the option Power off system in the DTS menu turns off the DUT. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 10 and press Enter . Expected result The DUT should be turned off without any complications. DTS004.001 DTS option reboot DUT works correctly Test description This test aims to verify that the option Reboot system in the DTS menu reboots the DUT. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 11 and press Enter . Expected result The DUT should be rebooted without any complications. DTS005.001 DTS drop-to-shell option works correctly Test description This test aims to verify that the option Shell in the DTS menu opens Shell. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 9 and press Enter . Expected result Information about entering the shell and how to exit should be displayed. Shell command input should be activated. Example output: Entering shell, to leave type exit and press Enter or press LCtrl+D bash-5.1# DTS006.001 Flash device from DTS shell by using flashrom works correctly Test description This test aims to verify whether is the possibility to flash the DUT firmware by using flashrom in DTS Shell . Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. {PATH} = individual path to a specific binary. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type 9 and click Enter to launch Shell. Run the following command to obtain coreboot.rom binary: wget https://3mdeb.com/open-source-firmware/ { PATH } -O /tmp/coreboot.rom The above-described command is not the only way to obtain binary. For example, scp command might be used, too. Run the following command to flash the firmware: flashrom -p internal -w /tmp/coreboot.rom Additional parameters may be needed for the flashrom command depending on the DUT. Documentation describing the exact command to flash the specific platform is always available in localization: Supported hardware -> Platform name -> Initial Deployment . Power off the DUT. Repeat steps 2-6. Run the following command to check the firmware version: dmidecode -t 0 Note the results. Expected result The output of dmidecode command should contain information about the current firmware. The current firmware version should be equal to the binary version, which you were flashing. Example output: Version: Dasharo ( coreboot+UEFI ) v1.1.0 DTS007.001 Update device firmware from DTS Shell by using fwupd works correctly Test description This test aims to verify whether there is the possibility to update the DUT firmware by using fwupd in DTS. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 9 and press Enter . Run the following commands to update the firmware to the latest version: fwupdmgr refresh fwupdmgr update Power off the DUT. Repeat steps 2-6. Run the following command to check the firmware version: dmidecode -t 0 Note the results. Expected result The output of dmidecode command should contain information about the current firmware. The current firmware version should be equal to the binary version, which you were flashing. Example output: Version: Dasharo ( coreboot+UEFI ) v1.1.0 DTS008.001 Flash device EC firmware by using DTS built-in script works correctly Test description This test aims to verify whether there is the possibility to flash the DUT EC firmware by using the built-in script in DTS. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Proceed with Dasharo EC Transition . Expected result After the flashing procedure itself, the DUT should be able to boot. The EC firmware version, after checking the method described in the above-mentioned documentation , should correspond to the latest version. DTS009.001 Update device EC firmware by using DTS works correctly Test description This test aims to verify whether there is the possibility to update the DUT EC firmware by using system76_ectool in DTS. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 9 and press Enter . Proceed with Dasharo EC Update . Expected result After the updating firmware procedure itself, the DUT should be able to boot. The EC firmware version, after checking the method described in the above-mentioned documentation , should correspond to the binary version used.","title":"Dasharo Tools Suite"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#dasharo-compatibility-dasharo-tools-suite","text":"","title":"Dasharo Compatibility: Dasharo Tools Suite"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Wired network connection. Disable Secure Boot. Prepare the bootable USB stick Make yourself familiar with Dasharo Tools Suite .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#dts001001-booting-dts-from-usb-works-correctly","text":"Test description This test aims to verify that DTS is properly booting from USB. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Expected result After a while, the DTS menu should appear.","title":"DTS001.001 Booting DTS from USB works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#dts002001-dts-option-creating-dasharo-hcl-report-works-correctly","text":"Test description This test aims to verify that the option Dasharo HCL report in the DTS menu properly creates the report. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 1 and press Enter . Wait for the question: Do you want to support Dasharo development by sending us logs with hardware configuration ? Type in y and press Enter. Expected result The whole process may take a few minutes. The report should be generated. The report should be sent to the cloud. In the summary should be displayed information that all calls exited without errors. Example summary output: SUMMARY ======= > All Curl calls exited without errors > Attempt to send completed > .tar.gz Thanks you for supporting Dasharo!","title":"DTS002.001 DTS option Creating Dasharo HCL report works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#dts003001-dts-option-power-off-dut-works-correctly","text":"Test description This test aims to verify that the option Power off system in the DTS menu turns off the DUT. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 10 and press Enter . Expected result The DUT should be turned off without any complications.","title":"DTS003.001 DTS option power-off DUT works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#dts004001-dts-option-reboot-dut-works-correctly","text":"Test description This test aims to verify that the option Reboot system in the DTS menu reboots the DUT. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 11 and press Enter . Expected result The DUT should be rebooted without any complications.","title":"DTS004.001 DTS option reboot DUT works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#dts005001-dts-drop-to-shell-option-works-correctly","text":"Test description This test aims to verify that the option Shell in the DTS menu opens Shell. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 9 and press Enter . Expected result Information about entering the shell and how to exit should be displayed. Shell command input should be activated. Example output: Entering shell, to leave type exit and press Enter or press LCtrl+D bash-5.1#","title":"DTS005.001 DTS drop-to-shell option works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#dts006001-flash-device-from-dts-shell-by-using-flashrom-works-correctly","text":"Test description This test aims to verify whether is the possibility to flash the DUT firmware by using flashrom in DTS Shell . Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. {PATH} = individual path to a specific binary. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type 9 and click Enter to launch Shell. Run the following command to obtain coreboot.rom binary: wget https://3mdeb.com/open-source-firmware/ { PATH } -O /tmp/coreboot.rom The above-described command is not the only way to obtain binary. For example, scp command might be used, too. Run the following command to flash the firmware: flashrom -p internal -w /tmp/coreboot.rom Additional parameters may be needed for the flashrom command depending on the DUT. Documentation describing the exact command to flash the specific platform is always available in localization: Supported hardware -> Platform name -> Initial Deployment . Power off the DUT. Repeat steps 2-6. Run the following command to check the firmware version: dmidecode -t 0 Note the results. Expected result The output of dmidecode command should contain information about the current firmware. The current firmware version should be equal to the binary version, which you were flashing. Example output: Version: Dasharo ( coreboot+UEFI ) v1.1.0","title":"DTS006.001 Flash device from DTS shell by using flashrom works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#dts007001-update-device-firmware-from-dts-shell-by-using-fwupd-works-correctly","text":"Test description This test aims to verify whether there is the possibility to update the DUT firmware by using fwupd in DTS. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 9 and press Enter . Run the following commands to update the firmware to the latest version: fwupdmgr refresh fwupdmgr update Power off the DUT. Repeat steps 2-6. Run the following command to check the firmware version: dmidecode -t 0 Note the results. Expected result The output of dmidecode command should contain information about the current firmware. The current firmware version should be equal to the binary version, which you were flashing. Example output: Version: Dasharo ( coreboot+UEFI ) v1.1.0","title":"DTS007.001 Update device firmware from DTS Shell by using fwupd works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#dts008001-flash-device-ec-firmware-by-using-dts-built-in-script-works-correctly","text":"Test description This test aims to verify whether there is the possibility to flash the DUT EC firmware by using the built-in script in DTS. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Proceed with Dasharo EC Transition . Expected result After the flashing procedure itself, the DUT should be able to boot. The EC firmware version, after checking the method described in the above-mentioned documentation , should correspond to the latest version.","title":"DTS008.001 Flash device EC firmware by using DTS built-in script works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/#dts009001-update-device-ec-firmware-by-using-dts-works-correctly","text":"Test description This test aims to verify whether there is the possibility to update the DUT EC firmware by using system76_ectool in DTS. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Plug the USB stick with DTS into the USB slot on the DUT. Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the USB stick with DTS using the arrow keys and press Enter . Wait for Enter an option: . Type in 9 and press Enter . Proceed with Dasharo EC Update . Expected result After the updating firmware procedure itself, the DUT should be able to boot. The EC firmware version, after checking the method described in the above-mentioned documentation , should correspond to the binary version used.","title":"DTS009.001 Update device EC firmware by using DTS works correctly"},{"location":"unified-test-documentation/dasharo-compatibility/326b-firmware-building-locally/","text":"Dasharo Compatibility: Firmware locally building and flashing Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Make yourself familiar with Building manual procedure dedicated for the relevant platform: NovaCustom laptops FLB001.001 Firmware locally build Test description This test aims to verify whether there is a possibility to build firmware on the local machine, based on Build manual procedure dedicated to the platform. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Based on the dedicated documentation build firmware. Check if the binary file, after finishing the building process, is available in the build location. Expected result The build location should contain the binary file, which size is equal to the flash chip size. FLB002.001 Flash locally built firmware Test description This test aims to verify whether there is a possibility to flash the locally built firmware to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Localize the firmware, which was built in the FLB001.001 test case. Flash the firmware by using the internal programmer and flashrom tool. If DUT is already flashed with the Dasharo firmware, the following command should be used: flashrom -p internal -w [ path-to-binary ] --fmap -i RW_SECTION_A Otherwise, the following command should be used: flashrom -p internal -w [ path-to-binary ] --ifd -i bios Reboot the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command to verify the results: sudo dmidecode -t bios | grep Version Expected result The output of dmidecode command should contain information about the current firmware. The current firmware version should be equal to the latest released firmware version. Example output: Version: Dasharo ( coreboot+UEFI ) v1.1.0","title":"Firmware locally building and flashing"},{"location":"unified-test-documentation/dasharo-compatibility/326b-firmware-building-locally/#dasharo-compatibility-firmware-locally-building-and-flashing","text":"","title":"Dasharo Compatibility: Firmware locally building and flashing"},{"location":"unified-test-documentation/dasharo-compatibility/326b-firmware-building-locally/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Make yourself familiar with Building manual procedure dedicated for the relevant platform: NovaCustom laptops","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/326b-firmware-building-locally/#flb001001-firmware-locally-build","text":"Test description This test aims to verify whether there is a possibility to build firmware on the local machine, based on Build manual procedure dedicated to the platform. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Based on the dedicated documentation build firmware. Check if the binary file, after finishing the building process, is available in the build location. Expected result The build location should contain the binary file, which size is equal to the flash chip size.","title":"FLB001.001 Firmware locally build"},{"location":"unified-test-documentation/dasharo-compatibility/326b-firmware-building-locally/#flb002001-flash-locally-built-firmware","text":"Test description This test aims to verify whether there is a possibility to flash the locally built firmware to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Localize the firmware, which was built in the FLB001.001 test case. Flash the firmware by using the internal programmer and flashrom tool. If DUT is already flashed with the Dasharo firmware, the following command should be used: flashrom -p internal -w [ path-to-binary ] --fmap -i RW_SECTION_A Otherwise, the following command should be used: flashrom -p internal -w [ path-to-binary ] --ifd -i bios Reboot the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command to verify the results: sudo dmidecode -t bios | grep Version Expected result The output of dmidecode command should contain information about the current firmware. The current firmware version should be equal to the latest released firmware version. Example output: Version: Dasharo ( coreboot+UEFI ) v1.1.0","title":"FLB002.001 Flash locally built firmware"},{"location":"unified-test-documentation/dasharo-compatibility/327-embedded_controller_flashing/","text":"Dasharo Compatibility: Embedded controller flashing ECF001.001 EC firmware external flashing Test description This test aims to verify whether there is the possibility to flash the DUT EC firmware externally using Arduino. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Make yourself familiar with EC recovery documentation . Test steps Prepare the hardware for flashing in accordance with the Prerequisites section . Prepare the firmware in accordance with the Preparation section . Flash the EC firmware in accordance with the Flashing section . Note the results. Expected result The output of the last command should contain information about the correctly performed procedure: Successfully programmed SPI ROM","title":"Embedded controller flashing"},{"location":"unified-test-documentation/dasharo-compatibility/327-embedded_controller_flashing/#dasharo-compatibility-embedded-controller-flashing","text":"","title":"Dasharo Compatibility: Embedded controller flashing"},{"location":"unified-test-documentation/dasharo-compatibility/327-embedded_controller_flashing/#ecf001001-ec-firmware-external-flashing","text":"Test description This test aims to verify whether there is the possibility to flash the DUT EC firmware externally using Arduino. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Make yourself familiar with EC recovery documentation . Test steps Prepare the hardware for flashing in accordance with the Prerequisites section . Prepare the firmware in accordance with the Preparation section . Flash the EC firmware in accordance with the Flashing section . Note the results. Expected result The output of the last command should contain information about the correctly performed procedure: Successfully programmed SPI ROM","title":"ECF001.001 EC firmware external flashing"},{"location":"unified-test-documentation/dasharo-compatibility/328-logo-customization-functionality/","text":"Dasharo Compatibility: Logo customization functionality Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Get familiar with Logo customization procedure LCM001.001 Replace logo in existing image and flashing firmware Test description The test aims to verify whether replacing the logo in the existing image is possible and, whether after flashing the DUT with the new image, the new logo will be shown properly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Current Dasharo firmware dedicated for the platform. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the boot menu. Select the iPXE Network boot option using the arrow keys and press Enter . Select the iPXE Shell option using the arrow keys and press Enter . Configure communication interface by using the following command: dhcp Connect to the DTS ipxe menu by using the following command: chain http://boot.3mdeb.com/dts.ipxe Wait for Enter an option: . Type in 9 and press Enter . Based on the dedicated documentation replace the logo in an existing image. Reboot the DUT and observe the boot logo. Expected result During the DUT booting process, custom logo should appear on the screen. LCM002.001 Build image with custom logo and flashing firmware Test description This test aims to verify whether building an image with the custom logo is possible and, whether after flashing the DUT with the new image, the new logo will be shown properly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Based on the dedicated documentation build firmware with the custom logo. Flash the firmware by using the internal programmer and flashrom tool. If DUT is already flashed with the Dasharo firmware and only the logo should be replaced, the following command should be used: sudo flashrom -p internal --fmap -i BOOTSPLASH -w [ path ] If also the procedure of Dasharo firmware updating should be performed, the following command should be used: flashrom -p internal -w [ path-to-binary ] --fmap -i RW_SECTION_A In any other cases, the following command should be used: flashrom -p internal -w [ path-to-binary ] --ifd -i bios Reboot DUT. Expected result During the DUT booting process, custom logo should appear on the screen. LCM003.001 Attempt to flash firmware with improper image Test description This test aims to verify whether the attempt to flash the DUT with firmware with an improper logo is possible but will result in a fallback to the default logo. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Based on the dedicated documentation build firmware with the logo, that that does not meet the Quality criteria . Flash the firmware by using the internal programmer and flashrom tool. If DUT is already flashed with the Dasharo firmware and only the logo should be replaced, the following command should be used: sudo flashrom -p internal --fmap -i BOOTSPLASH -w [ path ] If also the procedure of Dasharo firmware updating should be performed, the following command should be used: flashrom -p internal -w [ path-to-binary ] --fmap -i RW_SECTION_A In any other cases, the following command should be used: flashrom -p internal -w [ path-to-binary ] --ifd -i bios Reboot DUT. Expected result During the DUT booting process, the default logo should appear on the screen.","title":"Logo customization"},{"location":"unified-test-documentation/dasharo-compatibility/328-logo-customization-functionality/#dasharo-compatibility-logo-customization-functionality","text":"","title":"Dasharo Compatibility: Logo customization functionality"},{"location":"unified-test-documentation/dasharo-compatibility/328-logo-customization-functionality/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Get familiar with Logo customization procedure","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/328-logo-customization-functionality/#lcm001001-replace-logo-in-existing-image-and-flashing-firmware","text":"Test description The test aims to verify whether replacing the logo in the existing image is possible and, whether after flashing the DUT with the new image, the new logo will be shown properly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Current Dasharo firmware dedicated for the platform. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the boot menu. Select the iPXE Network boot option using the arrow keys and press Enter . Select the iPXE Shell option using the arrow keys and press Enter . Configure communication interface by using the following command: dhcp Connect to the DTS ipxe menu by using the following command: chain http://boot.3mdeb.com/dts.ipxe Wait for Enter an option: . Type in 9 and press Enter . Based on the dedicated documentation replace the logo in an existing image. Reboot the DUT and observe the boot logo. Expected result During the DUT booting process, custom logo should appear on the screen.","title":"LCM001.001 Replace logo in existing image and flashing firmware"},{"location":"unified-test-documentation/dasharo-compatibility/328-logo-customization-functionality/#lcm002001-build-image-with-custom-logo-and-flashing-firmware","text":"Test description This test aims to verify whether building an image with the custom logo is possible and, whether after flashing the DUT with the new image, the new logo will be shown properly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Based on the dedicated documentation build firmware with the custom logo. Flash the firmware by using the internal programmer and flashrom tool. If DUT is already flashed with the Dasharo firmware and only the logo should be replaced, the following command should be used: sudo flashrom -p internal --fmap -i BOOTSPLASH -w [ path ] If also the procedure of Dasharo firmware updating should be performed, the following command should be used: flashrom -p internal -w [ path-to-binary ] --fmap -i RW_SECTION_A In any other cases, the following command should be used: flashrom -p internal -w [ path-to-binary ] --ifd -i bios Reboot DUT. Expected result During the DUT booting process, custom logo should appear on the screen.","title":"LCM002.001 Build image with custom logo and flashing firmware"},{"location":"unified-test-documentation/dasharo-compatibility/328-logo-customization-functionality/#lcm003001-attempt-to-flash-firmware-with-improper-image","text":"Test description This test aims to verify whether the attempt to flash the DUT with firmware with an improper logo is possible but will result in a fallback to the default logo. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Based on the dedicated documentation build firmware with the logo, that that does not meet the Quality criteria . Flash the firmware by using the internal programmer and flashrom tool. If DUT is already flashed with the Dasharo firmware and only the logo should be replaced, the following command should be used: sudo flashrom -p internal --fmap -i BOOTSPLASH -w [ path ] If also the procedure of Dasharo firmware updating should be performed, the following command should be used: flashrom -p internal -w [ path-to-binary ] --fmap -i RW_SECTION_A In any other cases, the following command should be used: flashrom -p internal -w [ path-to-binary ] --ifd -i bios Reboot DUT. Expected result During the DUT booting process, the default logo should appear on the screen.","title":"LCM003.001 Attempt to flash firmware with improper image"},{"location":"unified-test-documentation/dasharo-compatibility/341-pfSense-support/","text":"Dasharo Compatibility: pfSense support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . PFS001.001 pfSense stable (serial output) installation on Hard Disk Test description This test aims to verify that PfSense stable (serial output) could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed. PFS001.002 Boot pfSense stable (serial output) from Hard Disk Test description This test aims to verify that pfSense stable (serial output) could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. PFS002.001 pfSense stable (VGA output) installation on Hard Disk Test description This test aims to verify that pfSense stable (VGA output) could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed. PFS002.002 Boot pfSense stable (VGA output) from Hard Disk Test description This test aims to verify that pfSense stable (VGA output) could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"pfSense support"},{"location":"unified-test-documentation/dasharo-compatibility/341-pfSense-support/#dasharo-compatibility-pfsense-support","text":"","title":"Dasharo Compatibility: pfSense support"},{"location":"unified-test-documentation/dasharo-compatibility/341-pfSense-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/341-pfSense-support/#pfs001001-pfsense-stable-serial-output-installation-on-hard-disk","text":"Test description This test aims to verify that PfSense stable (serial output) could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed.","title":"PFS001.001 pfSense stable (serial output) installation on Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/341-pfSense-support/#pfs001002-boot-pfsense-stable-serial-output-from-hard-disk","text":"Test description This test aims to verify that pfSense stable (serial output) could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"PFS001.002 Boot pfSense stable (serial output) from Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/341-pfSense-support/#pfs002001-pfsense-stable-vga-output-installation-on-hard-disk","text":"Test description This test aims to verify that pfSense stable (VGA output) could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed.","title":"PFS002.001 pfSense stable (VGA output) installation on Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/341-pfSense-support/#pfs002002-boot-pfsense-stable-vga-output-from-hard-disk","text":"Test description This test aims to verify that pfSense stable (VGA output) could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"PFS002.002 Boot pfSense stable (VGA output) from Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/342-OPNsense-support/","text":"Dasharo Compatibility: OPNsense support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . OPN001.001 OPNsense stable (serial output) installation on Hard Disk Test description This test aims to verify that OPNsense stable (serial output) could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed. OPN001.002 Boot OPNsense stable (serial output) from Hard Disk Test description This test aims to verify that OPNsense stable serial could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. OPN002.001 OPNsense stable (VGA output) installation on Hard Disk Test description This test aims to verify that OPNsense stable (VGA output) could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed. OPN002.002 Boot OPNsense stable (VGA output) from Hard Disk Test description This test aims to verify that OPNsense stable (VGA output) could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"OPNsense support"},{"location":"unified-test-documentation/dasharo-compatibility/342-OPNsense-support/#dasharo-compatibility-opnsense-support","text":"","title":"Dasharo Compatibility: OPNsense support"},{"location":"unified-test-documentation/dasharo-compatibility/342-OPNsense-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/342-OPNsense-support/#opn001001-opnsense-stable-serial-output-installation-on-hard-disk","text":"Test description This test aims to verify that OPNsense stable (serial output) could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed.","title":"OPN001.001 OPNsense stable (serial output) installation on Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/342-OPNsense-support/#opn001002-boot-opnsense-stable-serial-output-from-hard-disk","text":"Test description This test aims to verify that OPNsense stable serial could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"OPN001.002 Boot OPNsense stable (serial output) from Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/342-OPNsense-support/#opn002001-opnsense-stable-vga-output-installation-on-hard-disk","text":"Test description This test aims to verify that OPNsense stable (VGA output) could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed.","title":"OPN002.001 OPNsense stable (VGA output) installation on Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/342-OPNsense-support/#opn002002-boot-opnsense-stable-vga-output-from-hard-disk","text":"Test description This test aims to verify that OPNsense stable (VGA output) could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"OPN002.002 Boot OPNsense stable (VGA output) from Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/343-super-I-O-initialization-on-QubesOS/","text":"Dasharo compatibility: Super I/O initialization - QubesOS Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . PPS001.001 PS/2 keyboard detection Test description This test aims to verify that the external PS/2 keyboard is detected correctly by the OPERATING_SYSTEM and that all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Install libinput-tools in dom0 on the DUT. Connect the external PS/2 keyboard to the PS/2 port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window in dom0 and run the following command: sudo dmesg | grep -i PS/2 Run the following command in the terminal: libinput debug-events --show-keycodes Test the alphanumeric keys and note the generated keycodes. Test non-alphanumeric keys and verify that they generate the correct keycodes. Test key combinations with the Shift , Ctrl and Alt modifier keys (this tests 2-key rollover). Expected result The external PS/2 keyboard is detected in OS. All standard keyboard keys generate the correct keycodes and events as per their labels. Key combinations are detected correctly.","title":"Super I/O initialization - QubesOS"},{"location":"unified-test-documentation/dasharo-compatibility/343-super-I-O-initialization-on-QubesOS/#dasharo-compatibility-super-io-initialization-qubesos","text":"","title":"Dasharo compatibility: Super I/O initialization - QubesOS"},{"location":"unified-test-documentation/dasharo-compatibility/343-super-I-O-initialization-on-QubesOS/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/343-super-I-O-initialization-on-QubesOS/#pps001001-ps2-keyboard-detection","text":"Test description This test aims to verify that the external PS/2 keyboard is detected correctly by the OPERATING_SYSTEM and that all basic keys work according to their labels. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Install libinput-tools in dom0 on the DUT. Connect the external PS/2 keyboard to the PS/2 port. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window in dom0 and run the following command: sudo dmesg | grep -i PS/2 Run the following command in the terminal: libinput debug-events --show-keycodes Test the alphanumeric keys and note the generated keycodes. Test non-alphanumeric keys and verify that they generate the correct keycodes. Test key combinations with the Shift , Ctrl and Alt modifier keys (this tests 2-key rollover). Expected result The external PS/2 keyboard is detected in OS. All standard keyboard keys generate the correct keycodes and events as per their labels. Key combinations are detected correctly.","title":"PPS001.001 PS/2 keyboard detection"},{"location":"unified-test-documentation/dasharo-compatibility/344-power-operations/","text":"Dasharo compatibility: Device power control operations Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . DPC001.001 Reset button (QubesOS) Test description This test aims to verify that the reset button works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Observe the power LED and use the reset button. Note the results. Expected result The DUT should perform a reset, the power LED should be on all the time. The DUT shouldn't perform a power cycle, the power LED shouldn't be off even for a moment.","title":"Device power control operations"},{"location":"unified-test-documentation/dasharo-compatibility/344-power-operations/#dasharo-compatibility-device-power-control-operations","text":"","title":"Dasharo compatibility: Device power control operations"},{"location":"unified-test-documentation/dasharo-compatibility/344-power-operations/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/344-power-operations/#dpc001001-reset-button-qubesos","text":"Test description This test aims to verify that the reset button works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Observe the power LED and use the reset button. Note the results. Expected result The DUT should perform a reset, the power LED should be on all the time. The DUT shouldn't perform a power cycle, the power LED shouldn't be off even for a moment.","title":"DPC001.001 Reset button (QubesOS)"},{"location":"unified-test-documentation/dasharo-compatibility/345-display-resolution/","text":"Dasharo compatibility: Display resolution - QubesOS Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . DSR001.001 Changing the display resolution Test description This test aims to verify that the display resolution could be changed in the OPERATING_SYSTEM and that the GUI is displayed correctly after this change. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Connect any display. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window in dom0 and run the following command: xrandr -s Note the results. Expected result Changing the display resolution is possible. After changing the resolution, all icons and subtitles should be displayed correctly.","title":"Display Resolution - QubesOS"},{"location":"unified-test-documentation/dasharo-compatibility/345-display-resolution/#dasharo-compatibility-display-resolution-qubesos","text":"","title":"Dasharo compatibility: Display resolution - QubesOS"},{"location":"unified-test-documentation/dasharo-compatibility/345-display-resolution/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/345-display-resolution/#dsr001001-changing-the-display-resolution","text":"Test description This test aims to verify that the display resolution could be changed in the OPERATING_SYSTEM and that the GUI is displayed correctly after this change. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = QubesOS stable Test setup Proceed with the Test cases common documentation section. Connect any display. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window in dom0 and run the following command: xrandr -s Note the results. Expected result Changing the display resolution is possible. After changing the resolution, all icons and subtitles should be displayed correctly.","title":"DSR001.001 Changing the display resolution"},{"location":"unified-test-documentation/dasharo-compatibility/346-SATA-hotplug-detection/","text":"Dasharo compatibility: SATA hot plug Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . SHT001.001 SATA hot plug (firmware) Test description This test aims to verify that the disk connected to the SATA port could be detected after hot-plug. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Any operating system should be installed on the SATA disk. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the UEFI Shell option using the arrow keys and press Enter . Execute the following command in the shell: map -t hd Note the results. Connect the disk to the SATA port. Execute the following command in the shell: map -t hd -r Expected result The output of the first command should contain mapping table for all hard disks connected to the device. The output of the second command should contain refreshed mapping table for all hard disks connected to the device. The refreshed list should contain additional item - mounted SATA disk. SHT001.002 SATA hot plug (Ubuntu 22.04) Test description This test aims to verify that the disk connected to the SATA port could be detected after hot-plug. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect the disk to the SATA port. Check that the connected disk is detected by running the following command: sudo parted -l Note the results. Expected result The SATA disk should be detected in OS, example output: ( ... ) Model: ATA SSDPR-CL100-240- ( scsi ) Disk /dev/sda: 240GB Sector size ( logical/physical ) : 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 538MB 537MB fat32 EFI System Partition boot, esp 2 538MB 240GB 240GB ext4 ( ... ) SHT001.003 SATA hot plug (Windows 11) Test description This test aims to verify that the disk connected to the SATA port could be detected after hot-plug. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect the disk to the SATA port. Check that the connected disk is detected by running the following command: Get-WMIObject -Class Win32_DiskDrive Note the results. Expected result The SATA disk should be detected in OS, example output: (...) Partitions : 4 DeviceID : \\\\.\\ PHYSICALDRIVE0 Model : SSDPR-CL100 - 240-G2 Size : 240054796800 Caption : SSDPR-CL100 - 240-G2 (...)","title":"SATA hot plug"},{"location":"unified-test-documentation/dasharo-compatibility/346-SATA-hotplug-detection/#dasharo-compatibility-sata-hot-plug","text":"","title":"Dasharo compatibility: SATA hot plug"},{"location":"unified-test-documentation/dasharo-compatibility/346-SATA-hotplug-detection/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/346-SATA-hotplug-detection/#sht001001-sata-hot-plug-firmware","text":"Test description This test aims to verify that the disk connected to the SATA port could be detected after hot-plug. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Any operating system should be installed on the SATA disk. Test steps Power on the DUT. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Select the UEFI Shell option using the arrow keys and press Enter . Execute the following command in the shell: map -t hd Note the results. Connect the disk to the SATA port. Execute the following command in the shell: map -t hd -r Expected result The output of the first command should contain mapping table for all hard disks connected to the device. The output of the second command should contain refreshed mapping table for all hard disks connected to the device. The refreshed list should contain additional item - mounted SATA disk.","title":"SHT001.001 SATA hot plug (firmware)"},{"location":"unified-test-documentation/dasharo-compatibility/346-SATA-hotplug-detection/#sht001002-sata-hot-plug-ubuntu-2204","text":"Test description This test aims to verify that the disk connected to the SATA port could be detected after hot-plug. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect the disk to the SATA port. Check that the connected disk is detected by running the following command: sudo parted -l Note the results. Expected result The SATA disk should be detected in OS, example output: ( ... ) Model: ATA SSDPR-CL100-240- ( scsi ) Disk /dev/sda: 240GB Sector size ( logical/physical ) : 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 538MB 537MB fat32 EFI System Partition boot, esp 2 538MB 240GB 240GB ext4 ( ... )","title":"SHT001.002 SATA hot plug (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/346-SATA-hotplug-detection/#sht001003-sata-hot-plug-windows-11","text":"Test description This test aims to verify that the disk connected to the SATA port could be detected after hot-plug. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Connect the disk to the SATA port. Check that the connected disk is detected by running the following command: Get-WMIObject -Class Win32_DiskDrive Note the results. Expected result The SATA disk should be detected in OS, example output: (...) Partitions : 4 DeviceID : \\\\.\\ PHYSICALDRIVE0 Model : SSDPR-CL100 - 240-G2 Size : 240054796800 Caption : SSDPR-CL100 - 240-G2 (...)","title":"SHT001.003 SATA hot plug (Windows 11)"},{"location":"unified-test-documentation/dasharo-compatibility/347-sign-of-life/","text":"Dasharo compatibility: Sign of life Test cases common documentation Test setup Proceed with the Generic test setup: firmware . SOL001.001 SOL string shows Dasharo firmware and EC version Test description This test aims to verify that the information about the version of Dasharo firmware and Dasharo EC firmware is recognized correctly and displayed during the boot phase. Test configuration data FIRMWARE = Dasharo EC firmware = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Sign of life string. Note the results. Expected result During the boot phase, the information about the version of Dasharo firmware and Dasharo EC firmware should be displayed. Example output: Firmware version: Dasahro ( coreboot+UEFI ) v1.5.0 EC firmware version: 2023 -03-20_c398446 SOL002.001 SOL string shows information about proprietary EC Test description This test aims to verify that the information about the version of Dasharo firmware and proprietary EC firmware is recognized correctly and displayed during the boot phase. Test configuration data FIRMWARE = Dasharo EC firmware = Proprietary Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Sign of life string. Note the results. Expected result During the boot phase, the information about the version of Dasharo firmware and proprietary EC firmware should be displayed. In addition, the prompt asking for updated EC firmware should be displayed also. Example output: Firmware version: Dasahro ( coreboot+UEFI ) v1.5.0 EC firmware version: 1 .07.02 Proprietary EC firmware detected! Please update your EC firmware per docs.dasharo.com instructions!","title":"Sign of life"},{"location":"unified-test-documentation/dasharo-compatibility/347-sign-of-life/#dasharo-compatibility-sign-of-life","text":"","title":"Dasharo compatibility: Sign of life"},{"location":"unified-test-documentation/dasharo-compatibility/347-sign-of-life/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/347-sign-of-life/#sol001001-sol-string-shows-dasharo-firmware-and-ec-version","text":"Test description This test aims to verify that the information about the version of Dasharo firmware and Dasharo EC firmware is recognized correctly and displayed during the boot phase. Test configuration data FIRMWARE = Dasharo EC firmware = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Sign of life string. Note the results. Expected result During the boot phase, the information about the version of Dasharo firmware and Dasharo EC firmware should be displayed. Example output: Firmware version: Dasahro ( coreboot+UEFI ) v1.5.0 EC firmware version: 2023 -03-20_c398446","title":"SOL001.001 SOL string shows Dasharo firmware and EC version"},{"location":"unified-test-documentation/dasharo-compatibility/347-sign-of-life/#sol002001-sol-string-shows-information-about-proprietary-ec","text":"Test description This test aims to verify that the information about the version of Dasharo firmware and proprietary EC firmware is recognized correctly and displayed during the boot phase. Test configuration data FIRMWARE = Dasharo EC firmware = Proprietary Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Wait for the Sign of life string. Note the results. Expected result During the boot phase, the information about the version of Dasharo firmware and proprietary EC firmware should be displayed. In addition, the prompt asking for updated EC firmware should be displayed also. Example output: Firmware version: Dasahro ( coreboot+UEFI ) v1.5.0 EC firmware version: 1 .07.02 Proprietary EC firmware detected! Please update your EC firmware per docs.dasharo.com instructions!","title":"SOL002.001 SOL string shows information about proprietary EC"},{"location":"unified-test-documentation/dasharo-compatibility/348-proxmox-support/","text":"Dasharo Compatibility: Proxmox support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . PVE001.001 Proxmox Virtual Environment stable installation on Hard Disk Test description This test aims to verify that Proxmox VE stable could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Proxmox VE stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed. PVE001.002 Boot Proxmox Virtual Environment stable from Hard Disk Test description This test aims to verify that Proxmox VE stable could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Proxmox VE stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"Proxmox support"},{"location":"unified-test-documentation/dasharo-compatibility/348-proxmox-support/#dasharo-compatibility-proxmox-support","text":"","title":"Dasharo Compatibility: Proxmox support"},{"location":"unified-test-documentation/dasharo-compatibility/348-proxmox-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/348-proxmox-support/#pve001001-proxmox-virtual-environment-stable-installation-on-hard-disk","text":"Test description This test aims to verify that Proxmox VE stable could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Proxmox VE stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed.","title":"PVE001.001 Proxmox Virtual Environment stable installation on Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/348-proxmox-support/#pve001002-boot-proxmox-virtual-environment-stable-from-hard-disk","text":"Test description This test aims to verify that Proxmox VE stable could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Proxmox VE stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"PVE001.002 Boot Proxmox Virtual Environment stable from Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/349-ubuntu-server-support/","text":"Dasharo Compatibility: Ubuntu Server support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . USS001.001 Ubuntu Server stable installation on Hard Disk Test description This test aims to verify that Ubuntu Server stable could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu Server stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed. USS001.002 Boot Ubuntu Server stable from Hard Disk Test description This test aims to verify that Ubuntu Server stable could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu Server stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"Ubuntu Server support"},{"location":"unified-test-documentation/dasharo-compatibility/349-ubuntu-server-support/#dasharo-compatibility-ubuntu-server-support","text":"","title":"Dasharo Compatibility: Ubuntu Server support"},{"location":"unified-test-documentation/dasharo-compatibility/349-ubuntu-server-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/349-ubuntu-server-support/#uss001001-ubuntu-server-stable-installation-on-hard-disk","text":"Test description This test aims to verify that Ubuntu Server stable could be installed on the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu Server stable Test setup Proceed with the Test cases common documentation section. Test steps According to the Documentation perform the OS installation process. Expected result The information about successful installation should be displayed.","title":"USS001.001 Ubuntu Server stable installation on Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/349-ubuntu-server-support/#uss001002-boot-ubuntu-server-stable-from-hard-disk","text":"Test description This test aims to verify that Ubuntu Server stable could be booted from the hard disk on the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu Server stable Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the device on which the system was previously installed. Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"USS001.002 Boot Ubuntu Server stable from Hard Disk"},{"location":"unified-test-documentation/dasharo-compatibility/357-bios-menu-function-keys/","text":"Dasharo Compatibility: BIOS menu function keys Test cases common documentation Test setup Proceed with the Generic test setup: firmware . BMF001.001 Reset to Defaults option Test description This test aims to verify that the F9 key feature properly reset to Defaults all Dasharo System Features settings. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Enter the any of submenus eg. Power Management Options . Verify that the F9=Reset to Defaults entry is displayed at the bottom of the screen. Press F9 to reset options to defaults. Press Y to confirm saving the changes. Go back to the main menu using the ESC key. If necessary - press Y to confirm saving the changes again. Select the Reset option to apply the settings and reboot. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Check the state of each option in each submenu. Note the results. Expected result The F9=Reset to Defaults entry is displayed in each submenu of Dasharo System Features. After using the F9 key, all Dasharo System Features options should be set to default. All options covered by this functionality can be found here .","title":"BIOS menu function keys"},{"location":"unified-test-documentation/dasharo-compatibility/357-bios-menu-function-keys/#dasharo-compatibility-bios-menu-function-keys","text":"","title":"Dasharo Compatibility: BIOS menu function keys"},{"location":"unified-test-documentation/dasharo-compatibility/357-bios-menu-function-keys/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/357-bios-menu-function-keys/#bmf001001-reset-to-defaults-option","text":"Test description This test aims to verify that the F9 key feature properly reset to Defaults all Dasharo System Features settings. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Enter the any of submenus eg. Power Management Options . Verify that the F9=Reset to Defaults entry is displayed at the bottom of the screen. Press F9 to reset options to defaults. Press Y to confirm saving the changes. Go back to the main menu using the ESC key. If necessary - press Y to confirm saving the changes again. Select the Reset option to apply the settings and reboot. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Check the state of each option in each submenu. Note the results. Expected result The F9=Reset to Defaults entry is displayed in each submenu of Dasharo System Features. After using the F9 key, all Dasharo System Features options should be set to default. All options covered by this functionality can be found here .","title":"BMF001.001 Reset to Defaults option"},{"location":"unified-test-documentation/dasharo-compatibility/358-suspend-mechanism-switching-S0ix-S3/","text":"Dasharo Compatibility: Suspend mechanism switching (S0ix/S3) Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . SMS001.001 Suspend to Idle (S0ix) check (Ubuntu 22.04) Test description This test aims to verify whether the Suspend to Idle (S0ix) option selected in the BIOS firmware is correctly recognised in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Enter the BIOS setup using BIOS_SETUP_KEY . Inside the BIOS setup, navigate to Dasharo System Features -> Power Management Options -> Platform Sleep Type and choose the option Suspend to Idle (S0ix) . Press F10 and confirm with y key to save selected settings. Select reset option to reboot the system. After the system reboots, log into the system by using the proper login and password. Open a terminal window and execute the following command to confirm that Suspend to Idle (S0ix) mode is enabled and properly recognised in the OS: sudo cat /sys/power/mem_sleep Note the results. Expected result The output from the command above should contain the phrase s2idle enclosed in square brackets, indicating that the Suspend to Idle (S0ix) mode is enabled. Example output: [ s2idle ] shallow SMS001.002 Suspend to RAM (S3) check (Ubuntu 22.04) Test description This test aims to verify whether the Suspend to RAM (S3) option selected in the BIOS firmware is correctly recognised in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Enter the BIOS setup using BIOS_SETUP_KEY . Inside the BIOS setup, navigate to Dasharo System Features -> Power Management Options -> Platform Sleep Type and choose the option Suspend to RAM (S3) . Press F10 and confirm with y key to save selected settings. Select reset option to reboot the system. After the system reboots, log into the system by using the proper login and password. Open a terminal window and execute the following command to confirm that Suspend to RAM (S3) mode is enabled and properly recognised in the OS: sudo cat /sys/power/mem_sleep Note the results. Expected result The output from the command above should contain the phrase deep enclosed in square brackets, indicating that the Suspend to RAM (S3) mode is enabled. Example output: s2idle [ deep ]","title":"Suspend Mechanism Switching S0ix/S3"},{"location":"unified-test-documentation/dasharo-compatibility/358-suspend-mechanism-switching-S0ix-S3/#dasharo-compatibility-suspend-mechanism-switching-s0ixs3","text":"","title":"Dasharo Compatibility: Suspend mechanism switching (S0ix/S3)"},{"location":"unified-test-documentation/dasharo-compatibility/358-suspend-mechanism-switching-S0ix-S3/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/358-suspend-mechanism-switching-S0ix-S3/#sms001001-suspend-to-idle-s0ix-check-ubuntu-2204","text":"Test description This test aims to verify whether the Suspend to Idle (S0ix) option selected in the BIOS firmware is correctly recognised in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Enter the BIOS setup using BIOS_SETUP_KEY . Inside the BIOS setup, navigate to Dasharo System Features -> Power Management Options -> Platform Sleep Type and choose the option Suspend to Idle (S0ix) . Press F10 and confirm with y key to save selected settings. Select reset option to reboot the system. After the system reboots, log into the system by using the proper login and password. Open a terminal window and execute the following command to confirm that Suspend to Idle (S0ix) mode is enabled and properly recognised in the OS: sudo cat /sys/power/mem_sleep Note the results. Expected result The output from the command above should contain the phrase s2idle enclosed in square brackets, indicating that the Suspend to Idle (S0ix) mode is enabled. Example output: [ s2idle ] shallow","title":"SMS001.001 Suspend to Idle (S0ix) check (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/358-suspend-mechanism-switching-S0ix-S3/#sms001002-suspend-to-ram-s3-check-ubuntu-2204","text":"Test description This test aims to verify whether the Suspend to RAM (S3) option selected in the BIOS firmware is correctly recognised in the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Enter the BIOS setup using BIOS_SETUP_KEY . Inside the BIOS setup, navigate to Dasharo System Features -> Power Management Options -> Platform Sleep Type and choose the option Suspend to RAM (S3) . Press F10 and confirm with y key to save selected settings. Select reset option to reboot the system. After the system reboots, log into the system by using the proper login and password. Open a terminal window and execute the following command to confirm that Suspend to RAM (S3) mode is enabled and properly recognised in the OS: sudo cat /sys/power/mem_sleep Note the results. Expected result The output from the command above should contain the phrase deep enclosed in square brackets, indicating that the Suspend to RAM (S3) mode is enabled. Example output: s2idle [ deep ]","title":"SMS001.002 Suspend to RAM (S3) check (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-compatibility/S30-fan-speed/","text":"Dasharo Compatibility: Fan speed measure Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . FAN001.001 CPU fan speed measure Test description This test aims to verify that the CPU fan works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Install lm-sensors on the DUT. If the command in the 4th step fails, make sure the system76_acpi driver is available on your system. An appropriate kernel version could be installed with the command sudo apt install linux-oem-22.04a , which version definitely supports this driver. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. In the terminal window run the following command to get the RPM value of the CPU fan: sensors | grep \"CPU fan\" Note the results. Expected result The CPU fan RPM value is displayed and isn't zero. Example output: CPU fan: 4347 RPM FAN002.001 GPU fan speed measure Test description The fan has been configured to follow a custom curve. This test aims to verify that the fan curve is configured correctly and the fan spins up and down according to the defined values. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Install nvidia-smi and mesa-utils on the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the terminal window and execute the following command: watch -n1 nvidia-smi Verify using that the temperature is below 40\u00b0C. If the temperature is above 40, enable the fan turbo mode (Fn + 1) until it cools down. Flip the laptop over and check if the GPU fan (located under the Escape key) is spinning. In another terminal window, run the following command: _NV_PRIME_RENDER_OFFLOAD = 1 __GLX_VENDOR_LIBRARY_NAME = nvidia __GL_SYNC_TO_VBLANK = 0 glxgears Verify that the temperature increases above 40. Flip the laptop over and check if the GPU fan is spinning. Expected result The fan should not be spinning while the temperature is below 40 degrees. The fan should be spinning while the temperature is above 40 degrees.","title":"Fan speed"},{"location":"unified-test-documentation/dasharo-compatibility/S30-fan-speed/#dasharo-compatibility-fan-speed-measure","text":"","title":"Dasharo Compatibility: Fan speed measure"},{"location":"unified-test-documentation/dasharo-compatibility/S30-fan-speed/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-compatibility/S30-fan-speed/#fan001001-cpu-fan-speed-measure","text":"Test description This test aims to verify that the CPU fan works correctly. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Install lm-sensors on the DUT. If the command in the 4th step fails, make sure the system76_acpi driver is available on your system. An appropriate kernel version could be installed with the command sudo apt install linux-oem-22.04a , which version definitely supports this driver. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. In the terminal window run the following command to get the RPM value of the CPU fan: sensors | grep \"CPU fan\" Note the results. Expected result The CPU fan RPM value is displayed and isn't zero. Example output: CPU fan: 4347 RPM","title":"FAN001.001 CPU fan speed measure"},{"location":"unified-test-documentation/dasharo-compatibility/S30-fan-speed/#fan002001-gpu-fan-speed-measure","text":"Test description The fan has been configured to follow a custom curve. This test aims to verify that the fan curve is configured correctly and the fan spins up and down according to the defined values. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Install nvidia-smi and mesa-utils on the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the terminal window and execute the following command: watch -n1 nvidia-smi Verify using that the temperature is below 40\u00b0C. If the temperature is above 40, enable the fan turbo mode (Fn + 1) until it cools down. Flip the laptop over and check if the GPU fan (located under the Escape key) is spinning. In another terminal window, run the following command: _NV_PRIME_RENDER_OFFLOAD = 1 __GLX_VENDOR_LIBRARY_NAME = nvidia __GL_SYNC_TO_VBLANK = 0 glxgears Verify that the temperature increases above 40. Flip the laptop over and check if the GPU fan is spinning. Expected result The fan should not be spinning while the temperature is below 40 degrees. The fan should be spinning while the temperature is above 40 degrees.","title":"FAN002.001 GPU fan speed measure"},{"location":"unified-test-documentation/dasharo-compatibility/S31-coreboot-fan-control/","text":"Dasharo Compatibility: coreboot Fan Control FAN001.001 Check CPU entry temperature and CPU fan speed Test description This test aims to verify that data for CPU temperature and CPU fan speed is available. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the proper number for USB_STICK option. Wait for debian login: . Type proper login. Wait for Password: . Type the proper password. Wait for root@debian:~# . Execute watch -n 1 \"sensors w83795g-i2c-1-2f |grep fan1 -A 16\" . Expected result There are visible data for fan1 and temp7 which represents CPU fan speed and CPU temperature. FAN001.002 Check if increasing CPU temperature increases CPU fan speed Test description This test aims to verify that CPU fan speed responds properly to increasing CPU temperature. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the proper number for USB_STICK option. Wait for debian login: . Type proper login. Wait for Password: . Type the proper password. Wait for root@debian:~# . Install stress-ng package by executing: sudo apt install stress-ng . Confirm installation by typing Y and pressing Enter when asked. Execute command: watch -n 1 \"sensors w83795g-i2c-1-2f |grep fan1 -A 16\" and check current CPU temperature and CPU fan speed. Execute command: stress-ng --cpu 16 --io 8 --vm 4 --vm-bytes 4G --timeout 30s --metrics . Wait 2 minutes. Execute command: watch -n 1 \"sensors w83795g-i2c-1-2f |grep fan1 -A 16\" and check current CPU temperature and CPU fan speed. Expected result The CPU temperature after the second check is higher at least 20 degrees. The CPU fan speed after the second check is higher at least 1000 RPM.","title":"coreboot Fan control"},{"location":"unified-test-documentation/dasharo-compatibility/S31-coreboot-fan-control/#dasharo-compatibility-coreboot-fan-control","text":"","title":"Dasharo Compatibility: coreboot Fan Control"},{"location":"unified-test-documentation/dasharo-compatibility/S31-coreboot-fan-control/#fan001001-check-cpu-entry-temperature-and-cpu-fan-speed","text":"Test description This test aims to verify that data for CPU temperature and CPU fan speed is available. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the proper number for USB_STICK option. Wait for debian login: . Type proper login. Wait for Password: . Type the proper password. Wait for root@debian:~# . Execute watch -n 1 \"sensors w83795g-i2c-1-2f |grep fan1 -A 16\" . Expected result There are visible data for fan1 and temp7 which represents CPU fan speed and CPU temperature.","title":"FAN001.001 Check CPU entry temperature and CPU fan speed"},{"location":"unified-test-documentation/dasharo-compatibility/S31-coreboot-fan-control/#fan001002-check-if-increasing-cpu-temperature-increases-cpu-fan-speed","text":"Test description This test aims to verify that CPU fan speed responds properly to increasing CPU temperature. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Test steps Power on the DUT. Wait for boot until BOOT_MENU_STRING appears. Press BOOT_MENU_KEY to enter the boot menu. Select the proper number for USB_STICK option. Wait for debian login: . Type proper login. Wait for Password: . Type the proper password. Wait for root@debian:~# . Install stress-ng package by executing: sudo apt install stress-ng . Confirm installation by typing Y and pressing Enter when asked. Execute command: watch -n 1 \"sensors w83795g-i2c-1-2f |grep fan1 -A 16\" and check current CPU temperature and CPU fan speed. Execute command: stress-ng --cpu 16 --io 8 --vm 4 --vm-bytes 4G --timeout 30s --metrics . Wait 2 minutes. Execute command: watch -n 1 \"sensors w83795g-i2c-1-2f |grep fan1 -A 16\" and check current CPU temperature and CPU fan speed. Expected result The CPU temperature after the second check is higher at least 20 degrees. The CPU fan speed after the second check is higher at least 1000 RPM.","title":"FAN001.002 Check if increasing CPU temperature increases CPU fan speed"},{"location":"unified-test-documentation/dasharo-performance/400-coreboot-boot-measure/","text":"Dasharo Performance: coreboot boot measure Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Download cbmem from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. CBMEM001.001 coreboot booting time measure after coldboot (Ubuntu 22.04) Test description This test aims to verify whether the DUT boots after coldboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: sudo ./cbmem -T Expected result The output of the command should contain the information about duration of all boot stages. CBMEM002.001 coreboot booting time measure after warmboot (Ubuntu 22.04) Test description This test aims to verify whether the DUT boots after warmboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: sudo ./cbmem -T Expected result The output of the command should contain the information about duration of all boot stages. CBMEM003.001 coreboot booting time measure after system reboot (Ubuntu 22.04) Test description This test aims to verify whether the DUT boots after system reboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: sudo ./cbmem -T Expected result The output of the command should contain the information about duration of all boot stages.","title":"Coreboot boot measure"},{"location":"unified-test-documentation/dasharo-performance/400-coreboot-boot-measure/#dasharo-performance-coreboot-boot-measure","text":"","title":"Dasharo Performance: coreboot boot measure"},{"location":"unified-test-documentation/dasharo-performance/400-coreboot-boot-measure/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Download cbmem from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT.","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/400-coreboot-boot-measure/#cbmem001001-coreboot-booting-time-measure-after-coldboot-ubuntu-2204","text":"Test description This test aims to verify whether the DUT boots after coldboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: sudo ./cbmem -T Expected result The output of the command should contain the information about duration of all boot stages.","title":"CBMEM001.001 coreboot booting time measure after coldboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/400-coreboot-boot-measure/#cbmem002001-coreboot-booting-time-measure-after-warmboot-ubuntu-2204","text":"Test description This test aims to verify whether the DUT boots after warmboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: sudo ./cbmem -T Expected result The output of the command should contain the information about duration of all boot stages.","title":"CBMEM002.001 coreboot booting time measure after warmboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/400-coreboot-boot-measure/#cbmem003001-coreboot-booting-time-measure-after-system-reboot-ubuntu-2204","text":"Test description This test aims to verify whether the DUT boots after system reboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Open a terminal window and execute the following command: sudo ./cbmem -T Expected result The output of the command should contain the information about duration of all boot stages.","title":"CBMEM003.001 coreboot booting time measure after system reboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/401-cpu-temperature/","text":"Dasharo Performance: CPU temperature measure Common Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Install lm-sensors package: sudo apt install lm-sensors . CPT001.001 CPU temperature without load (Ubuntu 22.04) Test description This test aims to verify whether the temperature of CPU cores after system booting is not higher than the maximum allowed temperature. Test configuration data FIRMWARE = coreboot OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sensors Note the result. Expected result Example output: coretemp-isa-0000 Adapter: ISA adapter Package id 0 : +34.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 0 : +34.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 1 : +34.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 2 : +32.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 3 : +33.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Displayed temperature should be not higher than declared by the DUT specifications. CPT002.001 CPU temperature during stress test (Ubuntu 22.04) Test description This test aims to verify whether the temperature of the CPU cores is not higher than the maximum allowed temperature during stress test. Test configuration data FIRMWARE = coreboot OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the stress-ng package: sudo apt install stress-ng . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command to turn on the stressor: stress-ng --cpu 0 --tz -t 60m Stress test duration time might be changed by change the value of the parameter -t . While test runs, open a terminal window and run the following command every one minute until the test finishes, to check the current temperature. sensors Note the results. Expected result Example output: coretemp-isa-0000 Adapter: ISA adapter Package id 0 : +54.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 0 : +50.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 1 : +49.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 2 : +53.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 3 : +51.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) The displayed temperatures should be not higher than displayed high and critical. Also the temperatures should be not higher than those declared by the DUT's producer.","title":"CPU temperature measure"},{"location":"unified-test-documentation/dasharo-performance/401-cpu-temperature/#dasharo-performance-cpu-temperature-measure","text":"","title":"Dasharo Performance: CPU temperature measure"},{"location":"unified-test-documentation/dasharo-performance/401-cpu-temperature/#common","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Install lm-sensors package: sudo apt install lm-sensors .","title":"Common"},{"location":"unified-test-documentation/dasharo-performance/401-cpu-temperature/#cpt001001-cpu-temperature-without-load-ubuntu-2204","text":"Test description This test aims to verify whether the temperature of CPU cores after system booting is not higher than the maximum allowed temperature. Test configuration data FIRMWARE = coreboot OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sensors Note the result. Expected result Example output: coretemp-isa-0000 Adapter: ISA adapter Package id 0 : +34.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 0 : +34.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 1 : +34.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 2 : +32.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 3 : +33.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Displayed temperature should be not higher than declared by the DUT specifications.","title":"CPT001.001 CPU temperature without load (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/401-cpu-temperature/#cpt002001-cpu-temperature-during-stress-test-ubuntu-2204","text":"Test description This test aims to verify whether the temperature of the CPU cores is not higher than the maximum allowed temperature during stress test. Test configuration data FIRMWARE = coreboot OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the stress-ng package: sudo apt install stress-ng . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command to turn on the stressor: stress-ng --cpu 0 --tz -t 60m Stress test duration time might be changed by change the value of the parameter -t . While test runs, open a terminal window and run the following command every one minute until the test finishes, to check the current temperature. sensors Note the results. Expected result Example output: coretemp-isa-0000 Adapter: ISA adapter Package id 0 : +54.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 0 : +50.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 1 : +49.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 2 : +53.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) Core 3 : +51.0\u00b0C ( high = +100.0\u00b0C, crit = +100.0\u00b0C ) The displayed temperatures should be not higher than displayed high and critical. Also the temperatures should be not higher than those declared by the DUT's producer.","title":"CPT002.001 CPU temperature during stress test (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/","text":"Dasharo Performance: CPU frequency measure Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . CPF001.001 CPU not stuck on initial frequency (Ubuntu 22.04) Test description This test aims to verify whether the mounted CPU does not stuck on the initial frequency after booting into the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: cat /proc/cpuinfo | grep -i mhz Note the results. Expected result The output of the command should contain information about the current frequency of each CPU core. If the current frequency for each core is the same as initial frequency, the test should be considered as failed. Example output with unwanted results: cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 CPF001.002 CPU not stuck on initial frequency (Windows 11) Test description This test aims to verify whether the mounted CPU does not stuck on the initial frequency after booting into the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a powershell as administrator and run the following command: while ( 1 ){( Get-CimInstance CIM_Processor ). MaxClockSpeed *(( Get-Counter -Counter \"\\Processor Information(_Total)\\% Processor Performance\" ). CounterSamples . CookedValue )/ 100 } Note the results. Expected result The output of the command should contain information about the current frequency of CPU. If the following frequency values are the same, the test should be considered as failed. Example output with unwanted results: 2800 .00000000000 2800 .00000000000 2800 .00000000000 2800 .00000000000 2800 .00000000000 2800 .00000000000 2800 .00000000000 2800 .00000000000 CPF001.003 CPU not stuck on initial frequency (Heads+Debian) Test description This test aims to verify whether the mounted CPU does not stuck on the initial frequency after booting into the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 12 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: cat /proc/cpuinfo | grep -i mhz Note the results. Expected result The output of the command should contain information about the current frequency of each CPU core. If the current frequency for each core is the same as initial frequency, the test should be considered as failed. Example output with unwanted results: cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 CPF002.001 CPU runs on expected frequency (Ubuntu 22.04) Test description This test aims to verify whether the mounted CPU is running on expected frequency. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lscpu | grep -i mhz Note the results. Run the following command in the terminal: cat /proc/cpuinfo | grep -i mhz Repeat command every one minute, for 60 minutes. Compare the results. Expected result The result of running the first command should contain the information about current, minimum and maximum CPU frequency. Example output: CPU MHz: 2800 .0000 CPU max MHz: 4700 .0000 CPU min MHz: 400 .0000 The result of running the second command should contain the information about current frequency of each CPU core. Example output: cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 900 .542 cpu MHz : 461 .831 None of CPU core frequencies should be higher than maximum frequency or lower than minimum frequency. CPF002.002 CPU runs on expected frequency (Windows 11) Test description This test aims to verify whether the mounted CPU is running on expected frequency. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a powershell as administrator and run the following command: ( Get-CimInstance CIM_Processor ). MaxClockSpeed Note the result. Run the following command in the powershell: while ( 1 ){( Get-CimInstance CIM_Processor ). MaxClockSpeed *(( Get-Counter -Counter \"\\Processor Information(_Total)\\% Processor Performance\" ). CounterSamples . CookedValue )/ 100 } Repeat command every one minute, for 60 minutes. Note the results. Expected result The result of running the first command should contain the information about maximum CPU frequency. Example output: 2419 None of displayed values \u200b\u200bthat follow the second command should be higher than maximum frequency. Example output: 1023 .98759600614 1009 .23827168367 940 .831608527132 1201 .62695181908 1140 .59449053201 1021 .87762893503 983 .647614379085 1206 .27777992278 CPF003.001 CPU runs on expected frequency (Ubuntu 22.04, battery) Test description This test aims to verify whether the mounted CPU is running on expected frequency when charger is disconnected. The DUT during test works on battery. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lscpu | grep -i mhz Note the results. Run the following command in the terminal: cat /proc/cpuinfo | grep -i mhz Repeat command every one minute, for 60 minutes. Compare the results. Expected result The result of running the first command should contain the information about current, minimum and maximum CPU frequency. Example output: CPU MHz: 1800 .000 CPU max MHz: 3900 .0000 CPU min MHz: 1600 .0000 The result of running the second command should contain the information about current frequency of each CPU core. Example output: cpu MHz : 1700 .000 cpu MHz : 3719 .954 cpu MHz : 1600 .000 cpu MHz : 1600 .000 cpu MHz : 3778 .321 cpu MHz : 1800 .000 cpu MHz : 1700 .000 cpu MHz : 3806 .530 None of CPU core frequencies should be higher than maximum frequency or lower than minimum frequency. CPF003.002 CPU runs on expected frequency (Windows 11, battery) Test description This test aims to verify whether the mounted CPU is running on expected frequency when charger is disconnected. The DUT during test works on battery. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a powershell as administrator and run the following command: ( Get-CimInstance CIM_Processor ). MaxClockSpeed Note the result. Run the following command in the powershell: while ( 1 ){( Get-CimInstance CIM_Processor ). MaxClockSpeed *(( Get-Counter -Counter \"\\Processor Information(_Total)\\% Processor Performance\" ). CounterSamples . CookedValue )/ 100 } Repeat command couple times Note the results. Expected result The result of running the first command should contain the information about maximum CPU frequency. Example output: 2419 None of displayed values \u200b\u200bthat follow the second command should be higher than maximum frequency. Example output: 1023 .98759600614 1009 .23827168367 940 .831608527132 1201 .62695181908 1140 .59449053201 1021 .87762893503 983 .647614379085 1206 .27777992278 CPF004.001 CPU with load runs on expected frequency (Ubuntu 22.04) Test description This test aims to verify whether the mounted CPU is running on expected frequency during the stress test. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lscpu | grep -i mhz Note the results. Open a terminal window and run the following command to turn on the stressor: stress-ng --cpu 0 --tz -t 60m Stress test duration time might be changed by change the value of the parameter -t . While test runs, open a terminal window and run the following command every one minute until the test finishes, to check the current frequency. cat /proc/cpuinfo | grep -i mhz Note the results. Expected result The result of running the first command should contain the information about current, minimum and maximum CPU frequency. Example output: CPU MHz: 1800 .000 CPU max MHz: 3900 .0000 CPU min MHz: 1600 .0000 The result of running the third command should contain the information about current frequency of each CPU core. Example output: cpu MHz : 1900 .000 cpu MHz : 1600 .000 cpu MHz : 2849 .923 cpu MHz : 1700 .000 cpu MHz : 2200 .000 cpu MHz : 3386 .400 cpu MHz : 1600 .000 cpu MHz : 1600 .000 None of CPU core frequencies should be higher than maximum frequency or lower than minimum frequency. CPF004.002 CPU with load runs on expected frequency (Windows 11) Test description This test aims to verify whether the mounted CPU is running on expected frequency during the stress test. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a powershell as administrator and run the following command: ( Get-CimInstance CIM_Processor ). MaxClockSpeed Note the result. Run the stressor. While test runs, open Powershell and run the following command every one minute until the test finishes, to check the current frequency: ( Get-CimInstance CIM_Processor ). MaxClockSpeed *(( Get-Counter -Counter \"\\Processor Information(_Total)\\% Processor Performance\" ). CounterSamples . CookedValue )/ 100 Repeat command couple times. Note the results. Expected result The result of running the first command should contain the information about maximum CPU frequency. Example output: 2419 None of displayed values \u200b\u200bthat follow the second command should be higher than maximum frequency. Example output: 1023 .98759600614 1009 .23827168367 940 .831608527132 1201 .62695181908 1140 .59449053201 1021 .87762893503 983 .647614379085 1206 .27777992278 CPF005.001 CPU with load runs on expected frequency (Ubuntu 22.04, battery) Test description This test aims to verify whether the mounted CPU is running on expected frequency during the stress test. The DUT during test works on battery. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lscpu | grep -i mhz Note the results. Open a terminal window and run the following command to turn on the stressor: stress-ng --cpu 0 --tz -t 60m Stress test duration time might be changed by change the value of the parameter -t . While test runs, open a terminal window and run the following command every one minute until the test finishes, to check the current frequency. cat /proc/cpuinfo | grep -i mhz Note the results. Expected result The result of running the first command should contain the information about current, minimum and maximum CPU frequency. Example output: CPU MHz: 1800 .000 CPU max MHz: 3900 .0000 CPU min MHz: 1600 .0000 The result of running the third command should contain the information about current frequency of each CPU core. Example output: cpu MHz : 1900 .000 cpu MHz : 1600 .000 cpu MHz : 2849 .923 cpu MHz : 1700 .000 cpu MHz : 2200 .000 cpu MHz : 3386 .400 cpu MHz : 1600 .000 cpu MHz : 1600 .000 None of CPU core frequencies should be higher than maximum frequency or lower than minimum frequency. CPF005.002 CPU with load runs on expected frequency (Windows 11, battery) Test description This test aims to verify whether the mounted CPU is running on expected frequency during the stress test. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a powershell as administrator and run the following command: ( Get-CimInstance CIM_Processor ). MaxClockSpeed Note the result. Run the stressor. While test runs, open Powershell and run the following command every one minute until the test finishes, to check the current frequency: ( Get-CimInstance CIM_Processor ). MaxClockSpeed *(( Get-Counter -Counter \"\\Processor Information(_Total)\\% Processor Performance\" ). CounterSamples . CookedValue )/ 100 Repeat command couple times. Note the results. Expected result The result of running the first command should contain the information about maximum CPU frequency. Example output: 2419 None of displayed values that follow the second command should be higher than maximum frequency. Example output: 1023 .98759600614 1009 .23827168367 940 .831608527132 1201 .62695181908 1140 .59449053201 1021 .87762893503 983 .647614379085 1206 .27777992278","title":"CPU frequency measure"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#dasharo-performance-cpu-frequency-measure","text":"","title":"Dasharo Performance: CPU frequency measure"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf001001-cpu-not-stuck-on-initial-frequency-ubuntu-2204","text":"Test description This test aims to verify whether the mounted CPU does not stuck on the initial frequency after booting into the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: cat /proc/cpuinfo | grep -i mhz Note the results. Expected result The output of the command should contain information about the current frequency of each CPU core. If the current frequency for each core is the same as initial frequency, the test should be considered as failed. Example output with unwanted results: cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000","title":"CPF001.001 CPU not stuck on initial frequency (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf001002-cpu-not-stuck-on-initial-frequency-windows-11","text":"Test description This test aims to verify whether the mounted CPU does not stuck on the initial frequency after booting into the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a powershell as administrator and run the following command: while ( 1 ){( Get-CimInstance CIM_Processor ). MaxClockSpeed *(( Get-Counter -Counter \"\\Processor Information(_Total)\\% Processor Performance\" ). CounterSamples . CookedValue )/ 100 } Note the results. Expected result The output of the command should contain information about the current frequency of CPU. If the following frequency values are the same, the test should be considered as failed. Example output with unwanted results: 2800 .00000000000 2800 .00000000000 2800 .00000000000 2800 .00000000000 2800 .00000000000 2800 .00000000000 2800 .00000000000 2800 .00000000000","title":"CPF001.002 CPU not stuck on initial frequency (Windows 11)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf001003-cpu-not-stuck-on-initial-frequency-headsdebian","text":"Test description This test aims to verify whether the mounted CPU does not stuck on the initial frequency after booting into the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 12 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: cat /proc/cpuinfo | grep -i mhz Note the results. Expected result The output of the command should contain information about the current frequency of each CPU core. If the current frequency for each core is the same as initial frequency, the test should be considered as failed. Example output with unwanted results: cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000","title":"CPF001.003 CPU not stuck on initial frequency (Heads+Debian)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf002001-cpu-runs-on-expected-frequency-ubuntu-2204","text":"Test description This test aims to verify whether the mounted CPU is running on expected frequency. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lscpu | grep -i mhz Note the results. Run the following command in the terminal: cat /proc/cpuinfo | grep -i mhz Repeat command every one minute, for 60 minutes. Compare the results. Expected result The result of running the first command should contain the information about current, minimum and maximum CPU frequency. Example output: CPU MHz: 2800 .0000 CPU max MHz: 4700 .0000 CPU min MHz: 400 .0000 The result of running the second command should contain the information about current frequency of each CPU core. Example output: cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 2800 .000 cpu MHz : 900 .542 cpu MHz : 461 .831 None of CPU core frequencies should be higher than maximum frequency or lower than minimum frequency.","title":"CPF002.001 CPU runs on expected frequency (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf002002-cpu-runs-on-expected-frequency-windows-11","text":"Test description This test aims to verify whether the mounted CPU is running on expected frequency. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a powershell as administrator and run the following command: ( Get-CimInstance CIM_Processor ). MaxClockSpeed Note the result. Run the following command in the powershell: while ( 1 ){( Get-CimInstance CIM_Processor ). MaxClockSpeed *(( Get-Counter -Counter \"\\Processor Information(_Total)\\% Processor Performance\" ). CounterSamples . CookedValue )/ 100 } Repeat command every one minute, for 60 minutes. Note the results. Expected result The result of running the first command should contain the information about maximum CPU frequency. Example output: 2419 None of displayed values \u200b\u200bthat follow the second command should be higher than maximum frequency. Example output: 1023 .98759600614 1009 .23827168367 940 .831608527132 1201 .62695181908 1140 .59449053201 1021 .87762893503 983 .647614379085 1206 .27777992278","title":"CPF002.002 CPU runs on expected frequency (Windows 11)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf003001-cpu-runs-on-expected-frequency-ubuntu-2204-battery","text":"Test description This test aims to verify whether the mounted CPU is running on expected frequency when charger is disconnected. The DUT during test works on battery. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lscpu | grep -i mhz Note the results. Run the following command in the terminal: cat /proc/cpuinfo | grep -i mhz Repeat command every one minute, for 60 minutes. Compare the results. Expected result The result of running the first command should contain the information about current, minimum and maximum CPU frequency. Example output: CPU MHz: 1800 .000 CPU max MHz: 3900 .0000 CPU min MHz: 1600 .0000 The result of running the second command should contain the information about current frequency of each CPU core. Example output: cpu MHz : 1700 .000 cpu MHz : 3719 .954 cpu MHz : 1600 .000 cpu MHz : 1600 .000 cpu MHz : 3778 .321 cpu MHz : 1800 .000 cpu MHz : 1700 .000 cpu MHz : 3806 .530 None of CPU core frequencies should be higher than maximum frequency or lower than minimum frequency.","title":"CPF003.001 CPU runs on expected frequency (Ubuntu 22.04, battery)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf003002-cpu-runs-on-expected-frequency-windows-11-battery","text":"Test description This test aims to verify whether the mounted CPU is running on expected frequency when charger is disconnected. The DUT during test works on battery. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a powershell as administrator and run the following command: ( Get-CimInstance CIM_Processor ). MaxClockSpeed Note the result. Run the following command in the powershell: while ( 1 ){( Get-CimInstance CIM_Processor ). MaxClockSpeed *(( Get-Counter -Counter \"\\Processor Information(_Total)\\% Processor Performance\" ). CounterSamples . CookedValue )/ 100 } Repeat command couple times Note the results. Expected result The result of running the first command should contain the information about maximum CPU frequency. Example output: 2419 None of displayed values \u200b\u200bthat follow the second command should be higher than maximum frequency. Example output: 1023 .98759600614 1009 .23827168367 940 .831608527132 1201 .62695181908 1140 .59449053201 1021 .87762893503 983 .647614379085 1206 .27777992278","title":"CPF003.002 CPU runs on expected frequency (Windows 11, battery)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf004001-cpu-with-load-runs-on-expected-frequency-ubuntu-2204","text":"Test description This test aims to verify whether the mounted CPU is running on expected frequency during the stress test. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lscpu | grep -i mhz Note the results. Open a terminal window and run the following command to turn on the stressor: stress-ng --cpu 0 --tz -t 60m Stress test duration time might be changed by change the value of the parameter -t . While test runs, open a terminal window and run the following command every one minute until the test finishes, to check the current frequency. cat /proc/cpuinfo | grep -i mhz Note the results. Expected result The result of running the first command should contain the information about current, minimum and maximum CPU frequency. Example output: CPU MHz: 1800 .000 CPU max MHz: 3900 .0000 CPU min MHz: 1600 .0000 The result of running the third command should contain the information about current frequency of each CPU core. Example output: cpu MHz : 1900 .000 cpu MHz : 1600 .000 cpu MHz : 2849 .923 cpu MHz : 1700 .000 cpu MHz : 2200 .000 cpu MHz : 3386 .400 cpu MHz : 1600 .000 cpu MHz : 1600 .000 None of CPU core frequencies should be higher than maximum frequency or lower than minimum frequency.","title":"CPF004.001 CPU with load runs on expected frequency (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf004002-cpu-with-load-runs-on-expected-frequency-windows-11","text":"Test description This test aims to verify whether the mounted CPU is running on expected frequency during the stress test. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a powershell as administrator and run the following command: ( Get-CimInstance CIM_Processor ). MaxClockSpeed Note the result. Run the stressor. While test runs, open Powershell and run the following command every one minute until the test finishes, to check the current frequency: ( Get-CimInstance CIM_Processor ). MaxClockSpeed *(( Get-Counter -Counter \"\\Processor Information(_Total)\\% Processor Performance\" ). CounterSamples . CookedValue )/ 100 Repeat command couple times. Note the results. Expected result The result of running the first command should contain the information about maximum CPU frequency. Example output: 2419 None of displayed values \u200b\u200bthat follow the second command should be higher than maximum frequency. Example output: 1023 .98759600614 1009 .23827168367 940 .831608527132 1201 .62695181908 1140 .59449053201 1021 .87762893503 983 .647614379085 1206 .27777992278","title":"CPF004.002 CPU with load runs on expected frequency (Windows 11)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf005001-cpu-with-load-runs-on-expected-frequency-ubuntu-2204-battery","text":"Test description This test aims to verify whether the mounted CPU is running on expected frequency during the stress test. The DUT during test works on battery. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lscpu | grep -i mhz Note the results. Open a terminal window and run the following command to turn on the stressor: stress-ng --cpu 0 --tz -t 60m Stress test duration time might be changed by change the value of the parameter -t . While test runs, open a terminal window and run the following command every one minute until the test finishes, to check the current frequency. cat /proc/cpuinfo | grep -i mhz Note the results. Expected result The result of running the first command should contain the information about current, minimum and maximum CPU frequency. Example output: CPU MHz: 1800 .000 CPU max MHz: 3900 .0000 CPU min MHz: 1600 .0000 The result of running the third command should contain the information about current frequency of each CPU core. Example output: cpu MHz : 1900 .000 cpu MHz : 1600 .000 cpu MHz : 2849 .923 cpu MHz : 1700 .000 cpu MHz : 2200 .000 cpu MHz : 3386 .400 cpu MHz : 1600 .000 cpu MHz : 1600 .000 None of CPU core frequencies should be higher than maximum frequency or lower than minimum frequency.","title":"CPF005.001 CPU with load runs on expected frequency (Ubuntu 22.04, battery)"},{"location":"unified-test-documentation/dasharo-performance/402-cpu-frequency/#cpf005002-cpu-with-load-runs-on-expected-frequency-windows-11-battery","text":"Test description This test aims to verify whether the mounted CPU is running on expected frequency during the stress test. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a powershell as administrator and run the following command: ( Get-CimInstance CIM_Processor ). MaxClockSpeed Note the result. Run the stressor. While test runs, open Powershell and run the following command every one minute until the test finishes, to check the current frequency: ( Get-CimInstance CIM_Processor ). MaxClockSpeed *(( Get-Counter -Counter \"\\Processor Information(_Total)\\% Processor Performance\" ). CounterSamples . CookedValue )/ 100 Repeat command couple times. Note the results. Expected result The result of running the first command should contain the information about maximum CPU frequency. Example output: 2419 None of displayed values that follow the second command should be higher than maximum frequency. Example output: 1023 .98759600614 1009 .23827168367 940 .831608527132 1201 .62695181908 1140 .59449053201 1021 .87762893503 983 .647614379085 1206 .27777992278","title":"CPF005.002 CPU with load runs on expected frequency (Windows 11, battery)"},{"location":"unified-test-documentation/dasharo-performance/403-device-boot-measure/","text":"Dasharo Performance: Device boot measure Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . DBM001.001 Device boot measure after coldboot (Ubuntu 22.04) Test description This test aims to verify whether the DUT boots after coldboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: systemd-analyze Note the results. Expected result The output of the command should contain the information about duration of all boot stages. DBM002.001 Device boot measure after warmboot (Ubuntu 22.04) Test description This test aims to verify whether the DUT boots after warmboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: systemd-analyze Note the results. Expected result The output of the command should contain the information about duration of all boot stages. DBM003.001 Device boot measure after reboot (Ubuntu 22.04) Test description This test aims to verify whether the DUT boots after system reboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: systemd-analyze Note the results. Expected result The output of the command should contain the information about duration of all boot stages.","title":"Device boot measure"},{"location":"unified-test-documentation/dasharo-performance/403-device-boot-measure/#dasharo-performance-device-boot-measure","text":"","title":"Dasharo Performance: Device boot measure"},{"location":"unified-test-documentation/dasharo-performance/403-device-boot-measure/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/403-device-boot-measure/#dbm001001-device-boot-measure-after-coldboot-ubuntu-2204","text":"Test description This test aims to verify whether the DUT boots after coldboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: systemd-analyze Note the results. Expected result The output of the command should contain the information about duration of all boot stages.","title":"DBM001.001 Device boot measure after coldboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/403-device-boot-measure/#dbm002001-device-boot-measure-after-warmboot-ubuntu-2204","text":"Test description This test aims to verify whether the DUT boots after warmboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: systemd-analyze Note the results. Expected result The output of the command should contain the information about duration of all boot stages.","title":"DBM002.001 Device boot measure after warmboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/403-device-boot-measure/#dbm003001-device-boot-measure-after-reboot-ubuntu-2204","text":"Test description This test aims to verify whether the DUT boots after system reboot and how long this process takes. This test case may be re-done several times to to average the results and specify the platform stability. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: systemd-analyze Note the results. Expected result The output of the command should contain the information about duration of all boot stages.","title":"DBM003.001 Device boot measure after reboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/404-platform-stability/","text":"Dasharo Performance: Platform stability Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . STB001.001 Verify if no reboot occurs in the firmware Test description This test aims to verify that the DUT booted to the BIOS does not reset. The test is performed in multiple iterations - after a defined time an attempt to read the same menu is repeated. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press SETUP_MENU_KEY to enter the setup menu. Note the results. After the specified time has elapsed, repeat the operation described in step 3. Expected result The platform should remain in the setup menu in every testing iteration. STB001.002 Verify if no reboot occurs in the OS (Ubuntu 22.04) Test description This test aims to verify that the DUT booted to the Operation System does not reset. The test is performed in multiple iterations - after a defined time an attempt to read the output of specific commands confirming the stability of work is repeated. For testing purposes, additional stability criteria are adopted: Whether the platform has not lost connection to the Internet. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: uptime -p Note the results. Run the following command in the terminal to check if the platform has a connection with the Internet: ip link | grep -E 'enp' Note the results. After the specified time has elapsed, repeat the operations described in steps 4-7. Expected result Subsequent readings of the first command output should indicate that the platform has not undergone a reboot. Example output of the command after 30 minutes of working: up 30 minutes Subsequent readings of the second command output should indicate that the platform has not lost the connection to the Internet. Example output of the command: 2 : enp46s0: mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 If the device is connected to the Internet, a UP status should appear for at least one physical interface. STB001.003 Verify if no reboot occurs in the OS (Windows 11) Test description This test aims to verify that the DUT booted to the Operation System does not reset. The test is performed in multiple iterations - after a defined time an attempt to read the output of specific commands confirming the stability of work is repeated. For testing purposes, additional stability criteria are adopted: Whether the platform has not lost connection to the Internet. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run PowerShell as administrator and execute the following command: ( get-date ) - ( gcim Win32_OperatingSystem ). LastBootUpTime Note the results. Run the following command in PowerShell to check if the platform has a connection with the Internet: Get-NetAdapter -Name \"Ethernet*\" Note the results. After the specified time has elapsed, repeat the operations described in steps 4-7. Expected result Subsequent readings of the first command output should indicate that the platform has not undergone a reboot. Example output of the command after 17 minutes of working: Days : 0 Hours : 0 Minutes : 17 Seconds : 8 Milliseconds : 784 Ticks : 10287845330 TotalDays : 0 . 0119072283912037 TotalHours : 0 . 285773481388889 TotalMinutes : 17 . 1464088833333 TotalSeconds : 1028 . 784533 TotalMilliseconds : 1028784 . 533 Subsequent readings of the second command output should indicate that the platform has not lost the connection to the Internet. Example output of the command: Name InterfaceDescription ifIndex Status MacAddress LinkSpeed ---- -------------------- ------- ------ ---------- --------- Ethernet Realtek PCIe GbE Family Controller 15 Up D4 - 93 - 90 - 0C - 23-A1 100 Mbps If the device is connected to the Internet, a UP status should appear for at least one physical interface.","title":"Platform stability"},{"location":"unified-test-documentation/dasharo-performance/404-platform-stability/#dasharo-performance-platform-stability","text":"","title":"Dasharo Performance: Platform stability"},{"location":"unified-test-documentation/dasharo-performance/404-platform-stability/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/404-platform-stability/#stb001001-verify-if-no-reboot-occurs-in-the-firmware","text":"Test description This test aims to verify that the DUT booted to the BIOS does not reset. The test is performed in multiple iterations - after a defined time an attempt to read the same menu is repeated. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press SETUP_MENU_KEY to enter the setup menu. Note the results. After the specified time has elapsed, repeat the operation described in step 3. Expected result The platform should remain in the setup menu in every testing iteration.","title":"STB001.001 Verify if no reboot occurs in the firmware"},{"location":"unified-test-documentation/dasharo-performance/404-platform-stability/#stb001002-verify-if-no-reboot-occurs-in-the-os-ubuntu-2204","text":"Test description This test aims to verify that the DUT booted to the Operation System does not reset. The test is performed in multiple iterations - after a defined time an attempt to read the output of specific commands confirming the stability of work is repeated. For testing purposes, additional stability criteria are adopted: Whether the platform has not lost connection to the Internet. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: uptime -p Note the results. Run the following command in the terminal to check if the platform has a connection with the Internet: ip link | grep -E 'enp' Note the results. After the specified time has elapsed, repeat the operations described in steps 4-7. Expected result Subsequent readings of the first command output should indicate that the platform has not undergone a reboot. Example output of the command after 30 minutes of working: up 30 minutes Subsequent readings of the second command output should indicate that the platform has not lost the connection to the Internet. Example output of the command: 2 : enp46s0: mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 If the device is connected to the Internet, a UP status should appear for at least one physical interface.","title":"STB001.002 Verify if no reboot occurs in the OS (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/404-platform-stability/#stb001003-verify-if-no-reboot-occurs-in-the-os-windows-11","text":"Test description This test aims to verify that the DUT booted to the Operation System does not reset. The test is performed in multiple iterations - after a defined time an attempt to read the output of specific commands confirming the stability of work is repeated. For testing purposes, additional stability criteria are adopted: Whether the platform has not lost connection to the Internet. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Run PowerShell as administrator and execute the following command: ( get-date ) - ( gcim Win32_OperatingSystem ). LastBootUpTime Note the results. Run the following command in PowerShell to check if the platform has a connection with the Internet: Get-NetAdapter -Name \"Ethernet*\" Note the results. After the specified time has elapsed, repeat the operations described in steps 4-7. Expected result Subsequent readings of the first command output should indicate that the platform has not undergone a reboot. Example output of the command after 17 minutes of working: Days : 0 Hours : 0 Minutes : 17 Seconds : 8 Milliseconds : 784 Ticks : 10287845330 TotalDays : 0 . 0119072283912037 TotalHours : 0 . 285773481388889 TotalMinutes : 17 . 1464088833333 TotalSeconds : 1028 . 784533 TotalMilliseconds : 1028784 . 533 Subsequent readings of the second command output should indicate that the platform has not lost the connection to the Internet. Example output of the command: Name InterfaceDescription ifIndex Status MacAddress LinkSpeed ---- -------------------- ------- ------ ---------- --------- Ethernet Realtek PCIe GbE Family Controller 15 Up D4 - 93 - 90 - 0C - 23-A1 100 Mbps If the device is connected to the Internet, a UP status should appear for at least one physical interface.","title":"STB001.003 Verify if no reboot occurs in the OS (Windows 11)"},{"location":"unified-test-documentation/dasharo-performance/405-fan-control-measure/","text":"Dasharo Performance: Fan Control Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Check if package lm-sensors is installed and if not, use below command in the terminal to install: apt-get install --assume-yes lm-sensors FNM001.001 Fan does not stuck after coldboot (Ubuntu 22.04) Test description This test aims to verify that the fan does not stuck on initial or any defined speed after coldboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Boot into the system. Log into the system by using the proper login and password. In the terminal window run the following command\\: sensors | grep fan1 Repeat command every one minute, for 60 minutes. Compare the results. Expected result The output of the command should contain information about the current fan speed. If the current speed is the same as initial speed, the test should be considered as failed. If the current speed does not change in the long term, the test should be considered as failed. Example output: fan1: 1131 RPM ( min = 329 RPM ) FNM002.001 Fan does not stuck after warmboot (Ubuntu 22.04) Test description This test aims to verify that the fan does not stuck on initial or any defined speed after warmboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. In the terminal window run the following command: sensors | grep fan1 Repeat command every one minute, for 60 minutes. Compare the results. Expected result The output of the command should contain information about the current fan speed. If the current speed is the same as initial speed, the test should be considered as failed. If the current speed does not change in the long term, the test should be considered as failed. Example output: fan1: 1131 RPM ( min = 329 RPM ) FNM003.001 Fan does not stuck after reboot (Ubuntu 22.04) Test description This test aims to verify that the fan does not stuck on initial or any defined speed after reboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. In the terminal window run the following command: sensors | grep fan1 Repeat command every one minute, for 60 minutes. Compare the results. Expected result The output of the command should contain information about the current fan speed. If the current speed is the same as initial speed, the test should be considered as failed. If the current speed does not change in the long term, the test should be considered as failed. Example output: fan1: 1131 RPM ( min = 329 RPM )","title":"Fan control measure"},{"location":"unified-test-documentation/dasharo-performance/405-fan-control-measure/#dasharo-performance-fan-control","text":"","title":"Dasharo Performance: Fan Control"},{"location":"unified-test-documentation/dasharo-performance/405-fan-control-measure/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Check if package lm-sensors is installed and if not, use below command in the terminal to install: apt-get install --assume-yes lm-sensors","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/405-fan-control-measure/#fnm001001-fan-does-not-stuck-after-coldboot-ubuntu-2204","text":"Test description This test aims to verify that the fan does not stuck on initial or any defined speed after coldboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Boot into the system. Log into the system by using the proper login and password. In the terminal window run the following command\\: sensors | grep fan1 Repeat command every one minute, for 60 minutes. Compare the results. Expected result The output of the command should contain information about the current fan speed. If the current speed is the same as initial speed, the test should be considered as failed. If the current speed does not change in the long term, the test should be considered as failed. Example output: fan1: 1131 RPM ( min = 329 RPM )","title":"FNM001.001 Fan does not stuck after coldboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/405-fan-control-measure/#fnm002001-fan-does-not-stuck-after-warmboot-ubuntu-2204","text":"Test description This test aims to verify that the fan does not stuck on initial or any defined speed after warmboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. In the terminal window run the following command: sensors | grep fan1 Repeat command every one minute, for 60 minutes. Compare the results. Expected result The output of the command should contain information about the current fan speed. If the current speed is the same as initial speed, the test should be considered as failed. If the current speed does not change in the long term, the test should be considered as failed. Example output: fan1: 1131 RPM ( min = 329 RPM )","title":"FNM002.001 Fan does not stuck after warmboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/405-fan-control-measure/#fnm003001-fan-does-not-stuck-after-reboot-ubuntu-2204","text":"Test description This test aims to verify that the fan does not stuck on initial or any defined speed after reboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. In the terminal window run the following command: sensors | grep fan1 Repeat command every one minute, for 60 minutes. Compare the results. Expected result The output of the command should contain information about the current fan speed. If the current speed is the same as initial speed, the test should be considered as failed. If the current speed does not change in the long term, the test should be considered as failed. Example output: fan1: 1131 RPM ( min = 329 RPM )","title":"FNM003.001 Fan does not stuck after reboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/406-custom-fan-curve/","text":"Dasharo Performance: Custom fan curve Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . CFC001.001 Custom fan curve silent profile measure (Ubuntu 22.04) Test description The fan has been configured to follow a custom curve. This test aims to verify that the fan curve is configured correctly in silent profile and the fan spins up and down according to the defined values. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Install stress-ng on the DUT. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Power Management Options submenu. Verify that the Fan profile field is set to Silent - if not, using the arrow keys and Enter , choose the Silent option. Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open the terminal window and run the following command: stress-ng --cpu 16 --timeout 30m Open the terminal window and run the following command to get the temperature: cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/temp1_input The last three digits of the output are the value of the number after the decimal point. Example output 47000 means 47\u00b0C. In the terminal window run the following command to get the PWM value of the CPU fan: cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/pwm1 Repeat steps 13-14 a couple of times. Note the results. Expected result Silent fan profile Keep in mind that the EC firmware is smoothing, i.e. the fans will enter the target speed with a delay. The algorithm by which the EC calculates the speed is as follows: If the temperature is below the first one defined in the curve, set the speed to 0. If the temperature is above the last defined curve, set the maximum speed. If the temperature is equal to one of the temperatures of the points on the curve, set the speed from that point on the curve If the temperature is between points on the curve: slope = ( right_point_speed - left_point_speed ) /right_point_temperature - left_point_temperature ) speed = slope* ( temperature - left_point_temperature ) + left_point_speed Divide the PWM value by 2.55 to get the percentage to compare. Example check for 30\u00b0C and 70 PWM values: ```text expected_speed = ((30-25)/(65-0))*(30-0)+25 \u2248 27 actual_speed = 70/2.55 \u2248 27 ``` Values expected_speed and actual_speed are strongly similar. This means that the fan control is set correctly. CFC002.001 Custom fan curve performance profile measure (Ubuntu 22.04) Test description The fan has been configured to follow a custom curve. This test aims to verify that the fan curve is configured correctly in the performance profile and the fan spins up and down according to the defined values. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Install stress-ng on the DUT. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Power Management Options submenu. Verify that the Fan profile field is set to Performance - if not, using the arrow keys and Enter , choose the Performance option. Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open the terminal window and run the following command: stress-ng --cpu 16 --timeout 30m Open the terminal window and run the following command to get the temperature: cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/temp1_input The last three digits of the output are the value of the number after the decimal point. Example output 47000 means 47\u00b0C. In the terminal window run the following command to get the PWM value of the CPU fan: cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/pwm1 Repeat steps 13-14 a couple of times. Note the results. Expected result Performance fan profile Keep in mind that the EC firmware is smoothing, i.e. the fans will enter the target speed with a delay. The algorithm by which the EC calculates the speed is as follows: If the temperature is below the first one defined in the curve, set the speed to 0. If the temperature is above the last defined curve, set the maximum speed. If the temperature is equal to one of the temperatures of the points on the curve, set the speed from that point on the curve If the temperature is between points on the curve: slope = ( right_point_speed - left_point_speed ) /right_point_temperature - left_point_temperature ) speed = slope* ( temperature - left_point_temperature ) + left_point_speed Divide the PWM value by 2.55 to get the percentage to compare. Example check for 30\u00b0C and 79 PWM values: ```text expected_speed = ((35-25)/(55-0))*(35-0)+25 \u2248 31 actual_speed = 79/2.55 \u2248 31 ``` Values expected_speed and actual_speed are strongly similar. This means that the fan control is set correctly.","title":"Custom fan curve"},{"location":"unified-test-documentation/dasharo-performance/406-custom-fan-curve/#dasharo-performance-custom-fan-curve","text":"","title":"Dasharo Performance: Custom fan curve"},{"location":"unified-test-documentation/dasharo-performance/406-custom-fan-curve/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/406-custom-fan-curve/#cfc001001-custom-fan-curve-silent-profile-measure-ubuntu-2204","text":"Test description The fan has been configured to follow a custom curve. This test aims to verify that the fan curve is configured correctly in silent profile and the fan spins up and down according to the defined values. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Install stress-ng on the DUT. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Power Management Options submenu. Verify that the Fan profile field is set to Silent - if not, using the arrow keys and Enter , choose the Silent option. Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open the terminal window and run the following command: stress-ng --cpu 16 --timeout 30m Open the terminal window and run the following command to get the temperature: cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/temp1_input The last three digits of the output are the value of the number after the decimal point. Example output 47000 means 47\u00b0C. In the terminal window run the following command to get the PWM value of the CPU fan: cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/pwm1 Repeat steps 13-14 a couple of times. Note the results. Expected result Silent fan profile Keep in mind that the EC firmware is smoothing, i.e. the fans will enter the target speed with a delay. The algorithm by which the EC calculates the speed is as follows: If the temperature is below the first one defined in the curve, set the speed to 0. If the temperature is above the last defined curve, set the maximum speed. If the temperature is equal to one of the temperatures of the points on the curve, set the speed from that point on the curve If the temperature is between points on the curve: slope = ( right_point_speed - left_point_speed ) /right_point_temperature - left_point_temperature ) speed = slope* ( temperature - left_point_temperature ) + left_point_speed Divide the PWM value by 2.55 to get the percentage to compare. Example check for 30\u00b0C and 70 PWM values: ```text expected_speed = ((30-25)/(65-0))*(30-0)+25 \u2248 27 actual_speed = 70/2.55 \u2248 27 ``` Values expected_speed and actual_speed are strongly similar. This means that the fan control is set correctly.","title":"CFC001.001 Custom fan curve silent profile measure (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/406-custom-fan-curve/#cfc002001-custom-fan-curve-performance-profile-measure-ubuntu-2204","text":"Test description The fan has been configured to follow a custom curve. This test aims to verify that the fan curve is configured correctly in the performance profile and the fan spins up and down according to the defined values. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Install stress-ng on the DUT. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Power Management Options submenu. Verify that the Fan profile field is set to Performance - if not, using the arrow keys and Enter , choose the Performance option. Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open the terminal window and run the following command: stress-ng --cpu 16 --timeout 30m Open the terminal window and run the following command to get the temperature: cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/temp1_input The last three digits of the output are the value of the number after the decimal point. Example output 47000 means 47\u00b0C. In the terminal window run the following command to get the PWM value of the CPU fan: cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/pwm1 Repeat steps 13-14 a couple of times. Note the results. Expected result Performance fan profile Keep in mind that the EC firmware is smoothing, i.e. the fans will enter the target speed with a delay. The algorithm by which the EC calculates the speed is as follows: If the temperature is below the first one defined in the curve, set the speed to 0. If the temperature is above the last defined curve, set the maximum speed. If the temperature is equal to one of the temperatures of the points on the curve, set the speed from that point on the curve If the temperature is between points on the curve: slope = ( right_point_speed - left_point_speed ) /right_point_temperature - left_point_temperature ) speed = slope* ( temperature - left_point_temperature ) + left_point_speed Divide the PWM value by 2.55 to get the percentage to compare. Example check for 30\u00b0C and 79 PWM values: ```text expected_speed = ((35-25)/(55-0))*(35-0)+25 \u2248 31 actual_speed = 79/2.55 \u2248 31 ``` Values expected_speed and actual_speed are strongly similar. This means that the fan control is set correctly.","title":"CFC002.001 Custom fan curve performance profile measure (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-performance/407-ubuntu-booting-performance-test/","text":"Dasharo Performance: Ubuntu booting performance test Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . BUB001.001 Boot Ubuntu LTS from disk after cold-boot Test description This test aims to verify that Ubuntu LTS could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BUB002.001 Boot Ubuntu LTS from disk after warm-boot Test description This test aims to verify that Ubuntu LTS could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BUB003.001 Boot Ubuntu LTS from disk after reboot Test description This test aims to verify that Ubuntu LTS could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"Ubuntu booting performance test"},{"location":"unified-test-documentation/dasharo-performance/407-ubuntu-booting-performance-test/#dasharo-performance-ubuntu-booting-performance-test","text":"","title":"Dasharo Performance: Ubuntu booting performance test"},{"location":"unified-test-documentation/dasharo-performance/407-ubuntu-booting-performance-test/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/407-ubuntu-booting-performance-test/#bub001001-boot-ubuntu-lts-from-disk-after-cold-boot","text":"Test description This test aims to verify that Ubuntu LTS could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BUB001.001 Boot Ubuntu LTS from disk after cold-boot"},{"location":"unified-test-documentation/dasharo-performance/407-ubuntu-booting-performance-test/#bub002001-boot-ubuntu-lts-from-disk-after-warm-boot","text":"Test description This test aims to verify that Ubuntu LTS could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BUB002.001 Boot Ubuntu LTS from disk after warm-boot"},{"location":"unified-test-documentation/dasharo-performance/407-ubuntu-booting-performance-test/#bub003001-boot-ubuntu-lts-from-disk-after-reboot","text":"Test description This test aims to verify that Ubuntu LTS could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BUB003.001 Boot Ubuntu LTS from disk after reboot"},{"location":"unified-test-documentation/dasharo-performance/408-debian-booting-performance-test/","text":"Dasharo Performance: Debian booting performance test Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . BDE001.001 Boot Debian LTS from disk after cold-boot Test description This test aims to verify that Debian LTS could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.6 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BDE002.001 Boot Debian LTS from disk after warm-boot Test description This test aims to verify that Debian LTS could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.6 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BDE003.001 Boot Debian LTS from disk after reboot Test description This test aims to verify that Debian LTS could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.6 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"Debian booting performance test"},{"location":"unified-test-documentation/dasharo-performance/408-debian-booting-performance-test/#dasharo-performance-debian-booting-performance-test","text":"","title":"Dasharo Performance: Debian booting performance test"},{"location":"unified-test-documentation/dasharo-performance/408-debian-booting-performance-test/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/408-debian-booting-performance-test/#bde001001-boot-debian-lts-from-disk-after-cold-boot","text":"Test description This test aims to verify that Debian LTS could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.6 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BDE001.001 Boot Debian LTS from disk after cold-boot"},{"location":"unified-test-documentation/dasharo-performance/408-debian-booting-performance-test/#bde002001-boot-debian-lts-from-disk-after-warm-boot","text":"Test description This test aims to verify that Debian LTS could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.6 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BDE002.001 Boot Debian LTS from disk after warm-boot"},{"location":"unified-test-documentation/dasharo-performance/408-debian-booting-performance-test/#bde003001-boot-debian-lts-from-disk-after-reboot","text":"Test description This test aims to verify that Debian LTS could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Debian 11.6 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BDE003.001 Boot Debian LTS from disk after reboot"},{"location":"unified-test-documentation/dasharo-performance/409-freebsd-booting-performance-test/","text":"Dasharo Performance: FreeBSD booting performance test Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . BFB001.001 Boot FreeBSD-RELEASE from disk after cold-boot Test description This test aims to verify that FreeBSD-RELEASE could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = FreeBSD 13.2 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BFB002.001 Boot FreeBSD-RELEASE from disk after warm-boot Test description This test aims to verify that FreeBSD-RELEASE could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = FreeBSD 13.2 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BFB003.001 Boot FreeBSD-RELEASE from disk after reboot Test description This test aims to verify that FreeBSD-RELEASE could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = FreeBSD 13.2 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"FreeBSD booting performance test"},{"location":"unified-test-documentation/dasharo-performance/409-freebsd-booting-performance-test/#dasharo-performance-freebsd-booting-performance-test","text":"","title":"Dasharo Performance: FreeBSD booting performance test"},{"location":"unified-test-documentation/dasharo-performance/409-freebsd-booting-performance-test/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/409-freebsd-booting-performance-test/#bfb001001-boot-freebsd-release-from-disk-after-cold-boot","text":"Test description This test aims to verify that FreeBSD-RELEASE could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = FreeBSD 13.2 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BFB001.001 Boot FreeBSD-RELEASE from disk after cold-boot"},{"location":"unified-test-documentation/dasharo-performance/409-freebsd-booting-performance-test/#bfb002001-boot-freebsd-release-from-disk-after-warm-boot","text":"Test description This test aims to verify that FreeBSD-RELEASE could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = FreeBSD 13.2 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BFB002.001 Boot FreeBSD-RELEASE from disk after warm-boot"},{"location":"unified-test-documentation/dasharo-performance/409-freebsd-booting-performance-test/#bfb003001-boot-freebsd-release-from-disk-after-reboot","text":"Test description This test aims to verify that FreeBSD-RELEASE could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = FreeBSD 13.2 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BFB003.001 Boot FreeBSD-RELEASE from disk after reboot"},{"location":"unified-test-documentation/dasharo-performance/410-proxmox-booting-performance-test/","text":"Dasharo Performance: Proxmox booting performance test Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . BPM001.001 Boot Proxmox Virtual Environment from disk after cold-boot Test description This test aims to verify that Proxmox VE could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Proxmox VE 7.4 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BPM002.001 Boot Proxmox Virtual Environment from disk after warm-boot Test description This test aims to verify that Proxmox VE could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Proxmox VE 7.4 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BPM003.001 Boot Proxmox Virtual Environment from disk after reboot Test description This test aims to verify that Proxmox VE could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Proxmox VE 7.4 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"Proxmox booting performance test"},{"location":"unified-test-documentation/dasharo-performance/410-proxmox-booting-performance-test/#dasharo-performance-proxmox-booting-performance-test","text":"","title":"Dasharo Performance: Proxmox booting performance test"},{"location":"unified-test-documentation/dasharo-performance/410-proxmox-booting-performance-test/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/410-proxmox-booting-performance-test/#bpm001001-boot-proxmox-virtual-environment-from-disk-after-cold-boot","text":"Test description This test aims to verify that Proxmox VE could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Proxmox VE 7.4 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BPM001.001 Boot Proxmox Virtual Environment from disk after cold-boot"},{"location":"unified-test-documentation/dasharo-performance/410-proxmox-booting-performance-test/#bpm002001-boot-proxmox-virtual-environment-from-disk-after-warm-boot","text":"Test description This test aims to verify that Proxmox VE could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Proxmox VE 7.4 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BPM002.001 Boot Proxmox Virtual Environment from disk after warm-boot"},{"location":"unified-test-documentation/dasharo-performance/410-proxmox-booting-performance-test/#bpm003001-boot-proxmox-virtual-environment-from-disk-after-reboot","text":"Test description This test aims to verify that Proxmox VE could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Proxmox VE 7.4 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BPM003.001 Boot Proxmox Virtual Environment from disk after reboot"},{"location":"unified-test-documentation/dasharo-performance/411-ubuntu-server-booting-performance-test/","text":"Dasharo Performance: Ubuntu Server booting performance test Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . BUS001.001 Boot Ubuntu Server LTS from disk after cold-boot Test description This test aims to verify that Ubuntu Server LTS could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu Server 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BUS002.001 Boot Ubuntu Server LTS from disk after warm-boot Test description This test aims to verify that Ubuntu Server LTS could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu Server 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BUS003.001 Boot Ubuntu Server LTS from disk after reboot Test description This test aims to verify that Ubuntu Server LTS could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu Server 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"Ubuntu Server booting performance test"},{"location":"unified-test-documentation/dasharo-performance/411-ubuntu-server-booting-performance-test/#dasharo-performance-ubuntu-server-booting-performance-test","text":"","title":"Dasharo Performance: Ubuntu Server booting performance test"},{"location":"unified-test-documentation/dasharo-performance/411-ubuntu-server-booting-performance-test/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/411-ubuntu-server-booting-performance-test/#bus001001-boot-ubuntu-server-lts-from-disk-after-cold-boot","text":"Test description This test aims to verify that Ubuntu Server LTS could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu Server 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BUS001.001 Boot Ubuntu Server LTS from disk after cold-boot"},{"location":"unified-test-documentation/dasharo-performance/411-ubuntu-server-booting-performance-test/#bus002001-boot-ubuntu-server-lts-from-disk-after-warm-boot","text":"Test description This test aims to verify that Ubuntu Server LTS could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu Server 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BUS002.001 Boot Ubuntu Server LTS from disk after warm-boot"},{"location":"unified-test-documentation/dasharo-performance/411-ubuntu-server-booting-performance-test/#bus003001-boot-ubuntu-server-lts-from-disk-after-reboot","text":"Test description This test aims to verify that Ubuntu Server LTS could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu Server 22.04 LTS Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BUS003.001 Boot Ubuntu Server LTS from disk after reboot"},{"location":"unified-test-documentation/dasharo-performance/412-opnsense-serial-booting-performance-test/","text":"Dasharo Performance: OPNsense (serial output) booting performance test Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . BOS001.001 Boot OPNsense (serial output) from disk after cold-boot Test description This test aims to verify that OPNsense (serial output) could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense serial 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BOS002.001 Boot OPNsense (serial output) from disk after warm-boot Test description This test aims to verify that OPNsense (serial output) could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense serial 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BOS003.001 Boot OPNsense (serial output) from disk after reboot Test description This test aims to verify that OPNsense (serial output) could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense serial 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"OPNsense (serial output) booting performance test"},{"location":"unified-test-documentation/dasharo-performance/412-opnsense-serial-booting-performance-test/#dasharo-performance-opnsense-serial-output-booting-performance-test","text":"","title":"Dasharo Performance: OPNsense (serial output) booting performance test"},{"location":"unified-test-documentation/dasharo-performance/412-opnsense-serial-booting-performance-test/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/412-opnsense-serial-booting-performance-test/#bos001001-boot-opnsense-serial-output-from-disk-after-cold-boot","text":"Test description This test aims to verify that OPNsense (serial output) could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense serial 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BOS001.001 Boot OPNsense (serial output) from disk after cold-boot"},{"location":"unified-test-documentation/dasharo-performance/412-opnsense-serial-booting-performance-test/#bos002001-boot-opnsense-serial-output-from-disk-after-warm-boot","text":"Test description This test aims to verify that OPNsense (serial output) could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense serial 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BOS002.001 Boot OPNsense (serial output) from disk after warm-boot"},{"location":"unified-test-documentation/dasharo-performance/412-opnsense-serial-booting-performance-test/#bos003001-boot-opnsense-serial-output-from-disk-after-reboot","text":"Test description This test aims to verify that OPNsense (serial output) could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense serial 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BOS003.001 Boot OPNsense (serial output) from disk after reboot"},{"location":"unified-test-documentation/dasharo-performance/413-opnsense-vga-booting-performance-test/","text":"Dasharo Performance: OPNsense (VGA output) booting performance test Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . BOV001.001 Boot OPNsense (VGA output) from disk after cold-boot Test description This test aims to verify that OPNsense (VGA output) could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense VGA 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BOV002.001 Boot OPNsense (VGA output) stable from disk after warm-boot Test description This test aims to verify that OPNsense (VGA output) stable could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense VGA 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BOV003.001 Boot OPNsense (VGA output) stable from disk after reboot Test description This test aims to verify that OPNsense (VGA output) stable could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense VGA 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"OPNsense (VGA output) booting performance test"},{"location":"unified-test-documentation/dasharo-performance/413-opnsense-vga-booting-performance-test/#dasharo-performance-opnsense-vga-output-booting-performance-test","text":"","title":"Dasharo Performance: OPNsense (VGA output) booting performance test"},{"location":"unified-test-documentation/dasharo-performance/413-opnsense-vga-booting-performance-test/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/413-opnsense-vga-booting-performance-test/#bov001001-boot-opnsense-vga-output-from-disk-after-cold-boot","text":"Test description This test aims to verify that OPNsense (VGA output) could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense VGA 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BOV001.001 Boot OPNsense (VGA output) from disk after cold-boot"},{"location":"unified-test-documentation/dasharo-performance/413-opnsense-vga-booting-performance-test/#bov002001-boot-opnsense-vga-output-stable-from-disk-after-warm-boot","text":"Test description This test aims to verify that OPNsense (VGA output) stable could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense VGA 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BOV002.001 Boot OPNsense (VGA output) stable from disk after warm-boot"},{"location":"unified-test-documentation/dasharo-performance/413-opnsense-vga-booting-performance-test/#bov003001-boot-opnsense-vga-output-stable-from-disk-after-reboot","text":"Test description This test aims to verify that OPNsense (VGA output) stable could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = OPNsense VGA 23.01 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BOV003.001 Boot OPNsense (VGA output) stable from disk after reboot"},{"location":"unified-test-documentation/dasharo-performance/414-pfsense-serial-booting-performance-test/","text":"Dasharo Performance: pfSense (serial output) booting performance test Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . BPS001.001 Boot pfSense LTS CE (serial output) from disk after cold-boot Test description This test aims to verify that pfSense LTS CE (serial output) could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE serial 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BPS002.001 Boot pfSense LTS CE (serial output) from disk after warm-boot Test description This test aims to verify that pfSense LTS CE (serial output) could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE serial 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BPS003.001 Boot pfSense LTS CE (serial output) from disk after reboot Test description This test aims to verify that pfSense LTS CE (serial output) could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE serial 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"pfSense (serial output) booting performance test"},{"location":"unified-test-documentation/dasharo-performance/414-pfsense-serial-booting-performance-test/#dasharo-performance-pfsense-serial-output-booting-performance-test","text":"","title":"Dasharo Performance: pfSense (serial output) booting performance test"},{"location":"unified-test-documentation/dasharo-performance/414-pfsense-serial-booting-performance-test/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/414-pfsense-serial-booting-performance-test/#bps001001-boot-pfsense-lts-ce-serial-output-from-disk-after-cold-boot","text":"Test description This test aims to verify that pfSense LTS CE (serial output) could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE serial 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BPS001.001 Boot pfSense LTS CE (serial output) from disk after cold-boot"},{"location":"unified-test-documentation/dasharo-performance/414-pfsense-serial-booting-performance-test/#bps002001-boot-pfsense-lts-ce-serial-output-from-disk-after-warm-boot","text":"Test description This test aims to verify that pfSense LTS CE (serial output) could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE serial 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BPS002.001 Boot pfSense LTS CE (serial output) from disk after warm-boot"},{"location":"unified-test-documentation/dasharo-performance/414-pfsense-serial-booting-performance-test/#bps003001-boot-pfsense-lts-ce-serial-output-from-disk-after-reboot","text":"Test description This test aims to verify that pfSense LTS CE (serial output) could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE serial 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BPS003.001 Boot pfSense LTS CE (serial output) from disk after reboot"},{"location":"unified-test-documentation/dasharo-performance/415-pfsense-vga-booting-performance-test/","text":"Dasharo Performance: pfSense (VGA output) booting performance test Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . BPV001.001 Boot pfSense LTS CE (VGA output) from disk after cold-boot Test description This test aims to verify that pfSense LTS CE (VGA output) could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE VGA 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BPV002.001 Boot pfSense LTS CE (VGA output) from disk after warm-boot Test description This test aims to verify that pfSense LTS CE (VGA output) could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE VGA 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BPV003.001 Boot pfSense LTS CE (VGA output) from disk after reboot Test description This test aims to verify that pfSense LTS CE (VGA output) could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE VGA 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"pfSense (VGA output) booting performance test"},{"location":"unified-test-documentation/dasharo-performance/415-pfsense-vga-booting-performance-test/#dasharo-performance-pfsense-vga-output-booting-performance-test","text":"","title":"Dasharo Performance: pfSense (VGA output) booting performance test"},{"location":"unified-test-documentation/dasharo-performance/415-pfsense-vga-booting-performance-test/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/415-pfsense-vga-booting-performance-test/#bpv001001-boot-pfsense-lts-ce-vga-output-from-disk-after-cold-boot","text":"Test description This test aims to verify that pfSense LTS CE (VGA output) could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE VGA 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BPV001.001 Boot pfSense LTS CE (VGA output) from disk after cold-boot"},{"location":"unified-test-documentation/dasharo-performance/415-pfsense-vga-booting-performance-test/#bpv002001-boot-pfsense-lts-ce-vga-output-from-disk-after-warm-boot","text":"Test description This test aims to verify that pfSense LTS CE (VGA output) could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE VGA 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BPV002.001 Boot pfSense LTS CE (VGA output) from disk after warm-boot"},{"location":"unified-test-documentation/dasharo-performance/415-pfsense-vga-booting-performance-test/#bpv003001-boot-pfsense-lts-ce-vga-output-from-disk-after-reboot","text":"Test description This test aims to verify that pfSense LTS CE (VGA output) could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = pfSense CE VGA 2.6.0 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo reboot Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BPV003.001 Boot pfSense LTS CE (VGA output) from disk after reboot"},{"location":"unified-test-documentation/dasharo-performance/416-windows-booting-performance-test/","text":"Dasharo Performance: Windows booting performance test Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . BWI001.001 Boot Windows 11 from disk after cold-boot Test description This test aims to verify that Windows 11 could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BWI002.001 Boot Windows 11 from disk after warm-boot Test description This test aims to verify that Windows 11 could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed. BWI003.001 Boot Windows 11 from disk after reboot Test description This test aims to verify that Windows 11 could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Reboot the device executing in PowerShell: Restart-Computer Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"Windows booting performance test"},{"location":"unified-test-documentation/dasharo-performance/416-windows-booting-performance-test/#dasharo-performance-windows-booting-performance-test","text":"","title":"Dasharo Performance: Windows booting performance test"},{"location":"unified-test-documentation/dasharo-performance/416-windows-booting-performance-test/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-performance/416-windows-booting-performance-test/#bwi001001-boot-windows-11-from-disk-after-cold-boot","text":"Test description This test aims to verify that Windows 11 could be booted from the disk on the DUT after cold-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Cut the power off while DUT is turned on. Restore power and power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BWI001.001 Boot Windows 11 from disk after cold-boot"},{"location":"unified-test-documentation/dasharo-performance/416-windows-booting-performance-test/#bwi002001-boot-windows-11-from-disk-after-warm-boot","text":"Test description This test aims to verify that Windows 11 could be booted from the disk on the DUT after warm-boot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BWI002.001 Boot Windows 11 from disk after warm-boot"},{"location":"unified-test-documentation/dasharo-performance/416-windows-booting-performance-test/#bwi003001-boot-windows-11-from-disk-after-reboot","text":"Test description This test aims to verify that Windows 11 could be booted from the disk on the DUT after reboot. The test is performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Reboot the device executing in PowerShell: Restart-Computer Press BOOT_MENU_KEY to enter the boot menu. In the Boot Menu , select the disk on which the system was previously installed or boot entry with the name of OPERATING_SYSTEM . Wait for the OPERATING_SYSTEM to boot and note the result. Expected result The OPERATING_SYSTEM login screen should be displayed.","title":"BWI003.001 Boot Windows 11 from disk after reboot"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/","text":"Dasharo Security: TPM Support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . TPM001.001 TPM Support (firmware) Test description This test aims to verify that the TPM is initialized correctly and the PCRs can be accessed from the firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the BIOS. Enter the shell. Run the following command in the shell: cbmem -L Expected result The command should return information about the TPM log entries. Example output: TPM2 log: Specification: 2 .00 Platform class: PC Client No vendor information provided TPM2 log entry 1 : PCR: 2 Event type: Action Digests: SHA1: f78a530fb5a70afcffdc86a98529abd24a90bac9 Event data: FMAP: FMAP TPM2 log entry 2 : PCR: 2 Event type: Action Digests: SHA1: 369155e6eab3b0a874140e591a4c0e992268b4b9 Event data: FMAP: BOOTBLOCK TPM2 log entry 3 : PCR: 2 Event type: Action Digests: SHA1: 5e785c080264aa6e169f70c80ac40b556066292b Event data: FMAP: COREBOOT CBFS: fallback/romstage TPM2 log entry 4 : PCR: 2 Event type: Action Digests: SHA1: ba2a5af955811fbac58a5198545539596eb38c3e Event data: FMAP: COREBOOT CBFS: fallback/ramstage TPM2 log entry 5 : PCR: 2 Event type: Action Digests: SHA1: ba35d4ce29d7b633b5644e2a3206c6069cf7f24d Event data: FMAP: COREBOOT CBFS: fallback/payload TPM2 log entry 6 : PCR: 2 Event type: Action Digests: SHA1: 47b49026133377e05193f8440c9a7cad239e883c Event data: FMAP: COREBOOT CBFS: 1 -cpu.dtb TPM2 log entry 7 : PCR: 3 Event type: Action Digests: SHA256: 6e7b06693452d997ac534e823b1ea79e5bb8ed19ba8a7af878abf10199c3d515 SHA1: 6e7b06693452d997ac534e823b1ea79e5bb8ed19 Event data: VERSION TPM2 log entry 8 : PCR: 2 Event type: Action Digests: SHA256: de73053377e1ae5ba5d2b637a4f5bfaeb410137722f11ef135e7a1be524e3092 SHA1: de73053377e1ae5ba5d2b637a4f5bfaeb4101377 Event data: IMA_CATALOG TPM2 log entry 9 : PCR: 4 Event type: Action Digests: SHA256: ba427f9349b1f9e589f98909e26086b0cfd5ced78a7fbcb140a70a506c38a8e5 SHA1: ba427f9349b1f9e589f98909e26086b0cfd5ced7 Event data: BOOTKERNEL ( ... ) TPM001.002 TPM Support (Ubuntu 22.04) Test description This test aims to verify that the TPM is initialized correctly and the PCRs can be accessed from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the tpm2-tools package: sudo apt install tpm2-tools . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Check the version of installed tpm2-tools - execute the following command in the terminal: dpkg --list tpm2-tools If your device is equipped with TPM2.0 and the version of tpm2-tools is 4.0 or higher - execute the following command in the terminal: tpm2_pcrread If your device is equipped with TPM2.0 and the version of tpm2-tools is lower than 4.0 - execute the following command in the terminal: tpm2_pcrlist If your device is equipped with TPM1.2 - execute the following command in the terminal: cat /sys/class/tpm/tpm0/pcrs Expected result The command should return a list of PCRs and their contents. Output example for TPM2.0: sha1 : 0 : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275 1 : 8a074fdf65a11e5dbf02d25e7f26b00c26c98b41 2 : c36c2509d636c9cfa075d6d0a03b7a37bec14ee9 3 : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275 4 : 2d247bb671ec17ded623ca45967df5482517291b 5 : 49d543eb1d1df3439d9fca695ee47b8cdf4b9e2f 6 : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275 7 : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275 8 : 0000000000000000000000000000000000000000 9 : 0000000000000000000000000000000000000000 10 : 0000000000000000000000000000000000000000 11 : 0000000000000000000000000000000000000000 12 : 0000000000000000000000000000000000000000 13 : 0000000000000000000000000000000000000000 14 : 0000000000000000000000000000000000000000 15 : 0000000000000000000000000000000000000000 16 : 0000000000000000000000000000000000000000 17 : ffffffffffffffffffffffffffffffffffffffff 18 : ffffffffffffffffffffffffffffffffffffffff 19 : ffffffffffffffffffffffffffffffffffffffff 20 : ffffffffffffffffffffffffffffffffffffffff 21 : ffffffffffffffffffffffffffffffffffffffff 22 : ffffffffffffffffffffffffffffffffffffffff 23 : 0000000000000000000000000000000000000000 sha256 : 0 : d27cc12614b5f4ff85ed109495e320fb1e5495eb28d507e952d51091e7ae2a72 1 : b29a64bd6895966b777eb803f45e6bbffade81cc1b996a34f7cbd26f1d04028b 2 : 3122422e43b9fbfc0cb70eb467b55e99ec61462370e6b15c515484f821e1d4d9 3 : 909e4261938378c0556a4c335c38718d1c313bd151fdf222df674aabb7aeee97 4 : 984763b42633ee11e5167e2f67c2e6879bd6efac683f1df1ef16d7ce96d4b49b 5 : dab92c45eeb765e29784f8cc33f92d0a39afed173f2b07e0e328586c3c3b19ed 6 : d27cc12614b5f4ff85ed109495e320fb1e5495eb28d507e952d51091e7ae2a72 7 : d27cc12614b5f4ff85ed109495e320fb1e5495eb28d507e952d51091e7ae2a72 8 : 0000000000000000000000000000000000000000000000000000000000000000 9 : 0000000000000000000000000000000000000000000000000000000000000000 10 : 0000000000000000000000000000000000000000000000000000000000000000 11 : 0000000000000000000000000000000000000000000000000000000000000000 12 : 0000000000000000000000000000000000000000000000000000000000000000 13 : 0000000000000000000000000000000000000000000000000000000000000000 14 : 0000000000000000000000000000000000000000000000000000000000000000 15 : 0000000000000000000000000000000000000000000000000000000000000000 16 : 0000000000000000000000000000000000000000000000000000000000000000 17 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 18 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 19 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 20 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 22 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 23 : 0000000000000000000000000000000000000000000000000000000000000000 Output example for TPM1.2: PCR-00: B3 F3 60 E1 D5 1F 82 D4 62 E6 B9 69 92 2F 65 F4 9F 1A 5F 8E PCR-01: 21 9F 1F 4A C1 AD AD 4D F1 8B 9F AB 98 23 68 B1 73 A6 32 87 PCR-02: 40 CF E3 DC A7 FF 67 FB AA BB 20 85 A4 39 43 D8 54 A7 AB 98 PCR-03: E3 E7 E6 89 CA FB F5 75 38 95 D0 CD 83 96 F6 0C 38 04 DC D5 PCR-04: 01 7A 3D E8 2F 4A 1B 77 FC 33 A9 03 FE F6 AD 27 EE 92 BE 04 PCR-05: 93 6A 12 98 07 73 85 9D 91 27 61 82 E7 11 C5 1D 08 98 C4 28 PCR-06: 3A 3F 78 0F 11 A4 B4 99 69 FC AA 80 CD 6E 39 57 C3 3B 22 75 PCR-07: 3A 3F 78 0F 11 A4 B4 99 69 FC AA 80 CD 6E 39 57 C3 3B 22 75 PCR-08: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-09: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-11: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-12: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-14: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-15: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-16: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-17: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-18: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-19: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-21: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-22: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-23: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 TPM001.003 TPM Support (Windows 11) Test description This test aims to verify that the TPM is initialized correctly and the PCRs can be accessed from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a PowerShell as administrator and run the following command: get-tpm Expected result The command should return information about the TPM state: if the TPM is present, ready and enabled: TpmPresent : True TpmReady : True TpmEnabled : True TPM002.001 Verify TPM version (firmware) Test description This test aims to verify that the TPM version is correctly recognized by the firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the BIOS. Enter the shell. Run the following command in the shell: cbmem -L Expected result The output of the command should contain information about the TPM version. Example output: TPM2 log: Specification: 2 .00 TPM002.002 Verify TPM version (Ubuntu 22.04) Test description This test aims to verify that the TPM version is correctly recognized by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Check the version of installed tpm2-tools - execute the following command in the terminal: dmesg | grep -i tpm Expected result The command should return information about the TPM version. Example output: tpm_tis 00 :07: 1 .2 TPM ( device-id 0x0, rev-id 78 ) TPM002.003 Verify TPM version (Windows 11) Test description This test aims to verify that the TPM version is correctly recognized by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a PowerShell as administrator and run the following command: wmic / namespace :\\\\ root \\ cimv2 \\ security \\ microsofttpm path win32_tpm get * / format : textvaluelist . xsl Expected result The command should return information about the TPM version. Example output: SpecVersion=2.0 TPM003.001 Check TPM Physical Presence Interface (firmware) Test description This test aims to verify that the TPM Physical Presence Interface is supported by the firmware. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Download cbmem from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the terminal and run the following command and note results: sudo cbmem -1 | grep PPI Expected result The cbmem.log should contain the following lines (the hex numbers may be different per platform): [DEBUG] PPI: Pending OS request: 0x0 (0x0) [DEBUG] PPI: OS response: CMD 0x39073907 = 0x0 [DEBUG] TPM PPI 8. 0x76ffe620 0x0000015a If the above lines are present, the firmware supports TPM PPI. TPM003.002 Check TPM Physical Presence Interface (Ubuntu 22.04) Test description This test aims to verify that the TPM Physical Presence Interface is correctly recognized by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Platform with TPM 2.0 module present. Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the terminal and run the following command to check the version of TPM PPI in sysfs: cat /sys/class/tpm/tpm0/ppi/version Expected result The command should return information about the TPM PPI version (only 1.3 is valid). If PPI is not available the file will not be found and test fails. Example output: $ cat /sys/class/tpm/tpm0/ppi/version 1 .3 TPM003.003 Check TPM Physical Presence Interface (Windows 11) Test description This test aims to verify that the TPM Physical Presence Interface is correctly recognized by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Platform with TPM 2.0 module present. Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a PowerShell as administrator and run the following command: tpmtool getdeviceinformation Expected result The command should return information about the TPM PPI version (only 1.3 is valid). If PPI is not available on the list, test fails. Example output: tpmtool getdeviceinformation -TPM Present : True -TPM Version : 2 . 0 -TPM Manufacturer ID : INTC -TPM Manufacturer Full Name : Intel -TPM Manufacturer Version : 600 . 18 . 0 . 0 -PPI Version : 1 . 3 -Is Initialized : True -Ready For Storage : True -Ready For Attestation : True -Is Capable For Attestation : True -Clear Needed To Recover : False -Clear Possible : True -TPM Has Vulnerable Firmware : False -Maintenance Task Complete : True -Bitlocker PCR7 Binding State : Binding Not Possible -TPM Spec Version : 1 . 38 -TPM Errata Date : Wednesday , December 18 , 2019 -PC Client Version : 1 . 04 -Lockout Information : -Is Locked Out : False -Lockout Counter : 0 -Max Auth Fail : 32 -Lockout Interval : 7200s -Lockout Recovery : 86400s TPM003.004 Change active PCR banks with TPM PPI (firmware) Test description This test aims to verify that the TPM Physical Presence Interface is working properly in the firmware by changing active TPM PCR banks. Test configuration data FIRMWARE = Dasharo Platform with TPM 2.0 module present. TPM003.001 indicating that TPM PPI is supported. Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the firmware setup using the BIOS_SETUP_KEY . Enter the Device Manager -> TCG2 Configuration . Scroll down to the bottom of the page using arrow down key. Switch active PCR banks depending on the currently active banks.: if both SHA1 and SHA256 are active, deactivate SHA1 if SHA1 only is active, activate SHA256 and deactivate SHA1 if SHA256 only is active, activate SHA1 and deactivate SHA256 Press F10 to save and go back to the main setup page using ESC key. Use the Reset option on the main setup page to reboot the DUT. After reset a prompt should appear explaining a TPM state change request has been made. Press F12 as instructed to apply changes. The DUT will need to reboot again. After the reboot enter the Device Manager -> TCG2 Configuration again. Scroll down to the bottom of the page using arrow down key. Verify the active PCR banks were changed according to the choice made in step 5. NOTE: Certain TPMs like Intel PTT (fTPM) do not allow to set more than one active PCR bank at a given time, that is why the test case keeps only one bank active. Discrete TPMs may have multiple banks enabled simultaneously, but it is TPM module and TPM firmware dependent. Expected result The prompt appears at step 8. The requested changes are applied as verified in step 11. The prompt seen on the DUT screen has the following format (example change from SHA256 to SHA1): A configuration change was requested to PCR bank(s) of this computer's TPM (Trusted Platform Module) WARNING: Changing the PCR bank(s) of the boot measurements may prevent the Operating System from properly processing the measurements. Please check if your Operating System supports the new PCR bank(s). WARNING: Secrets in the TPM that are bound to the boot state of your machine may become unusable. Current PCRBanks is 0x2. (SHA256) New PCRBanks is 0x1. (SHA1) Press F12 change the boot measurements to use PCR bank(s) of the TPM Press ESC to reject this change request and continue","title":"TPM support"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#dasharo-security-tpm-support","text":"","title":"Dasharo Security: TPM Support"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#tpm001001-tpm-support-firmware","text":"Test description This test aims to verify that the TPM is initialized correctly and the PCRs can be accessed from the firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the BIOS. Enter the shell. Run the following command in the shell: cbmem -L Expected result The command should return information about the TPM log entries. Example output: TPM2 log: Specification: 2 .00 Platform class: PC Client No vendor information provided TPM2 log entry 1 : PCR: 2 Event type: Action Digests: SHA1: f78a530fb5a70afcffdc86a98529abd24a90bac9 Event data: FMAP: FMAP TPM2 log entry 2 : PCR: 2 Event type: Action Digests: SHA1: 369155e6eab3b0a874140e591a4c0e992268b4b9 Event data: FMAP: BOOTBLOCK TPM2 log entry 3 : PCR: 2 Event type: Action Digests: SHA1: 5e785c080264aa6e169f70c80ac40b556066292b Event data: FMAP: COREBOOT CBFS: fallback/romstage TPM2 log entry 4 : PCR: 2 Event type: Action Digests: SHA1: ba2a5af955811fbac58a5198545539596eb38c3e Event data: FMAP: COREBOOT CBFS: fallback/ramstage TPM2 log entry 5 : PCR: 2 Event type: Action Digests: SHA1: ba35d4ce29d7b633b5644e2a3206c6069cf7f24d Event data: FMAP: COREBOOT CBFS: fallback/payload TPM2 log entry 6 : PCR: 2 Event type: Action Digests: SHA1: 47b49026133377e05193f8440c9a7cad239e883c Event data: FMAP: COREBOOT CBFS: 1 -cpu.dtb TPM2 log entry 7 : PCR: 3 Event type: Action Digests: SHA256: 6e7b06693452d997ac534e823b1ea79e5bb8ed19ba8a7af878abf10199c3d515 SHA1: 6e7b06693452d997ac534e823b1ea79e5bb8ed19 Event data: VERSION TPM2 log entry 8 : PCR: 2 Event type: Action Digests: SHA256: de73053377e1ae5ba5d2b637a4f5bfaeb410137722f11ef135e7a1be524e3092 SHA1: de73053377e1ae5ba5d2b637a4f5bfaeb4101377 Event data: IMA_CATALOG TPM2 log entry 9 : PCR: 4 Event type: Action Digests: SHA256: ba427f9349b1f9e589f98909e26086b0cfd5ced78a7fbcb140a70a506c38a8e5 SHA1: ba427f9349b1f9e589f98909e26086b0cfd5ced7 Event data: BOOTKERNEL ( ... )","title":"TPM001.001 TPM Support (firmware)"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#tpm001002-tpm-support-ubuntu-2204","text":"Test description This test aims to verify that the TPM is initialized correctly and the PCRs can be accessed from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the tpm2-tools package: sudo apt install tpm2-tools . Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Check the version of installed tpm2-tools - execute the following command in the terminal: dpkg --list tpm2-tools If your device is equipped with TPM2.0 and the version of tpm2-tools is 4.0 or higher - execute the following command in the terminal: tpm2_pcrread If your device is equipped with TPM2.0 and the version of tpm2-tools is lower than 4.0 - execute the following command in the terminal: tpm2_pcrlist If your device is equipped with TPM1.2 - execute the following command in the terminal: cat /sys/class/tpm/tpm0/pcrs Expected result The command should return a list of PCRs and their contents. Output example for TPM2.0: sha1 : 0 : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275 1 : 8a074fdf65a11e5dbf02d25e7f26b00c26c98b41 2 : c36c2509d636c9cfa075d6d0a03b7a37bec14ee9 3 : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275 4 : 2d247bb671ec17ded623ca45967df5482517291b 5 : 49d543eb1d1df3439d9fca695ee47b8cdf4b9e2f 6 : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275 7 : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275 8 : 0000000000000000000000000000000000000000 9 : 0000000000000000000000000000000000000000 10 : 0000000000000000000000000000000000000000 11 : 0000000000000000000000000000000000000000 12 : 0000000000000000000000000000000000000000 13 : 0000000000000000000000000000000000000000 14 : 0000000000000000000000000000000000000000 15 : 0000000000000000000000000000000000000000 16 : 0000000000000000000000000000000000000000 17 : ffffffffffffffffffffffffffffffffffffffff 18 : ffffffffffffffffffffffffffffffffffffffff 19 : ffffffffffffffffffffffffffffffffffffffff 20 : ffffffffffffffffffffffffffffffffffffffff 21 : ffffffffffffffffffffffffffffffffffffffff 22 : ffffffffffffffffffffffffffffffffffffffff 23 : 0000000000000000000000000000000000000000 sha256 : 0 : d27cc12614b5f4ff85ed109495e320fb1e5495eb28d507e952d51091e7ae2a72 1 : b29a64bd6895966b777eb803f45e6bbffade81cc1b996a34f7cbd26f1d04028b 2 : 3122422e43b9fbfc0cb70eb467b55e99ec61462370e6b15c515484f821e1d4d9 3 : 909e4261938378c0556a4c335c38718d1c313bd151fdf222df674aabb7aeee97 4 : 984763b42633ee11e5167e2f67c2e6879bd6efac683f1df1ef16d7ce96d4b49b 5 : dab92c45eeb765e29784f8cc33f92d0a39afed173f2b07e0e328586c3c3b19ed 6 : d27cc12614b5f4ff85ed109495e320fb1e5495eb28d507e952d51091e7ae2a72 7 : d27cc12614b5f4ff85ed109495e320fb1e5495eb28d507e952d51091e7ae2a72 8 : 0000000000000000000000000000000000000000000000000000000000000000 9 : 0000000000000000000000000000000000000000000000000000000000000000 10 : 0000000000000000000000000000000000000000000000000000000000000000 11 : 0000000000000000000000000000000000000000000000000000000000000000 12 : 0000000000000000000000000000000000000000000000000000000000000000 13 : 0000000000000000000000000000000000000000000000000000000000000000 14 : 0000000000000000000000000000000000000000000000000000000000000000 15 : 0000000000000000000000000000000000000000000000000000000000000000 16 : 0000000000000000000000000000000000000000000000000000000000000000 17 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 18 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 19 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 20 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 21 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 22 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 23 : 0000000000000000000000000000000000000000000000000000000000000000 Output example for TPM1.2: PCR-00: B3 F3 60 E1 D5 1F 82 D4 62 E6 B9 69 92 2F 65 F4 9F 1A 5F 8E PCR-01: 21 9F 1F 4A C1 AD AD 4D F1 8B 9F AB 98 23 68 B1 73 A6 32 87 PCR-02: 40 CF E3 DC A7 FF 67 FB AA BB 20 85 A4 39 43 D8 54 A7 AB 98 PCR-03: E3 E7 E6 89 CA FB F5 75 38 95 D0 CD 83 96 F6 0C 38 04 DC D5 PCR-04: 01 7A 3D E8 2F 4A 1B 77 FC 33 A9 03 FE F6 AD 27 EE 92 BE 04 PCR-05: 93 6A 12 98 07 73 85 9D 91 27 61 82 E7 11 C5 1D 08 98 C4 28 PCR-06: 3A 3F 78 0F 11 A4 B4 99 69 FC AA 80 CD 6E 39 57 C3 3B 22 75 PCR-07: 3A 3F 78 0F 11 A4 B4 99 69 FC AA 80 CD 6E 39 57 C3 3B 22 75 PCR-08: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-09: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-11: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-12: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-14: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-15: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-16: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 PCR-17: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-18: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-19: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-21: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-22: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF PCR-23: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00","title":"TPM001.002 TPM Support (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#tpm001003-tpm-support-windows-11","text":"Test description This test aims to verify that the TPM is initialized correctly and the PCRs can be accessed from the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a PowerShell as administrator and run the following command: get-tpm Expected result The command should return information about the TPM state: if the TPM is present, ready and enabled: TpmPresent : True TpmReady : True TpmEnabled : True","title":"TPM001.003 TPM Support (Windows 11)"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#tpm002001-verify-tpm-version-firmware","text":"Test description This test aims to verify that the TPM version is correctly recognized by the firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the BIOS. Enter the shell. Run the following command in the shell: cbmem -L Expected result The output of the command should contain information about the TPM version. Example output: TPM2 log: Specification: 2 .00","title":"TPM002.001 Verify TPM version (firmware)"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#tpm002002-verify-tpm-version-ubuntu-2204","text":"Test description This test aims to verify that the TPM version is correctly recognized by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Check the version of installed tpm2-tools - execute the following command in the terminal: dmesg | grep -i tpm Expected result The command should return information about the TPM version. Example output: tpm_tis 00 :07: 1 .2 TPM ( device-id 0x0, rev-id 78 )","title":"TPM002.002 Verify TPM version (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#tpm002003-verify-tpm-version-windows-11","text":"Test description This test aims to verify that the TPM version is correctly recognized by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a PowerShell as administrator and run the following command: wmic / namespace :\\\\ root \\ cimv2 \\ security \\ microsofttpm path win32_tpm get * / format : textvaluelist . xsl Expected result The command should return information about the TPM version. Example output: SpecVersion=2.0","title":"TPM002.003 Verify TPM version (Windows 11)"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#tpm003001-check-tpm-physical-presence-interface-firmware","text":"Test description This test aims to verify that the TPM Physical Presence Interface is supported by the firmware. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Download cbmem from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the terminal and run the following command and note results: sudo cbmem -1 | grep PPI Expected result The cbmem.log should contain the following lines (the hex numbers may be different per platform): [DEBUG] PPI: Pending OS request: 0x0 (0x0) [DEBUG] PPI: OS response: CMD 0x39073907 = 0x0 [DEBUG] TPM PPI 8. 0x76ffe620 0x0000015a If the above lines are present, the firmware supports TPM PPI.","title":"TPM003.001 Check TPM Physical Presence Interface (firmware)"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#tpm003002-check-tpm-physical-presence-interface-ubuntu-2204","text":"Test description This test aims to verify that the TPM Physical Presence Interface is correctly recognized by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Platform with TPM 2.0 module present. Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open the terminal and run the following command to check the version of TPM PPI in sysfs: cat /sys/class/tpm/tpm0/ppi/version Expected result The command should return information about the TPM PPI version (only 1.3 is valid). If PPI is not available the file will not be found and test fails. Example output: $ cat /sys/class/tpm/tpm0/ppi/version 1 .3","title":"TPM003.002 Check TPM Physical Presence Interface (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#tpm003003-check-tpm-physical-presence-interface-windows-11","text":"Test description This test aims to verify that the TPM Physical Presence Interface is correctly recognized by the operating system. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Platform with TPM 2.0 module present. Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a PowerShell as administrator and run the following command: tpmtool getdeviceinformation Expected result The command should return information about the TPM PPI version (only 1.3 is valid). If PPI is not available on the list, test fails. Example output: tpmtool getdeviceinformation -TPM Present : True -TPM Version : 2 . 0 -TPM Manufacturer ID : INTC -TPM Manufacturer Full Name : Intel -TPM Manufacturer Version : 600 . 18 . 0 . 0 -PPI Version : 1 . 3 -Is Initialized : True -Ready For Storage : True -Ready For Attestation : True -Is Capable For Attestation : True -Clear Needed To Recover : False -Clear Possible : True -TPM Has Vulnerable Firmware : False -Maintenance Task Complete : True -Bitlocker PCR7 Binding State : Binding Not Possible -TPM Spec Version : 1 . 38 -TPM Errata Date : Wednesday , December 18 , 2019 -PC Client Version : 1 . 04 -Lockout Information : -Is Locked Out : False -Lockout Counter : 0 -Max Auth Fail : 32 -Lockout Interval : 7200s -Lockout Recovery : 86400s","title":"TPM003.003 Check TPM Physical Presence Interface (Windows 11)"},{"location":"unified-test-documentation/dasharo-security/200-tpm-support/#tpm003004-change-active-pcr-banks-with-tpm-ppi-firmware","text":"Test description This test aims to verify that the TPM Physical Presence Interface is working properly in the firmware by changing active TPM PCR banks. Test configuration data FIRMWARE = Dasharo Platform with TPM 2.0 module present. TPM003.001 indicating that TPM PPI is supported. Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the firmware setup using the BIOS_SETUP_KEY . Enter the Device Manager -> TCG2 Configuration . Scroll down to the bottom of the page using arrow down key. Switch active PCR banks depending on the currently active banks.: if both SHA1 and SHA256 are active, deactivate SHA1 if SHA1 only is active, activate SHA256 and deactivate SHA1 if SHA256 only is active, activate SHA1 and deactivate SHA256 Press F10 to save and go back to the main setup page using ESC key. Use the Reset option on the main setup page to reboot the DUT. After reset a prompt should appear explaining a TPM state change request has been made. Press F12 as instructed to apply changes. The DUT will need to reboot again. After the reboot enter the Device Manager -> TCG2 Configuration again. Scroll down to the bottom of the page using arrow down key. Verify the active PCR banks were changed according to the choice made in step 5. NOTE: Certain TPMs like Intel PTT (fTPM) do not allow to set more than one active PCR bank at a given time, that is why the test case keeps only one bank active. Discrete TPMs may have multiple banks enabled simultaneously, but it is TPM module and TPM firmware dependent. Expected result The prompt appears at step 8. The requested changes are applied as verified in step 11. The prompt seen on the DUT screen has the following format (example change from SHA256 to SHA1): A configuration change was requested to PCR bank(s) of this computer's TPM (Trusted Platform Module) WARNING: Changing the PCR bank(s) of the boot measurements may prevent the Operating System from properly processing the measurements. Please check if your Operating System supports the new PCR bank(s). WARNING: Secrets in the TPM that are bound to the boot state of your machine may become unusable. Current PCRBanks is 0x2. (SHA256) New PCRBanks is 0x1. (SHA1) Press F12 change the boot measurements to use PCR bank(s) of the TPM Press ESC to reject this change request and continue","title":"TPM003.004 Change active PCR banks with TPM PPI (firmware)"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/","text":"Dasharo Security: Verified Boot support Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . VBO001.001 Generating keys for Verified Boot Test description This test aims to verify whether there is a possibility to generate vboot keys for signing the firmware. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Based on the dedicated documentation generate the keys . Check if the keys, after finishing the generating process, are available in the keys subdirectory. Expected result The keys location should contain the generated keys. VBO002.001 Signing image without rebuild Test description This test aims to verify whether there is a possibility to sign the firmware image with generated keys without rebuilding. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Localize the keys, which were generated in the VBO001.001 test case. Based on the dedicated documentation sign the firmware image with the keys without rebuilding. Note the result. Expected result The output of the last command should contain information that resigning procedure was successful. Example output: ... INFO: sign_bios_at_end: BIOS image does not have FW_MAIN_B. Signing only FW_MAIN_A - import root_key from /.../keys/root_key.vbpubk: success - import recovery_key from /.../keys/recovery_key.vbpubk: success successfully saved new image to: /.../protectli_vault_cml_v1.0.16_resigned.rom The /.../protectli_vault_cml_v1.0.16.rom was resigned and saved as: /.../protectli_vault_cml_v1.0.16_resigned.rom VBO003.001 Flashing device with the signed firmware Test description This test aims to verify whether there is a possibility to flash the locally signed firmware to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Localize the firmware, which was signed in the VBO002.001 test case. Flash the firmware by using the internal programmer and flashrom tool. If DUT is already flashed with the Dasharo firmware, the following command should be used: flashrom -p internal -w [ path-to-binary ] --fmap -i RW_SECTION_A Otherwise, the following command should be used: flashrom -p internal -w [ path-to-binary ] --ifd -i bios Reboot the DUT. and note the results. Expected result The DUT reboots properly without issues related to firmware signing. VBO004.001 Adding keys and building image Test description This test aims to verify whether there is a possibility to build firmware on the local machine, based on Build manual procedure dedicated to the platform and sign it with the locally generated keys. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Make yourself familiar with Building manual procedure dedicated for the relevant platform: NovaCustom laptops Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Localize the keys, which were generated in the VBO001.001 test case. Based on the dedicated documentation add locally generated keys to the coreboot config. Based on the dedicated documentation build firmware. Check if the binary file, after finishing the building process, is available in the build subdirectory. Expected result The build location should contain the binary file, which size is equal to the flash chip size. VBO005.001 Flashing device with built firmware Test description This test aims to verify it is possible to flash and boot DUT with signed firmware image. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Localize the firmware, which was built in the VBO004.001 test case. Flash the firmware by using the internal programmer and flashrom tool. If DUT is already flashed with the Dasharo firmware, the following command should be used: flashrom -p internal -w [ path-to-binary ] --fmap -i RW_SECTION_A Otherwise, the following command should be used: flashrom -p internal -w [ path-to-binary ] --ifd -i bios Reboot the DUT. and note the results. Expected result The DUT reboots properly without issues related to firmware signing. VBO006.001 Verified boot support (firmware) Test description Verified Boot is a method of verifying that the firmware components come from a trusted source. This test aims to confirm that verified boot is enabled and functional. Test setup Proceed with the Generic test setup: firmware . Disable Secure Boot. Test steps Power on the DUT. Read coreboot loading logs. Expected result The logs should indicate that vboot is enabled and verstage has been entered: VBOOT: Loading verstage. VBO006.002 Verified boot support (Ubuntu 22.04) Test description Verified Boot is a method of verifying that the firmware components come from a trusted source. This test aims to confirm that verified boot is enabled and functional. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. Disable Secure Boot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -c | grep VBOOT Expected result The output of the command should indicate that vboot is enabled and verstage has been entered: VBOOT: Loading verstage. TPM: Extending digest for VBOOT: boot mode into PCR 0 TPM: Extending digest for VBOOT: GBB HWID into PCR 1 VBOOT WORK 8. 0x76c05000 0x00014000 PCR-0 2547cc736e951fa4919853c43ae890861a3b3264000000000000000000000000 SHA256 [VBOOT: boot mode] PCR-1 e3324765a25f8a59c7c20cc35c1c33a8ab384159d2b40a269246b0b4491cdf89 SHA256 [VBOOT: GBB HWID] VBO007.001 Verified boot: Booting from Slot A (firmware) Test description If the signatures for firmware stored in vboot Slot A are correct, vboot should proceed to boot from Slot A. Test setup Proceed with the Generic test setup: firmware . Disable Secure Boot. Test steps Power on the DUT. Read coreboot loading logs. Expected result The logs should indicate that vboot has chosen to boot from slot A: Slot A is selected VBO007.002 Verified boot: Booting from Slot A (Ubuntu 22.04) Test description If the signatures for firmware stored in vboot Slot A are correct, vboot should proceed to boot from Slot A. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. Disable Secure Boot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -c | grep \"Slot A\" Expected result The output of the command should indicate that vboot has chosen to boot from slot A: Slot A is selected VBO008.001 Verified boot: Booting from Recovery (Ubuntu 22.04) Test description If the signatures for firmware stored in vboot Slot A are incorrect, vboot should revert to booting from the recovery slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. Disable Secure Boot. Obtain coreboot binary signed with wrong vboot keys. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Flash coreboot signed with wrong vboot keys by executing the following command: flashrom -p internal --fmap -i RW_SECTION_A -w [ coreboot binary ] Power off the DUT Connect to the DUT using the serial port. Power on the DUT Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -c | grep -i recovery If booting into the system is impossible, read coreboot loading logs. Expected result The logs should indicate that vboot has chosen to boot from the recovery slot. Example: VB2:vb2_check_recovery () Recovery reason from previous boot: 0x3 / 0x3 VB2:vb2_check_recovery () We have a recovery request: 0x3 / 0x0 Recovery requested ( 1009000e ) VBO009.001 Recovery boot popup (firmware) Test description This test aims to verify whether the recovery mode information is displayed as the popup after rebooting the DUT which is flashed with the firmware with the wrong vboot keys. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Disable Secure Boot. Obtain coreboot binary signed with wrong vboot keys. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Flash coreboot signed with wrong vboot keys by executing the following command: flashrom -p internal --fmap -i RW_SECTION_A -w [ coreboot binary ] Reboot the DUT. Wait for the popup to appear. Expected result Popup with information about recovery mode should be displayed. VBO010.001 Recovery boot popup confirmation (firmware) Test description This test aims to verify whether the recovery popup might be confirmed which allows to proceed to the next booting stages. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Disable Secure Boot. Obtain coreboot binary signed with wrong vboot keys. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Flash coreboot signed with wrong vboot keys by executing the following command: flashrom -p internal --fmap -i RW_SECTION_A -w [ coreboot binary ] Reboot the DUT. Wait for the popup to appear. Press ENTER . Expected result After pressing ENTER the DUT should immediately move to the next stages of booting. VBO011.001 Booting after flashing with valid binary (Ubuntu 22.04) Test description This test aims to verify whether after flashing the DUT with the valid binary, the DUT will boot correctly from the default slot and no recovery popup will be displayed. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. Disable Secure Boot. Slot A is flashed with an binary with wrong-signed vboot keys. Obtain the correct coreboot binary appropriate for the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Flash firmware with valid binary by executing the following command: flashrom -p internal --fmap -i RW_SECTION_A -w [ coreboot binary ] Reboot the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -c | grep -i recovery Expected result Popup with information about recovery mode should not be displayed. The logs should indicate that vboot hasn't chosen to boot from the recovery slot. Example output: VB2:vb2_check_recovery () Recovery reason from previous boot: 0x0 / 0x0","title":"Verified Boot"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#dasharo-security-verified-boot-support","text":"","title":"Dasharo Security: Verified Boot support"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo001001-generating-keys-for-verified-boot","text":"Test description This test aims to verify whether there is a possibility to generate vboot keys for signing the firmware. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Based on the dedicated documentation generate the keys . Check if the keys, after finishing the generating process, are available in the keys subdirectory. Expected result The keys location should contain the generated keys.","title":"VBO001.001 Generating keys for Verified Boot"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo002001-signing-image-without-rebuild","text":"Test description This test aims to verify whether there is a possibility to sign the firmware image with generated keys without rebuilding. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Localize the keys, which were generated in the VBO001.001 test case. Based on the dedicated documentation sign the firmware image with the keys without rebuilding. Note the result. Expected result The output of the last command should contain information that resigning procedure was successful. Example output: ... INFO: sign_bios_at_end: BIOS image does not have FW_MAIN_B. Signing only FW_MAIN_A - import root_key from /.../keys/root_key.vbpubk: success - import recovery_key from /.../keys/recovery_key.vbpubk: success successfully saved new image to: /.../protectli_vault_cml_v1.0.16_resigned.rom The /.../protectli_vault_cml_v1.0.16.rom was resigned and saved as: /.../protectli_vault_cml_v1.0.16_resigned.rom","title":"VBO002.001 Signing image without rebuild"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo003001-flashing-device-with-the-signed-firmware","text":"Test description This test aims to verify whether there is a possibility to flash the locally signed firmware to the DUT. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Localize the firmware, which was signed in the VBO002.001 test case. Flash the firmware by using the internal programmer and flashrom tool. If DUT is already flashed with the Dasharo firmware, the following command should be used: flashrom -p internal -w [ path-to-binary ] --fmap -i RW_SECTION_A Otherwise, the following command should be used: flashrom -p internal -w [ path-to-binary ] --ifd -i bios Reboot the DUT. and note the results. Expected result The DUT reboots properly without issues related to firmware signing.","title":"VBO003.001 Flashing device with the signed firmware"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo004001-adding-keys-and-building-image","text":"Test description This test aims to verify whether there is a possibility to build firmware on the local machine, based on Build manual procedure dedicated to the platform and sign it with the locally generated keys. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Make yourself familiar with Building manual procedure dedicated for the relevant platform: NovaCustom laptops Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Localize the keys, which were generated in the VBO001.001 test case. Based on the dedicated documentation add locally generated keys to the coreboot config. Based on the dedicated documentation build firmware. Check if the binary file, after finishing the building process, is available in the build subdirectory. Expected result The build location should contain the binary file, which size is equal to the flash chip size.","title":"VBO004.001 Adding keys and building image"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo005001-flashing-device-with-built-firmware","text":"Test description This test aims to verify it is possible to flash and boot DUT with signed firmware image. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Localize the firmware, which was built in the VBO004.001 test case. Flash the firmware by using the internal programmer and flashrom tool. If DUT is already flashed with the Dasharo firmware, the following command should be used: flashrom -p internal -w [ path-to-binary ] --fmap -i RW_SECTION_A Otherwise, the following command should be used: flashrom -p internal -w [ path-to-binary ] --ifd -i bios Reboot the DUT. and note the results. Expected result The DUT reboots properly without issues related to firmware signing.","title":"VBO005.001 Flashing device with built firmware"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo006001-verified-boot-support-firmware","text":"Test description Verified Boot is a method of verifying that the firmware components come from a trusted source. This test aims to confirm that verified boot is enabled and functional. Test setup Proceed with the Generic test setup: firmware . Disable Secure Boot. Test steps Power on the DUT. Read coreboot loading logs. Expected result The logs should indicate that vboot is enabled and verstage has been entered: VBOOT: Loading verstage.","title":"VBO006.001 Verified boot support (firmware)"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo006002-verified-boot-support-ubuntu-2204","text":"Test description Verified Boot is a method of verifying that the firmware components come from a trusted source. This test aims to confirm that verified boot is enabled and functional. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. Disable Secure Boot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -c | grep VBOOT Expected result The output of the command should indicate that vboot is enabled and verstage has been entered: VBOOT: Loading verstage. TPM: Extending digest for VBOOT: boot mode into PCR 0 TPM: Extending digest for VBOOT: GBB HWID into PCR 1 VBOOT WORK 8. 0x76c05000 0x00014000 PCR-0 2547cc736e951fa4919853c43ae890861a3b3264000000000000000000000000 SHA256 [VBOOT: boot mode] PCR-1 e3324765a25f8a59c7c20cc35c1c33a8ab384159d2b40a269246b0b4491cdf89 SHA256 [VBOOT: GBB HWID]","title":"VBO006.002 Verified boot support (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo007001-verified-boot-booting-from-slot-a-firmware","text":"Test description If the signatures for firmware stored in vboot Slot A are correct, vboot should proceed to boot from Slot A. Test setup Proceed with the Generic test setup: firmware . Disable Secure Boot. Test steps Power on the DUT. Read coreboot loading logs. Expected result The logs should indicate that vboot has chosen to boot from slot A: Slot A is selected","title":"VBO007.001 Verified boot: Booting from Slot A (firmware)"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo007002-verified-boot-booting-from-slot-a-ubuntu-2204","text":"Test description If the signatures for firmware stored in vboot Slot A are correct, vboot should proceed to boot from Slot A. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. Disable Secure Boot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -c | grep \"Slot A\" Expected result The output of the command should indicate that vboot has chosen to boot from slot A: Slot A is selected","title":"VBO007.002 Verified boot: Booting from Slot A (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo008001-verified-boot-booting-from-recovery-ubuntu-2204","text":"Test description If the signatures for firmware stored in vboot Slot A are incorrect, vboot should revert to booting from the recovery slot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. Disable Secure Boot. Obtain coreboot binary signed with wrong vboot keys. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Flash coreboot signed with wrong vboot keys by executing the following command: flashrom -p internal --fmap -i RW_SECTION_A -w [ coreboot binary ] Power off the DUT Connect to the DUT using the serial port. Power on the DUT Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -c | grep -i recovery If booting into the system is impossible, read coreboot loading logs. Expected result The logs should indicate that vboot has chosen to boot from the recovery slot. Example: VB2:vb2_check_recovery () Recovery reason from previous boot: 0x3 / 0x3 VB2:vb2_check_recovery () We have a recovery request: 0x3 / 0x0 Recovery requested ( 1009000e )","title":"VBO008.001 Verified boot: Booting from Recovery (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo009001-recovery-boot-popup-firmware","text":"Test description This test aims to verify whether the recovery mode information is displayed as the popup after rebooting the DUT which is flashed with the firmware with the wrong vboot keys. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Disable Secure Boot. Obtain coreboot binary signed with wrong vboot keys. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Flash coreboot signed with wrong vboot keys by executing the following command: flashrom -p internal --fmap -i RW_SECTION_A -w [ coreboot binary ] Reboot the DUT. Wait for the popup to appear. Expected result Popup with information about recovery mode should be displayed.","title":"VBO009.001 Recovery boot popup (firmware)"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo010001-recovery-boot-popup-confirmation-firmware","text":"Test description This test aims to verify whether the recovery popup might be confirmed which allows to proceed to the next booting stages. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Disable Secure Boot. Obtain coreboot binary signed with wrong vboot keys. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Flash coreboot signed with wrong vboot keys by executing the following command: flashrom -p internal --fmap -i RW_SECTION_A -w [ coreboot binary ] Reboot the DUT. Wait for the popup to appear. Press ENTER . Expected result After pressing ENTER the DUT should immediately move to the next stages of booting.","title":"VBO010.001 Recovery boot popup confirmation (firmware)"},{"location":"unified-test-documentation/dasharo-security/201-verified-boot/#vbo011001-booting-after-flashing-with-valid-binary-ubuntu-2204","text":"Test description This test aims to verify whether after flashing the DUT with the valid binary, the DUT will boot correctly from the default slot and no recovery popup will be displayed. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. Disable Secure Boot. Slot A is flashed with an binary with wrong-signed vboot keys. Obtain the correct coreboot binary appropriate for the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Flash firmware with valid binary by executing the following command: flashrom -p internal --fmap -i RW_SECTION_A -w [ coreboot binary ] Reboot the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -c | grep -i recovery Expected result Popup with information about recovery mode should not be displayed. The logs should indicate that vboot hasn't chosen to boot from the recovery slot. Example output: VB2:vb2_check_recovery () Recovery reason from previous boot: 0x0 / 0x0","title":"VBO011.001 Booting after flashing with valid binary (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/203-measured-boot/","text":"Dasharo Security: Measured Boot support MBO001.001 Measured Boot support (Ubuntu 22.04) Test description Measured Boot is a method for detecting changes to the firmware by storing hashes of each firmware component in the TPM PCR registers. If a PCR changes value across reboots, a change to the firmware has been made. This test aims to verify that Measured Boot is functional and that measurements are stored in the TPM.a. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Download cbmem from the cloud to the DUT. Disable Secure Boot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -c | grep -i PCR Expected result The output of the command should indicate that measurements of the coreboot components have been made. Example output: TPM: Extending digest for `VBOOT: boot mode` into PCR 0 TPM: Digest of `VBOOT: boot mode` to PCR 0 measured TPM: Extending digest for `VBOOT: GBB HWID` into PCR 1 TPM: Digest of `VBOOT: GBB HWID` to PCR 1 measured TPM: Extending digest for `FMAP: FMAP` into PCR 2 TPM: Digest of `FMAP: FMAP` to PCR 2 measured TPM: Extending digest for `CBFS: bootblock` into PCR 2 TPM: Digest of `CBFS: bootblock` to PCR 2 measured TPM: Extending digest for `CBFS: fallback/romstage` into PCR 2 TPM: Digest of `CBFS: fallback/romstage` to PCR 2 measured TPM: Extending digest for `CBFS: fspm.bin` into PCR 2 TPM: Digest of `CBFS: fspm.bin` to PCR 2 measured TPM: Extending digest for `CBFS: fallback/postcar` into PCR 2 TPM: Digest of `CBFS: fallback/postcar` to PCR 2 measured TPM: Extending digest for `CBFS: fallback/ramstage` into PCR 2 TPM: Digest of `CBFS: fallback/ramstage` to PCR 2 measured ... The output shouldn't contain the following message: TPM: Extending hash into PCR failed.","title":"Measured Boot"},{"location":"unified-test-documentation/dasharo-security/203-measured-boot/#dasharo-security-measured-boot-support","text":"","title":"Dasharo Security: Measured Boot support"},{"location":"unified-test-documentation/dasharo-security/203-measured-boot/#mbo001001-measured-boot-support-ubuntu-2204","text":"Test description Measured Boot is a method for detecting changes to the firmware by storing hashes of each firmware component in the TPM PCR registers. If a PCR changes value across reboots, a change to the firmware has been made. This test aims to verify that Measured Boot is functional and that measurements are stored in the TPM.a. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Download cbmem from the cloud to the DUT. Disable Secure Boot. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -c | grep -i PCR Expected result The output of the command should indicate that measurements of the coreboot components have been made. Example output: TPM: Extending digest for `VBOOT: boot mode` into PCR 0 TPM: Digest of `VBOOT: boot mode` to PCR 0 measured TPM: Extending digest for `VBOOT: GBB HWID` into PCR 1 TPM: Digest of `VBOOT: GBB HWID` to PCR 1 measured TPM: Extending digest for `FMAP: FMAP` into PCR 2 TPM: Digest of `FMAP: FMAP` to PCR 2 measured TPM: Extending digest for `CBFS: bootblock` into PCR 2 TPM: Digest of `CBFS: bootblock` to PCR 2 measured TPM: Extending digest for `CBFS: fallback/romstage` into PCR 2 TPM: Digest of `CBFS: fallback/romstage` to PCR 2 measured TPM: Extending digest for `CBFS: fspm.bin` into PCR 2 TPM: Digest of `CBFS: fspm.bin` to PCR 2 measured TPM: Extending digest for `CBFS: fallback/postcar` into PCR 2 TPM: Digest of `CBFS: fallback/postcar` to PCR 2 measured TPM: Extending digest for `CBFS: fallback/ramstage` into PCR 2 TPM: Digest of `CBFS: fallback/ramstage` to PCR 2 measured ... The output shouldn't contain the following message: TPM: Extending hash into PCR failed.","title":"MBO001.001 Measured Boot support (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/","text":"Dasharo Security: UEFI Secure Boot SBO001.001 Check Secure Boot default state (firmware) Test description Secure Boot is a verification mechanism for ensuring that code launched by firmware is trusted. This test aims to verify that the Secure Boot state after flashing the platform with the Dasharo firmware is correct. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Verify the Current Secure Boot State field. Expected result The Secure Boot State field should inform that the current state of Secure Boot is Disabled . SBO002.001 UEFI Secure Boot (Ubuntu 22.04) Test description This test verifies that Secure Boot can be enabled from the boot menu and, after the DUT reset, it is seen from the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Secure Boot Configuration to enable the Attempt Secure Boot option in the Secure Boot Configuration menu. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Verify that the Current Secure Boot State field says Enabled - if not, select the Attempt Secure Boot option below. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. The DUT will now attempt to boot OPERATING_SYSTEM with Secure Boot enabled. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo dmesg | grep secureboot Note the results. Expected result The output of the command should contain the line: secureboot: Secure boot enabled SBO002.002 UEFI Secure Boot (Windows 11) Test description This test verifies that Secure Boot can be enabled from the boot menu and, after the DUT reset, it is seen from the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Secure Boot Configuration to enable the Attempt Secure Boot option in the Secure Boot Configuration menu. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Verify that the Current Secure Boot State field says Enabled - if not, select the Attempt Secure Boot option below. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. The DUT will now attempt to boot OPERATING_SYSTEM with Secure Boot enabled. Log into the system by using the proper login and password. Open Powershell as administrator and run the following command: Confirm-SecureBootUEFI Note the results. Expected result The output of the command should return the information, that Secure Boot is enabled: True SBO003.001 Attempt to boot file with the correct key from Shell (firmware) Test description This test verifies that Secure Boot allows booting a signed file with a correct key. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB - for keeping files for booting Test setup Proceed with the Generic test setup: firmware . Test steps Download the signed with the correct key file from the cloud . Download the certificate from the cloud . Place the certificate and the file on the USB storage . Plug the USB storage into DUT. Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Set the Secure Boot Mode field to Custom Mode . Select options in the given order: Custom Secure Boot Options -> DB Options -> Enroll Signature -> Enroll Signature Using File Select the certificate from the USB storage . Select the Commit Changes and Exit option. Press ESC until the setup menu. Select the Reset option. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu. Select the UEFI Shell option using the arrow keys and press Enter . In the shell open the USB storage by executing the following command: FS0: One of the filesystems in the FS list will be the USB storage - typically FS0: Boot the previously prepared file by typing its full name: hello-valid-keys.efi Expected result File boots correctly (no information: Command Error Status: Access Denied on the output). The output of the command shows file content. Example output: Hello, world! SBO004.001 Attempt to boot file without the key from Shell (firmware) Test description This test verifies that Secure Boot blocks booting a file without a key. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB - for keeping files for booting Test setup Proceed with the Generic test setup: firmware . Test steps Download the not signed file from the cloud . Place the file on the USB storage . Plug the USB storage into DUT. Power on the DUT. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu. Select the UEFI Shell option using the arrow keys and press Enter . In the shell open the USB storage by executing the following command: FS0: One of the filesystems in the FS list will be the USB storage - typically FS0: Boot the previously prepared file by typing its full name: hello.efi Expected result The output of the command doesn't show file content and information about access denied is displayed. Example output: Command Error Status: Access Denied SBO005.001 Attempt to boot file with the wrong-signed key from Shell (firmware) Test description This test verifies that Secure Boot blocks booting a file with the wrong-signed key. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB - for keeping files for booting Test setup Proceed with the Generic test setup: firmware . Test steps Download the signed with the incorrect key file from the cloud . Place the file on the USB storage . Plug the USB storage into DUT. Power on the DUT. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu. Select the UEFI Shell option using the arrow keys and press Enter . In the shell open the USB storage by executing the following command: FS0: One of the filesystems in the FS list will be the USB storage - typically FS0: Boot the previously prepared file by typing its full name: hello-bad-keys.efi Expected result The output of the command doesn't show file content and information about access denied is displayed. Example output: Command Error Status: Access Denied SBO006.001 Reset Secure Boot Keys option availability (firmware) Test description This test aims to verify, that the Reset Secure Boot Keys option is available after flashing the platform with the Dasharo firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Verify the Reset Secure Boot Keys field. Expected result The Reset Secure Boot Keys option should be listed after entering the Secure Boot Configuration submenu. SBO007.001 Attempt to boot the file after restoring keys to default (firmware) Test description This test verifies that the Reset Secure Boot Keys option works correctly. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB - for keeping files for booting Test setup Proceed with the Generic test setup: firmware . Test steps Download the signed with the correct key file from the cloud . Download the certificate from the cloud . Place the certificate and the file on the USB storage . Plug the USB storage into DUT. Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Set the Secure Boot Mode field to Custom Mode . Select options in the given order: Custom Secure Boot Options -> DB Options -> Enroll Signature -> Enroll Signature Using File Select the certificate from the USB storage . Select the Commit Changes and Exit option. Press ESC until the setup menu. Select the Reset option. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu. Select the UEFI Shell option using the arrow keys and press Enter . In the shell open the USB storage by executing the following command: FS0: One of the filesystems in the FS list will be the USB storage - typically FS0: Boot the previously prepared file by typing its full name: hello-valid-keys.efi Exit the shell by executing the following command: exit Press ESC until the setup menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Select the Reset Secure Boot Keys option using the arrow keys and Enter. If necessary - press Y to confirm saving the changes. Press ESC until the setup menu. Select the Reset option to apply the settings and reboot. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Verify that the Current Secure Boot State field says Enabled . Press ESC until the setup menu. Select the One Time Boot menu using the arrow keys and Enter. Select the UEFI Shell option using the arrow keys and press Enter . In the shell open the USB storage by executing the following command: FS0: One of the filesystems in the FS list will be the USB storage - typically FS0: Boot the previously prepared file by typing its full name: hello-valid-keys.efi Expected result The first attempt to run the hello-valid-keys.efi script: File boots correctly (no information: Command Error Status: Access Denied on the output). The output of the command shows file content. Example output: Hello, world! The second attempt to run the hello-valid-keys.efi script: The output of the command doesn't show file content and information about access denied is displayed. Example output: Command Error Status: Access Denied After selecting the Reset Secure Boot Keys option, the Secure boot state should be automatically enabled. SBO008.001 Attempt to enroll the key in the incorrect format (firmware) Test description This test verifies that Secure Boot doesn't allow enrolling keys in the incorrect format. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Additional USB storage - at least 1GB - for keeping files for booting Test steps Place the file with the .txt extension on the USB storage . Plug the USB storage into DUT. Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Set the Secure Boot Mode field to Custom Mode . Select options in the given order: Custom Secure Boot Options -> DB Options -> Enroll Signature -> Enroll Signature Using File Select the file with the .txt extension from the USB storage . Select the Commit Changes and Exit option. Expected result The popup with information about ERROR: Unsupported file type! should appear.","title":"Secure Boot"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/#dasharo-security-uefi-secure-boot","text":"","title":"Dasharo Security: UEFI Secure Boot"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/#sbo001001-check-secure-boot-default-state-firmware","text":"Test description Secure Boot is a verification mechanism for ensuring that code launched by firmware is trusted. This test aims to verify that the Secure Boot state after flashing the platform with the Dasharo firmware is correct. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Verify the Current Secure Boot State field. Expected result The Secure Boot State field should inform that the current state of Secure Boot is Disabled .","title":"SBO001.001 Check Secure Boot default state (firmware)"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/#sbo002001-uefi-secure-boot-ubuntu-2204","text":"Test description This test verifies that Secure Boot can be enabled from the boot menu and, after the DUT reset, it is seen from the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Secure Boot Configuration to enable the Attempt Secure Boot option in the Secure Boot Configuration menu. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Verify that the Current Secure Boot State field says Enabled - if not, select the Attempt Secure Boot option below. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. The DUT will now attempt to boot OPERATING_SYSTEM with Secure Boot enabled. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo dmesg | grep secureboot Note the results. Expected result The output of the command should contain the line: secureboot: Secure boot enabled","title":"SBO002.001 UEFI Secure Boot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/#sbo002002-uefi-secure-boot-windows-11","text":"Test description This test verifies that Secure Boot can be enabled from the boot menu and, after the DUT reset, it is seen from the OS. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Windows 11 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Secure Boot Configuration to enable the Attempt Secure Boot option in the Secure Boot Configuration menu. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Verify that the Current Secure Boot State field says Enabled - if not, select the Attempt Secure Boot option below. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. The DUT will now attempt to boot OPERATING_SYSTEM with Secure Boot enabled. Log into the system by using the proper login and password. Open Powershell as administrator and run the following command: Confirm-SecureBootUEFI Note the results. Expected result The output of the command should return the information, that Secure Boot is enabled: True","title":"SBO002.002 UEFI Secure Boot (Windows 11)"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/#sbo003001-attempt-to-boot-file-with-the-correct-key-from-shell-firmware","text":"Test description This test verifies that Secure Boot allows booting a signed file with a correct key. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB - for keeping files for booting Test setup Proceed with the Generic test setup: firmware . Test steps Download the signed with the correct key file from the cloud . Download the certificate from the cloud . Place the certificate and the file on the USB storage . Plug the USB storage into DUT. Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Set the Secure Boot Mode field to Custom Mode . Select options in the given order: Custom Secure Boot Options -> DB Options -> Enroll Signature -> Enroll Signature Using File Select the certificate from the USB storage . Select the Commit Changes and Exit option. Press ESC until the setup menu. Select the Reset option. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu. Select the UEFI Shell option using the arrow keys and press Enter . In the shell open the USB storage by executing the following command: FS0: One of the filesystems in the FS list will be the USB storage - typically FS0: Boot the previously prepared file by typing its full name: hello-valid-keys.efi Expected result File boots correctly (no information: Command Error Status: Access Denied on the output). The output of the command shows file content. Example output: Hello, world!","title":"SBO003.001 Attempt to boot file with the correct key from Shell (firmware)"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/#sbo004001-attempt-to-boot-file-without-the-key-from-shell-firmware","text":"Test description This test verifies that Secure Boot blocks booting a file without a key. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB - for keeping files for booting Test setup Proceed with the Generic test setup: firmware . Test steps Download the not signed file from the cloud . Place the file on the USB storage . Plug the USB storage into DUT. Power on the DUT. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu. Select the UEFI Shell option using the arrow keys and press Enter . In the shell open the USB storage by executing the following command: FS0: One of the filesystems in the FS list will be the USB storage - typically FS0: Boot the previously prepared file by typing its full name: hello.efi Expected result The output of the command doesn't show file content and information about access denied is displayed. Example output: Command Error Status: Access Denied","title":"SBO004.001 Attempt to boot file without the key from Shell (firmware)"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/#sbo005001-attempt-to-boot-file-with-the-wrong-signed-key-from-shell-firmware","text":"Test description This test verifies that Secure Boot blocks booting a file with the wrong-signed key. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB - for keeping files for booting Test setup Proceed with the Generic test setup: firmware . Test steps Download the signed with the incorrect key file from the cloud . Place the file on the USB storage . Plug the USB storage into DUT. Power on the DUT. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu. Select the UEFI Shell option using the arrow keys and press Enter . In the shell open the USB storage by executing the following command: FS0: One of the filesystems in the FS list will be the USB storage - typically FS0: Boot the previously prepared file by typing its full name: hello-bad-keys.efi Expected result The output of the command doesn't show file content and information about access denied is displayed. Example output: Command Error Status: Access Denied","title":"SBO005.001 Attempt to boot file with the wrong-signed key from Shell (firmware)"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/#sbo006001-reset-secure-boot-keys-option-availability-firmware","text":"Test description This test aims to verify, that the Reset Secure Boot Keys option is available after flashing the platform with the Dasharo firmware. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Verify the Reset Secure Boot Keys field. Expected result The Reset Secure Boot Keys option should be listed after entering the Secure Boot Configuration submenu.","title":"SBO006.001 Reset Secure Boot Keys option availability (firmware)"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/#sbo007001-attempt-to-boot-the-file-after-restoring-keys-to-default-firmware","text":"Test description This test verifies that the Reset Secure Boot Keys option works correctly. Test configuration data FIRMWARE = Dasharo Additional USB storage - at least 1GB - for keeping files for booting Test setup Proceed with the Generic test setup: firmware . Test steps Download the signed with the correct key file from the cloud . Download the certificate from the cloud . Place the certificate and the file on the USB storage . Plug the USB storage into DUT. Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Set the Secure Boot Mode field to Custom Mode . Select options in the given order: Custom Secure Boot Options -> DB Options -> Enroll Signature -> Enroll Signature Using File Select the certificate from the USB storage . Select the Commit Changes and Exit option. Press ESC until the setup menu. Select the Reset option. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu. Select the UEFI Shell option using the arrow keys and press Enter . In the shell open the USB storage by executing the following command: FS0: One of the filesystems in the FS list will be the USB storage - typically FS0: Boot the previously prepared file by typing its full name: hello-valid-keys.efi Exit the shell by executing the following command: exit Press ESC until the setup menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Select the Reset Secure Boot Keys option using the arrow keys and Enter. If necessary - press Y to confirm saving the changes. Press ESC until the setup menu. Select the Reset option to apply the settings and reboot. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Verify that the Current Secure Boot State field says Enabled . Press ESC until the setup menu. Select the One Time Boot menu using the arrow keys and Enter. Select the UEFI Shell option using the arrow keys and press Enter . In the shell open the USB storage by executing the following command: FS0: One of the filesystems in the FS list will be the USB storage - typically FS0: Boot the previously prepared file by typing its full name: hello-valid-keys.efi Expected result The first attempt to run the hello-valid-keys.efi script: File boots correctly (no information: Command Error Status: Access Denied on the output). The output of the command shows file content. Example output: Hello, world! The second attempt to run the hello-valid-keys.efi script: The output of the command doesn't show file content and information about access denied is displayed. Example output: Command Error Status: Access Denied After selecting the Reset Secure Boot Keys option, the Secure boot state should be automatically enabled.","title":"SBO007.001 Attempt to boot the file after restoring keys to default (firmware)"},{"location":"unified-test-documentation/dasharo-security/206-secure-boot/#sbo008001-attempt-to-enroll-the-key-in-the-incorrect-format-firmware","text":"Test description This test verifies that Secure Boot doesn't allow enrolling keys in the incorrect format. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Generic test setup: firmware . Additional USB storage - at least 1GB - for keeping files for booting Test steps Place the file with the .txt extension on the USB storage . Plug the USB storage into DUT. Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Device Manager menu using the arrow keys and Enter. Enter the Secure Boot Configuration submenu. Set the Secure Boot Mode field to Custom Mode . Select options in the given order: Custom Secure Boot Options -> DB Options -> Enroll Signature -> Enroll Signature Using File Select the file with the .txt extension from the USB storage . Select the Commit Changes and Exit option. Expected result The popup with information about ERROR: Unsupported file type! should appear.","title":"SBO008.001 Attempt to enroll the key in the incorrect format (firmware)"},{"location":"unified-test-documentation/dasharo-security/207-boot-guard-support/","text":"Dasharo Security: Boot Guard support BGS001.001 Boot Guard support (Ubuntu 22.04) Test description Intel Boot Guard is a hardware-based technology intended to protect the device against executing non-genuine firmware, which could happen when a possible attacker has bypassed protection against modification of BIOS. This test aims to verify that the implemented Boot Guard mechanism works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Download cbmem from the cloud to the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -1 | grep CBnT Analyze the output from the command. Expected result The output of the command should indicate the state of the Boot Guard. Example output: CBnT: SACM INFO MSR ( 0x13A ) raw: 0x000000130000007d CBnT: NEM status: 1 CBnT: TPM type: TPM 2 .0 CBnT: TPM success: 1 CBnT: FACB: 1 CBnT: measured boot: 1 CBnT: verified boot: 1 CBnT: revoked: 0 CBnT: BtG capable: 1 CBnT: Server TXT capable: 0 CBnT: BOOTSTATUS ( 0xA0 ) raw: 0x1840000080000000 CBnT: TXT startup success: 0 CBnT: BtG startup success: 1 CBnT: Block boot enabled: 0 CBnT: PFR startup success: 0 CBnT: Memory power down executed: 0 CBnT: BtG thread sync failed: 0 CBnT: Bios trusted: 1 CBnT: TXT disabled by policy: 1 CBnT: Bootguard startup error: 0 CBnT: TXT ucode or ACM error: 0 CBnT: S-ACM success: 0 CBnT: ERRORCODE ( 0x30 ) raw: 0x00000000 CBnT: TXT disabled in Policy CBnT: BIOSACM_ERRORCODE ( 0x328 ) raw: 0xc000acf0 CBnT: BIOSACM_ERRORCODE: TXT ucode or ACM error CBnT: AC Module Type: BIOS ACM Error CBnT: class: 0xf CBnT: major: 0xb CBnT: External: 0x1 During the analyzing process, the main thing is to pay attention to the following: The field NEM status should have the value 1. If the Boot Guard profile is 4 or 5, the field FACB should have the value 1. If the Boot Guard profile is 3 or 5, the fields measured boot and verified boot should have the value 1. If TPM is physically mounted on the platform, the TPM type field should contain information about the type of the mounted TPM; also, in that situation, field TPM success should have the value 1.","title":"Boot Guard support"},{"location":"unified-test-documentation/dasharo-security/207-boot-guard-support/#dasharo-security-boot-guard-support","text":"","title":"Dasharo Security: Boot Guard support"},{"location":"unified-test-documentation/dasharo-security/207-boot-guard-support/#bgs001001-boot-guard-support-ubuntu-2204","text":"Test description Intel Boot Guard is a hardware-based technology intended to protect the device against executing non-genuine firmware, which could happen when a possible attacker has bypassed protection against modification of BIOS. This test aims to verify that the implemented Boot Guard mechanism works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Download cbmem from the cloud to the DUT. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -1 | grep CBnT Analyze the output from the command. Expected result The output of the command should indicate the state of the Boot Guard. Example output: CBnT: SACM INFO MSR ( 0x13A ) raw: 0x000000130000007d CBnT: NEM status: 1 CBnT: TPM type: TPM 2 .0 CBnT: TPM success: 1 CBnT: FACB: 1 CBnT: measured boot: 1 CBnT: verified boot: 1 CBnT: revoked: 0 CBnT: BtG capable: 1 CBnT: Server TXT capable: 0 CBnT: BOOTSTATUS ( 0xA0 ) raw: 0x1840000080000000 CBnT: TXT startup success: 0 CBnT: BtG startup success: 1 CBnT: Block boot enabled: 0 CBnT: PFR startup success: 0 CBnT: Memory power down executed: 0 CBnT: BtG thread sync failed: 0 CBnT: Bios trusted: 1 CBnT: TXT disabled by policy: 1 CBnT: Bootguard startup error: 0 CBnT: TXT ucode or ACM error: 0 CBnT: S-ACM success: 0 CBnT: ERRORCODE ( 0x30 ) raw: 0x00000000 CBnT: TXT disabled in Policy CBnT: BIOSACM_ERRORCODE ( 0x328 ) raw: 0xc000acf0 CBnT: BIOSACM_ERRORCODE: TXT ucode or ACM error CBnT: AC Module Type: BIOS ACM Error CBnT: class: 0xf CBnT: major: 0xb CBnT: External: 0x1 During the analyzing process, the main thing is to pay attention to the following: The field NEM status should have the value 1. If the Boot Guard profile is 4 or 5, the field FACB should have the value 1. If the Boot Guard profile is 3 or 5, the fields measured boot and verified boot should have the value 1. If TPM is physically mounted on the platform, the TPM type field should contain information about the type of the mounted TPM; also, in that situation, field TPM success should have the value 1.","title":"BGS001.001 Boot Guard support (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/20F-me-neuter/","text":"Dasharo Security: ME neuter/disable Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . MNE001.001 Check Intel ME version (Ubuntu 22.04) Test description This test aims to verify that the Intel ME version might be read on the Operating System level. The read version should be the same as in the release notes. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: cat /sys/class/mei/mei0/fw_ver Note the results. Expected result The output of the command should contain information about the Management Engine Interface firmware version. Example output: 0 :16.0.15.1735 0 :16.0.15.1735 0 :16.0.15.1723 Value from the first line, considering the numbers after the colon, should correspond to the value from the release notes MNE002.001 Intel ME mode option is available and has the correct default state Test description This test aims to verify that the Intel ME mode state after flashing the platform with the Dasharo firmware is correct. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Intel Management Engine Options submenu. Verify the Intel ME mode field. Expected result The Intel ME mode field should inform that the current state is Enabled . MNE003.001 Intel ME mode option Enabled works correctly (Ubuntu 22.04) Test description This test aims to verify that Intel ME mode option in state Enabled works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Intel Management Engine Options submenu. Verify that the Intel ME mode option is state Enabled - if not, using the arrow keys and Enter , choose option Enabled . Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep 00 :16.0 Note the results. Expected result The output of the command should contain the information about Management Engine Interface. Example output: Intel Corporation Comet Lake Management Engine Interface MNE004.001 Intel ME mode option Disable (Soft) works correctly (Ubuntu 22.04) Test description This test aims to verify that Intel ME mode option in state Disable (Soft) works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Intel Management Engine Options submenu. Verify that the Intel ME mode option is state Disable (Soft) - if not, using the arrow keys and Enter , choose option Disable (Soft) . Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep 00 :16.0 Note the results. Expected result The output of the command shouldn't contain the information about Management Engine Interface. Example of unwanted output: Intel Corporation Comet Lake Management Engine Interface MNE005.001 Intel ME mode option Disable (HAP) works correctly (Ubuntu 22.04) Test description This test aims to verify that Intel ME mode option in state Disable (HAP) works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Intel Management Engine Options submenu. Verify that the Intel ME mode option is state Disable (HAP) - if not, using the arrow keys and Enter , choose option Disable (HAP) . Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep 00 :16.0 Note the results. Expected result The output of the command shouldn't contain the information about Management Engine Interface. Example of unwanted output: Intel Corporation Comet Lake Management Engine Interface MNE006.001 PCI Express 5.0 port is functional when ME disabled (Ubuntu 22.04) Test description This test aims to verify that Intel ME mode option in state Disable (HAP) or Disable (Soft) does not break the PCIe 5.0 port functionality and the caching of PCIe 5.0 firmware by Dasharo works. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 DUT (Alder Lake or newer) with PCIe 5.0 port and a PCIe device plugged to the port. Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Intel Management Engine Options submenu. Verify that the Intel ME mode option is in state Disable (HAP) or Disable (Soft) - if not, using the arrow keys and Enter , choose option Disable (HAP) or Disable (Soft) . Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo cbmem -1 > cbmem.log lspci lspci -t Note the results. Repeat all steps to cover both disable methods. Expected result The output of the command should contain the information about PCI Express 5.0 interface located at PCI 00:01.0. Also the device plugged to the PCI port 00:01.0 should be visible and functional. Example of desired output: lspci -t - [ 0000 :00 ] -+-00.0 +-01.0- [ 01 ] --+-00.0 | \\- 00 .1 +-02.0 +-06.0- [ 02 ] ----00.0 +-14.0 +-14.2 +-17.0 +-1a.0- [ 03 ] ----00.0 +-1c.0- [ 04 ] -- +-1c.2- [ 05 ] ----00.0 +-1c.4- [ 06 -08 ] ----00.0- [ 07 -08 ] ----00.0- [ 08 ] --+-00.0 | \\- 00 .1 +-1d.0- [ 09 ] ----00.0 +-1f.0 +-1f.3 +-1f.4 \\- 1f.5 lspci 00 :00.0 Host bridge: Intel Corporation Device 4648 ( rev 02 ) 00 :01.0 PCI bridge: Intel Corporation 12th Gen Core Processor PCI Express x16 Controller #1 (rev 02) 00 :02.0 Display controller: Intel Corporation AlderLake-S GT1 ( rev 0c ) 00 :06.0 PCI bridge: Intel Corporation 12th Gen Core Processor PCI Express x4 Controller #0 (rev 02) 00 :14.0 USB controller: Intel Corporation Device 7ae0 ( rev 11 ) 00 :14.2 RAM memory: Intel Corporation Device 7aa7 ( rev 11 ) 00 :17.0 SATA controller: Intel Corporation Device 7ae2 ( rev 11 ) 00 :1a.0 PCI bridge: Intel Corporation Device 7ac8 ( rev 11 ) 00 :1c.0 PCI bridge: Intel Corporation Device 7ab8 ( rev 11 ) 00 :1c.2 PCI bridge: Intel Corporation Device 7aba ( rev 11 ) 00 :1c.4 PCI bridge: Intel Corporation Device 7abc ( rev 11 ) 00 :1d.0 PCI bridge: Intel Corporation Device 7ab0 ( rev 11 ) 00 :1f.0 ISA bridge: Intel Corporation Device 7a84 ( rev 11 ) 00 :1f.3 Audio device: Intel Corporation Device 7ad0 ( rev 11 ) 00 :1f.4 SMBus: Intel Corporation Device 7aa3 ( rev 11 ) 00 :1f.5 Serial bus controller: Intel Corporation Device 7aa4 ( rev 11 ) 01 :00.0 VGA compatible controller: NVIDIA Corporation GA106 [ GeForce RTX 3060 Lite Hash Rate ] ( rev a1 ) 01 :00.1 Audio device: NVIDIA Corporation Device 228e ( rev a1 ) 02 :00.0 Non-Volatile memory controller: Intel Corporation Device f1aa ( rev 03 ) 03 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO 05 :00.0 Ethernet controller: Intel Corporation Ethernet Controller I225-V ( rev 03 ) 06 :00.0 PCI bridge: Advanced Micro Devices, Inc. [ AMD/ATI ] Navi 10 XL Upstream Port of PCI Express Switch ( rev c1 ) 07 :00.0 PCI bridge: Advanced Micro Devices, Inc. [ AMD/ATI ] Navi 10 XL Downstream Port of PCI Express Switch 08 :00.0 VGA compatible controller: Advanced Micro Devices, Inc. [ AMD/ATI ] Device 743f ( rev c1 ) 08 :00.1 Audio device: Advanced Micro Devices, Inc. [ AMD/ATI ] Navi 21 HDMI Audio [ Radeon RX 6800 /6800 XT / 6900 XT ] 09 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO The device that must be visible and working: 00:01.0 PCI bridge: Intel Corporation 12th Gen Core Processor PCI Express x16 Controller #1 (rev 02) The device behind the port must also be visible, in this example it is: 01:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] (rev a1) 01:00.1 Audio device: NVIDIA Corporation Device 228e (rev a1) To verify the PCIe 5.0 firmware caching is working, check the cbmem.log for the following string: [INFO ] Loading HSPHY firmware from cache If there are no errors printed nearby concerning the HSPHY, test pass.","title":"ME neuter/disable"},{"location":"unified-test-documentation/dasharo-security/20F-me-neuter/#dasharo-security-me-neuterdisable","text":"","title":"Dasharo Security: ME neuter/disable"},{"location":"unified-test-documentation/dasharo-security/20F-me-neuter/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-security/20F-me-neuter/#mne001001-check-intel-me-version-ubuntu-2204","text":"Test description This test aims to verify that the Intel ME version might be read on the Operating System level. The read version should be the same as in the release notes. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: cat /sys/class/mei/mei0/fw_ver Note the results. Expected result The output of the command should contain information about the Management Engine Interface firmware version. Example output: 0 :16.0.15.1735 0 :16.0.15.1735 0 :16.0.15.1723 Value from the first line, considering the numbers after the colon, should correspond to the value from the release notes","title":"MNE001.001 Check Intel ME version (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/20F-me-neuter/#mne002001-intel-me-mode-option-is-available-and-has-the-correct-default-state","text":"Test description This test aims to verify that the Intel ME mode state after flashing the platform with the Dasharo firmware is correct. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Intel Management Engine Options submenu. Verify the Intel ME mode field. Expected result The Intel ME mode field should inform that the current state is Enabled .","title":"MNE002.001 Intel ME mode option is available and has the correct default state"},{"location":"unified-test-documentation/dasharo-security/20F-me-neuter/#mne003001-intel-me-mode-option-enabled-works-correctly-ubuntu-2204","text":"Test description This test aims to verify that Intel ME mode option in state Enabled works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Intel Management Engine Options submenu. Verify that the Intel ME mode option is state Enabled - if not, using the arrow keys and Enter , choose option Enabled . Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep 00 :16.0 Note the results. Expected result The output of the command should contain the information about Management Engine Interface. Example output: Intel Corporation Comet Lake Management Engine Interface","title":"MNE003.001 Intel ME mode option Enabled works correctly (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/20F-me-neuter/#mne004001-intel-me-mode-option-disable-soft-works-correctly-ubuntu-2204","text":"Test description This test aims to verify that Intel ME mode option in state Disable (Soft) works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Intel Management Engine Options submenu. Verify that the Intel ME mode option is state Disable (Soft) - if not, using the arrow keys and Enter , choose option Disable (Soft) . Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep 00 :16.0 Note the results. Expected result The output of the command shouldn't contain the information about Management Engine Interface. Example of unwanted output: Intel Corporation Comet Lake Management Engine Interface","title":"MNE004.001 Intel ME mode option Disable (Soft) works correctly (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/20F-me-neuter/#mne005001-intel-me-mode-option-disable-hap-works-correctly-ubuntu-2204","text":"Test description This test aims to verify that Intel ME mode option in state Disable (HAP) works correctly. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Intel Management Engine Options submenu. Verify that the Intel ME mode option is state Disable (HAP) - if not, using the arrow keys and Enter , choose option Disable (HAP) . Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep 00 :16.0 Note the results. Expected result The output of the command shouldn't contain the information about Management Engine Interface. Example of unwanted output: Intel Corporation Comet Lake Management Engine Interface","title":"MNE005.001 Intel ME mode option Disable (HAP) works correctly (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/20F-me-neuter/#mne006001-pci-express-50-port-is-functional-when-me-disabled-ubuntu-2204","text":"Test description This test aims to verify that Intel ME mode option in state Disable (HAP) or Disable (Soft) does not break the PCIe 5.0 port functionality and the caching of PCIe 5.0 firmware by Dasharo works. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 DUT (Alder Lake or newer) with PCIe 5.0 port and a PCIe device plugged to the port. Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Intel Management Engine Options submenu. Verify that the Intel ME mode option is in state Disable (HAP) or Disable (Soft) - if not, using the arrow keys and Enter , choose option Disable (HAP) or Disable (Soft) . Press F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: sudo cbmem -1 > cbmem.log lspci lspci -t Note the results. Repeat all steps to cover both disable methods. Expected result The output of the command should contain the information about PCI Express 5.0 interface located at PCI 00:01.0. Also the device plugged to the PCI port 00:01.0 should be visible and functional. Example of desired output: lspci -t - [ 0000 :00 ] -+-00.0 +-01.0- [ 01 ] --+-00.0 | \\- 00 .1 +-02.0 +-06.0- [ 02 ] ----00.0 +-14.0 +-14.2 +-17.0 +-1a.0- [ 03 ] ----00.0 +-1c.0- [ 04 ] -- +-1c.2- [ 05 ] ----00.0 +-1c.4- [ 06 -08 ] ----00.0- [ 07 -08 ] ----00.0- [ 08 ] --+-00.0 | \\- 00 .1 +-1d.0- [ 09 ] ----00.0 +-1f.0 +-1f.3 +-1f.4 \\- 1f.5 lspci 00 :00.0 Host bridge: Intel Corporation Device 4648 ( rev 02 ) 00 :01.0 PCI bridge: Intel Corporation 12th Gen Core Processor PCI Express x16 Controller #1 (rev 02) 00 :02.0 Display controller: Intel Corporation AlderLake-S GT1 ( rev 0c ) 00 :06.0 PCI bridge: Intel Corporation 12th Gen Core Processor PCI Express x4 Controller #0 (rev 02) 00 :14.0 USB controller: Intel Corporation Device 7ae0 ( rev 11 ) 00 :14.2 RAM memory: Intel Corporation Device 7aa7 ( rev 11 ) 00 :17.0 SATA controller: Intel Corporation Device 7ae2 ( rev 11 ) 00 :1a.0 PCI bridge: Intel Corporation Device 7ac8 ( rev 11 ) 00 :1c.0 PCI bridge: Intel Corporation Device 7ab8 ( rev 11 ) 00 :1c.2 PCI bridge: Intel Corporation Device 7aba ( rev 11 ) 00 :1c.4 PCI bridge: Intel Corporation Device 7abc ( rev 11 ) 00 :1d.0 PCI bridge: Intel Corporation Device 7ab0 ( rev 11 ) 00 :1f.0 ISA bridge: Intel Corporation Device 7a84 ( rev 11 ) 00 :1f.3 Audio device: Intel Corporation Device 7ad0 ( rev 11 ) 00 :1f.4 SMBus: Intel Corporation Device 7aa3 ( rev 11 ) 00 :1f.5 Serial bus controller: Intel Corporation Device 7aa4 ( rev 11 ) 01 :00.0 VGA compatible controller: NVIDIA Corporation GA106 [ GeForce RTX 3060 Lite Hash Rate ] ( rev a1 ) 01 :00.1 Audio device: NVIDIA Corporation Device 228e ( rev a1 ) 02 :00.0 Non-Volatile memory controller: Intel Corporation Device f1aa ( rev 03 ) 03 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO 05 :00.0 Ethernet controller: Intel Corporation Ethernet Controller I225-V ( rev 03 ) 06 :00.0 PCI bridge: Advanced Micro Devices, Inc. [ AMD/ATI ] Navi 10 XL Upstream Port of PCI Express Switch ( rev c1 ) 07 :00.0 PCI bridge: Advanced Micro Devices, Inc. [ AMD/ATI ] Navi 10 XL Downstream Port of PCI Express Switch 08 :00.0 VGA compatible controller: Advanced Micro Devices, Inc. [ AMD/ATI ] Device 743f ( rev c1 ) 08 :00.1 Audio device: Advanced Micro Devices, Inc. [ AMD/ATI ] Navi 21 HDMI Audio [ Radeon RX 6800 /6800 XT / 6900 XT ] 09 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO The device that must be visible and working: 00:01.0 PCI bridge: Intel Corporation 12th Gen Core Processor PCI Express x16 Controller #1 (rev 02) The device behind the port must also be visible, in this example it is: 01:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] (rev a1) 01:00.1 Audio device: NVIDIA Corporation Device 228e (rev a1) To verify the PCIe 5.0 firmware caching is working, check the cbmem.log for the following string: [INFO ] Loading HSPHY firmware from cache If there are no errors printed nearby concerning the HSPHY, test pass.","title":"MNE006.001 PCI Express 5.0 port is functional when ME disabled (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/20J-bios-lock-support/","text":"Dasharo Security: BIOS lock support BLS001.001 BIOS lock support (Ubuntu 22.04) Test description BIOS lock is a method to prevent a specific region of the firmware from being flashed. This test aims to verify that, after turning on the mechanism, the BIOS region should be correctly recognized during attempt to overwrite it by using flashrom tool. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Disable Secure Boot. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Lock the BIOS boot medium option is chosen - if not, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Execute the following command in the terminal to check platform flashing conditions: flashrom -p internal Note the result. Expected result The output of the flashing command should contain the information, that the BIOS region is read-only. Example output: SPI Configuration is locked down. PR0: Warning: 0x00c00000-0x00ffffff is read-only. At least some flash regions are write protected. For write operations, you should use a flash layout and include only writable regions. See manpage for more details. BLS002.001 BIOS lock support deactivation (Ubuntu 22.04) Test description BIOS lock is a method to prevent a specific region of the firmware from being flashed. This test aims to verify that, after turning off the mechanism, the BIOS region overwriting operation is available again. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Disable Secure Boot. Obtain any other binary (e.g. vendor firmware or older Dasharo firmware). Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Lock the BIOS boot medium option is not chosen - if so, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Execute the following command in the terminal to check platform flashing conditions: flashrom -p internal Note the result. Expected result The output of the flashing command should not contain the information, that the BIOS region is read-only. Example output with unwanted results: SPI Configuration is locked down. PR0: Warning: 0x00c00000-0x00ffffff is read-only. At least some flash regions are write protected. For write operations, you should use a flash layout and include only writable regions. See manpage for more details.","title":"BIOS lock support"},{"location":"unified-test-documentation/dasharo-security/20J-bios-lock-support/#dasharo-security-bios-lock-support","text":"","title":"Dasharo Security: BIOS lock support"},{"location":"unified-test-documentation/dasharo-security/20J-bios-lock-support/#bls001001-bios-lock-support-ubuntu-2204","text":"Test description BIOS lock is a method to prevent a specific region of the firmware from being flashed. This test aims to verify that, after turning on the mechanism, the BIOS region should be correctly recognized during attempt to overwrite it by using flashrom tool. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Disable Secure Boot. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Lock the BIOS boot medium option is chosen - if not, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Execute the following command in the terminal to check platform flashing conditions: flashrom -p internal Note the result. Expected result The output of the flashing command should contain the information, that the BIOS region is read-only. Example output: SPI Configuration is locked down. PR0: Warning: 0x00c00000-0x00ffffff is read-only. At least some flash regions are write protected. For write operations, you should use a flash layout and include only writable regions. See manpage for more details.","title":"BLS001.001 BIOS lock support (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/20J-bios-lock-support/#bls002001-bios-lock-support-deactivation-ubuntu-2204","text":"Test description BIOS lock is a method to prevent a specific region of the firmware from being flashed. This test aims to verify that, after turning off the mechanism, the BIOS region overwriting operation is available again. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Disable Secure Boot. Obtain any other binary (e.g. vendor firmware or older Dasharo firmware). Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Lock the BIOS boot medium option is not chosen - if so, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Execute the following command in the terminal to check platform flashing conditions: flashrom -p internal Note the result. Expected result The output of the flashing command should not contain the information, that the BIOS region is read-only. Example output with unwanted results: SPI Configuration is locked down. PR0: Warning: 0x00c00000-0x00ffffff is read-only. At least some flash regions are write protected. For write operations, you should use a flash layout and include only writable regions. See manpage for more details.","title":"BLS002.001 BIOS lock support deactivation (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/20L-early-boot-dma-protection/","text":"Dasharo Security: Early Boot DMA Protection Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Disable Secure Boot. Download cbmem from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT. EDP001.001 Enable early Boot DMA Protection support Test description This test aims to verify that the early boot DMA protection might be activated. If the functionality is enabled, the protection against malicious PCIe devices DMA transactions by configuring VT-D/IOMMU should be active. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Enable early DMA protection field is checked - if not, use Spacebar to change option settings. Save the changes using F10 , and exit from the menu using Esc . Reboot the device. While booting, press BOOT_MENU_KEY to enter Boot Menu. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -1 Note the result. Expected result The output of the cbmem utility should contain the information, that the DMA protection has been set up. Example output: [DEBUG] VT-d @ 0xfed91000, version 5.0 [INFO ] Setting DMA protection [0x0 - 0x46c00000] [INFO ] Setting DMA protection [0x100000000 - 0x00000008afc00000] [INFO ] Successfully enabled VT-d PMR DMA protection Note the memory address ranges in square braces may differ per DUT. If the DUT does not support serial redirection, it is also possible to investigate UEFI Payload logs if VT-d is being used properly. Check for following output: EnableDmar >>>>>>EnableDmar() for engine [0] BAR [0xFED90000] RootEntryTable 0x4518C000 EnableDmar: waiting for RTPS bit to be set... Set GCMD_REG bits 0x40000000. EnableDmar: Waiting B_GSTS_REG_TE ... Set GCMD_REG bits 0x80000000. VTD (0) enabled!<<<<<< >>>>>>EnableDmar() for engine [1] BAR [0xFED91000] RootEntryTable 0x44FDD000 EnableDmar: waiting for RTPS bit to be set... Set GCMD_REG bits 0x40000000. EnableDmar: Waiting B_GSTS_REG_TE ... Set GCMD_REG bits 0x80000000. VTD (1) enabled!<<<<<< DisablePmr Pmr(0) not enabled Pmr(1) disabled The most important are VTD (0) enabled!<<<<<< and VTD (1) enabled!<<<<<< . Also the following: DisablePmr Pmr(0) not enabled Pmr(1) disabled Indicate that VT-D engine 1 had PMR enabled earlier, which is expected. If all above conditions are met, test pass. EDP002.001 Disable early Boot DMA Protection support Test description This test aims to verify that the early boot DMA protection might be deactivated. If the functionality is disabled, the protection against malicious PCIe devices DMA transactions by configuring VT-D/IOMMU should be non-active. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Enable early DMA protection option is checked - if so, use Spacebar to change option settings. Save the changes using F10 , and exit from the menu using Esc . Reboot the device. While booting, press BOOT_MENU_KEY to enter Boot Menu. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -1 Note the result. Expected result The output of the cbmem utility should not contain the information, that the DMA protection has been set up. Example output with unwanted results: [DEBUG] VT-d @ 0xfed91000, version 5.0 [INFO ] Setting DMA protection [0x0 - 0x46c00000] [INFO ] Setting DMA protection [0x100000000 - 0x00000008afc00000] [INFO ] Successfully enabled VT-d PMR DMA protection","title":"Early boot DMA protection"},{"location":"unified-test-documentation/dasharo-security/20L-early-boot-dma-protection/#dasharo-security-early-boot-dma-protection","text":"","title":"Dasharo Security: Early Boot DMA Protection"},{"location":"unified-test-documentation/dasharo-security/20L-early-boot-dma-protection/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Disable Secure Boot. Download cbmem from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd to the DUT.","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-security/20L-early-boot-dma-protection/#edp001001-enable-early-boot-dma-protection-support","text":"Test description This test aims to verify that the early boot DMA protection might be activated. If the functionality is enabled, the protection against malicious PCIe devices DMA transactions by configuring VT-D/IOMMU should be active. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Enable early DMA protection field is checked - if not, use Spacebar to change option settings. Save the changes using F10 , and exit from the menu using Esc . Reboot the device. While booting, press BOOT_MENU_KEY to enter Boot Menu. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -1 Note the result. Expected result The output of the cbmem utility should contain the information, that the DMA protection has been set up. Example output: [DEBUG] VT-d @ 0xfed91000, version 5.0 [INFO ] Setting DMA protection [0x0 - 0x46c00000] [INFO ] Setting DMA protection [0x100000000 - 0x00000008afc00000] [INFO ] Successfully enabled VT-d PMR DMA protection Note the memory address ranges in square braces may differ per DUT. If the DUT does not support serial redirection, it is also possible to investigate UEFI Payload logs if VT-d is being used properly. Check for following output: EnableDmar >>>>>>EnableDmar() for engine [0] BAR [0xFED90000] RootEntryTable 0x4518C000 EnableDmar: waiting for RTPS bit to be set... Set GCMD_REG bits 0x40000000. EnableDmar: Waiting B_GSTS_REG_TE ... Set GCMD_REG bits 0x80000000. VTD (0) enabled!<<<<<< >>>>>>EnableDmar() for engine [1] BAR [0xFED91000] RootEntryTable 0x44FDD000 EnableDmar: waiting for RTPS bit to be set... Set GCMD_REG bits 0x40000000. EnableDmar: Waiting B_GSTS_REG_TE ... Set GCMD_REG bits 0x80000000. VTD (1) enabled!<<<<<< DisablePmr Pmr(0) not enabled Pmr(1) disabled The most important are VTD (0) enabled!<<<<<< and VTD (1) enabled!<<<<<< . Also the following: DisablePmr Pmr(0) not enabled Pmr(1) disabled Indicate that VT-D engine 1 had PMR enabled earlier, which is expected. If all above conditions are met, test pass.","title":"EDP001.001 Enable early Boot DMA Protection support"},{"location":"unified-test-documentation/dasharo-security/20L-early-boot-dma-protection/#edp002001-disable-early-boot-dma-protection-support","text":"Test description This test aims to verify that the early boot DMA protection might be deactivated. If the functionality is disabled, the protection against malicious PCIe devices DMA transactions by configuring VT-D/IOMMU should be non-active. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Enable early DMA protection option is checked - if so, use Spacebar to change option settings. Save the changes using F10 , and exit from the menu using Esc . Reboot the device. While booting, press BOOT_MENU_KEY to enter Boot Menu. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the following command: sudo ./cbmem -1 Note the result. Expected result The output of the cbmem utility should not contain the information, that the DMA protection has been set up. Example output with unwanted results: [DEBUG] VT-d @ 0xfed91000, version 5.0 [INFO ] Setting DMA protection [0x0 - 0x46c00000] [INFO ] Setting DMA protection [0x100000000 - 0x00000008afc00000] [INFO ] Successfully enabled VT-d PMR DMA protection","title":"EDP002.001 Disable early Boot DMA Protection support"},{"location":"unified-test-documentation/dasharo-security/20O-SMM-bios-write-protection/","text":"Dasharo Security: SMM BIOS write protection Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Disable Secure Boot. SMM001.001 SMM BIOS write protection enabling (Ubuntu 22.04) Test description SMM BIOS write protection is the method to prevent a specific region of the firmware from being flashed - when enabled allows only SMM code (the privileged code installed by the firmware in the system memory) to write to BIOS flash. This test aims to verify that, the SMM BIOS protection option is available in the Dasharo Security Options and, if the mechanism works correctly - during the attempt of firmware flashing information about the SMM protection is returned. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Enable SMM BIOS write protection option is chosen - if not, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Execute the following command in the terminal to check platform flashing conditions: flashrom -p internal Note the result. Expected result The output of the flashing command should contain the information, that the BIOS region SMM protection is enabled. Example output: Enabling flash write... Warning: BIOS region SMM protection is enabled! SMM002.001 SMM BIOS write protection disabling (Ubuntu 22.04) Test description SMM BIOS write protection is the method to prevent a specific region of the firmware from being flashed - when enabled allows only SMM code (the privileged code installed by the firmware in the system memory) to write to BIOS flash. This test aims to verify that, after disabling the mechanism, information about SMM protection is not returned any more. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Enable SMM BIOS write protection option is not chosen - if so, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Execute the following command in the terminal to check platform flashing conditions: flashrom -p internal Note the result. Expected result The output of the flashing command should not contain the information, that the BIOS region SMM protection is enabled. Example output with unwanted results: Enabling flash write... Warning: BIOS region SMM protection is enabled!","title":"SMM BIOS write protection"},{"location":"unified-test-documentation/dasharo-security/20O-SMM-bios-write-protection/#dasharo-security-smm-bios-write-protection","text":"","title":"Dasharo Security: SMM BIOS write protection"},{"location":"unified-test-documentation/dasharo-security/20O-SMM-bios-write-protection/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Disable Secure Boot.","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-security/20O-SMM-bios-write-protection/#smm001001-smm-bios-write-protection-enabling-ubuntu-2204","text":"Test description SMM BIOS write protection is the method to prevent a specific region of the firmware from being flashed - when enabled allows only SMM code (the privileged code installed by the firmware in the system memory) to write to BIOS flash. This test aims to verify that, the SMM BIOS protection option is available in the Dasharo Security Options and, if the mechanism works correctly - during the attempt of firmware flashing information about the SMM protection is returned. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Enable SMM BIOS write protection option is chosen - if not, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Execute the following command in the terminal to check platform flashing conditions: flashrom -p internal Note the result. Expected result The output of the flashing command should contain the information, that the BIOS region SMM protection is enabled. Example output: Enabling flash write... Warning: BIOS region SMM protection is enabled!","title":"SMM001.001 SMM BIOS write protection enabling (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/20O-SMM-bios-write-protection/#smm002001-smm-bios-write-protection-disabling-ubuntu-2204","text":"Test description SMM BIOS write protection is the method to prevent a specific region of the firmware from being flashed - when enabled allows only SMM code (the privileged code installed by the firmware in the system memory) to write to BIOS flash. This test aims to verify that, after disabling the mechanism, information about SMM protection is not returned any more. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Enable SMM BIOS write protection option is not chosen - if so, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. Boot into the system. Log into the system by using the proper login and password. Execute the following command in the terminal to check platform flashing conditions: flashrom -p internal Note the result. Expected result The output of the flashing command should not contain the information, that the BIOS region SMM protection is enabled. Example output with unwanted results: Enabling flash write... Warning: BIOS region SMM protection is enabled!","title":"SMM002.001 SMM BIOS write protection disabling (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-security/20P-boot-menu/","text":"Dasharo Security: Boot menu enable/disable Test cases common documentation Test setup Proceed with the Generic test setup: firmware . BMA001.001 Boot menu enabling Test description This test aims to verify that, the boot menu is accessible when the Boot menu enabled option in the Dasharo Security Options submenu is chosen. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Boot menu enabled option is chosen - if not, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. While the DUT is booting, hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Expected result While the DUT is booting, the prompt BOOT_MENU_KEY to enter Boot Manager Menu should be displayed. Example output: F11 to enter Boot Manager Menu After using the BOOT MENU KEY during boot, the boot menu should be displayed. BMA002.001 Boot menu disabling Test description This test aims to verify that, the boot menu is not accessible when the Boot menu enabled option in the Dasharo Security Options submenu is not chosen. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Boot menu enabled option is not chosen - if so, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Boot Menu. Expected result While the DUT is booting, the prompt BOOT_MENU_KEY to enter Boot Manager Menu should not be displayed. Example of unwanted output: F11 to enter Boot Manager Menu Despite using the BIOS_SETUP_KEY boot menu should not be displayed.","title":"Boot menu enable/disable"},{"location":"unified-test-documentation/dasharo-security/20P-boot-menu/#dasharo-security-boot-menu-enabledisable","text":"","title":"Dasharo Security: Boot menu enable/disable"},{"location":"unified-test-documentation/dasharo-security/20P-boot-menu/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-security/20P-boot-menu/#bma001001-boot-menu-enabling","text":"Test description This test aims to verify that, the boot menu is accessible when the Boot menu enabled option in the Dasharo Security Options submenu is chosen. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Boot menu enabled option is chosen - if not, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. While the DUT is booting, hold the BOOT_MENU_KEY to enter the UEFI Boot Menu. Expected result While the DUT is booting, the prompt BOOT_MENU_KEY to enter Boot Manager Menu should be displayed. Example output: F11 to enter Boot Manager Menu After using the BOOT MENU KEY during boot, the boot menu should be displayed.","title":"BMA001.001 Boot menu enabling"},{"location":"unified-test-documentation/dasharo-security/20P-boot-menu/#bma002001-boot-menu-disabling","text":"Test description This test aims to verify that, the boot menu is not accessible when the Boot menu enabled option in the Dasharo Security Options submenu is not chosen. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify that the Boot menu enabled option is not chosen - if so, press Space and then F10 to save the changes. If necessary - press Y to confirm saving the changes. Go back to the main menu using the ESC key. Select the Reset option to apply the settings and reboot. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Boot Menu. Expected result While the DUT is booting, the prompt BOOT_MENU_KEY to enter Boot Manager Menu should not be displayed. Example of unwanted output: F11 to enter Boot Manager Menu Despite using the BIOS_SETUP_KEY boot menu should not be displayed.","title":"BMA002.001 Boot menu disabling"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/","text":"Dasharo Security: UEFI Setup password Test cases common documentation Test setup Proceed with the Generic test setup: firmware . PSW001.001 Check Password Setup option availability and default state Test description This test aims to verify whether User Password Management submenu is available and, whether all options in the submenu have correct default state. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the User Password Management submenu using the arrow keys and Enter. Verify the Admin Password Status field. Verify the Change Admin Password field. Expected result The Admin Password Status field should be present and indicate, that password setup is currently disabled. The Change Admin Password field should be present. After passing the cursor over this option, information about password minimum terms and conditions should be displayed. PSW002.001 Password setting mechanism correctness checking Test description This test aims to verify whether Change Admin Password option works correctly - after restarting the device and trying to enter the Setup Menu , a window to enter the password will be displayed. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the User Password Management submenu using the arrow keys and Enter. Select the option Change Admin Password by using the arrow keys and Enter. Set the password in accordance with the password minimum terms and conditions. Restart the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Verify if the password window will be displayed. Expected result The password window should be displayed correctly. PSW003.001 Attempt to log in with a correct password Test description This test aims to verify whether, after entering the correct Setup password, the Setup menu will be displayed. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT Press SETUP_MENU_KEY to enter the Setup Menu . Enter the correct password and note the result. Expected result After typing in the correct password Setup menu should be displayed. PSW004.001 Attempt to log in with an incorrect password Test description This test aims to verify whether, after entering the incorrect Setup password, the message about the demand for re-entering the password will be displayed. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT Press BOOT_MENU_KEY key to display the boot menu. Enter the incorrect password and note the result. Expected result After typing in the incorrect password the message about the demand for re-entering the password will be displayed. PSW005.001 Attempt to log in with an incorrect password 3 times Test description This test aims to verify whether, after entering the incorrect Setup password three times, the message about demand for rebooting the DUT will be displayed. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT Press BOOT_MENU_KEY key to display the boot menu. Enter the incorrect password three times and note the result. Expected result After typing in the incorrect password three times the message about the demand for rebooting the DUT will be displayed. PSW006.001 Attempt to turn off setup password functionality Test description This test aims to verify whether there is a possibility to turn off the Setup Password functionality by entering empty password. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the User Password Management submenu using the arrow keys and Enter. Select the option Change Admin Password by using the arrow keys and Enter. Set the empty password. Restart the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Verify if the password window will be displayed. Expected result Password window should not be displayed. The DUT should boot into Setup Menu . PSW007.001 Attempt to set non-compilant password Test description This test aims to verify whether the attempt to set a non-compilant password will be rejected. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the User Password Management submenu using the arrow keys and Enter. Select the option Change Admin Password by using the arrow keys and Enter. Set the password in non-accordance with the password minimum terms and conditions. Expected result The window with the information that requested password is not strong enough should be displayed. The attempt to set the password should be rejected. PSW008.001 Attempt to set old password Test description UEFI Setup password feature has been equipped with an additional functionality that prevents re-setting one of the last 5 access passwords. This test aims to verify whether the attempt to set old password again will be rejected. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the User Password Management submenu using the arrow keys and Enter. Select the option Change Admin Password by using the arrow keys and Enter. Set the password identically as one of the 5 latest passwords. Expected result The window with the information that requested password has been found in the passwords history should be displayed. The attempt to set the password should be rejected.","title":"UEFI Setup password"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/#dasharo-security-uefi-setup-password","text":"","title":"Dasharo Security: UEFI Setup password"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/#psw001001-check-password-setup-option-availability-and-default-state","text":"Test description This test aims to verify whether User Password Management submenu is available and, whether all options in the submenu have correct default state. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the User Password Management submenu using the arrow keys and Enter. Verify the Admin Password Status field. Verify the Change Admin Password field. Expected result The Admin Password Status field should be present and indicate, that password setup is currently disabled. The Change Admin Password field should be present. After passing the cursor over this option, information about password minimum terms and conditions should be displayed.","title":"PSW001.001 Check Password Setup option availability and default state"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/#psw002001-password-setting-mechanism-correctness-checking","text":"Test description This test aims to verify whether Change Admin Password option works correctly - after restarting the device and trying to enter the Setup Menu , a window to enter the password will be displayed. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the User Password Management submenu using the arrow keys and Enter. Select the option Change Admin Password by using the arrow keys and Enter. Set the password in accordance with the password minimum terms and conditions. Restart the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Verify if the password window will be displayed. Expected result The password window should be displayed correctly.","title":"PSW002.001 Password setting mechanism correctness checking"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/#psw003001-attempt-to-log-in-with-a-correct-password","text":"Test description This test aims to verify whether, after entering the correct Setup password, the Setup menu will be displayed. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT Press SETUP_MENU_KEY to enter the Setup Menu . Enter the correct password and note the result. Expected result After typing in the correct password Setup menu should be displayed.","title":"PSW003.001 Attempt to log in with a correct password"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/#psw004001-attempt-to-log-in-with-an-incorrect-password","text":"Test description This test aims to verify whether, after entering the incorrect Setup password, the message about the demand for re-entering the password will be displayed. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT Press BOOT_MENU_KEY key to display the boot menu. Enter the incorrect password and note the result. Expected result After typing in the incorrect password the message about the demand for re-entering the password will be displayed.","title":"PSW004.001 Attempt to log in with an incorrect password"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/#psw005001-attempt-to-log-in-with-an-incorrect-password-3-times","text":"Test description This test aims to verify whether, after entering the incorrect Setup password three times, the message about demand for rebooting the DUT will be displayed. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT Press BOOT_MENU_KEY key to display the boot menu. Enter the incorrect password three times and note the result. Expected result After typing in the incorrect password three times the message about the demand for rebooting the DUT will be displayed.","title":"PSW005.001 Attempt to log in with an incorrect password 3 times"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/#psw006001-attempt-to-turn-off-setup-password-functionality","text":"Test description This test aims to verify whether there is a possibility to turn off the Setup Password functionality by entering empty password. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the User Password Management submenu using the arrow keys and Enter. Select the option Change Admin Password by using the arrow keys and Enter. Set the empty password. Restart the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Verify if the password window will be displayed. Expected result Password window should not be displayed. The DUT should boot into Setup Menu .","title":"PSW006.001 Attempt to turn off setup password functionality"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/#psw007001-attempt-to-set-non-compilant-password","text":"Test description This test aims to verify whether the attempt to set a non-compilant password will be rejected. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the User Password Management submenu using the arrow keys and Enter. Select the option Change Admin Password by using the arrow keys and Enter. Set the password in non-accordance with the password minimum terms and conditions. Expected result The window with the information that requested password is not strong enough should be displayed. The attempt to set the password should be rejected.","title":"PSW007.001 Attempt to set non-compilant password"},{"location":"unified-test-documentation/dasharo-security/20R-uefi-setup-password/#psw008001-attempt-to-set-old-password","text":"Test description UEFI Setup password feature has been equipped with an additional functionality that prevents re-setting one of the last 5 access passwords. This test aims to verify whether the attempt to set old password again will be rejected. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Press SETUP_MENU_KEY to enter the Setup Menu . Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the User Password Management submenu using the arrow keys and Enter. Select the option Change Admin Password by using the arrow keys and Enter. Set the password identically as one of the 5 latest passwords. Expected result The window with the information that requested password has been found in the passwords history should be displayed. The attempt to set the password should be rejected.","title":"PSW008.001 Attempt to set old password"},{"location":"unified-test-documentation/dasharo-security/20S-usb-stack/","text":"Dasharo Security: USB stack enable/disable Test cases common documentation Test setup Proceed with the Generic test setup: firmware . USS001.001 Enable USB stack (firmware) Test description This test aims to verify that the USB stack might be enabled. If the stack is activated, there will be an option to use USB bootable drives and USB keyboards on the firmware level. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the device. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Verify that the Enable USB stack field is checked - if not, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Connect any USB with a bootable system and USB keyboard to the DUT. Reboot the device. While booting, press BOOT_MENU_KEY on the USB keyboard to enter Setup Menu. Note the results. Expected result USB keyboard should be operable. USB installer should be visible as a bootable device. USS002.001 Disable USB stack (firmware) Test description This test aims to verify that the USB stack might be disabled. If the stack is deactivated, there will be no option to use USB bootable drives and USB keyboards on the firmware level. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the device. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Verify that the Enable USB stack field is not checked - if so, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Connect any USB with a bootable system and USB keyboard to the DUT. Reboot the device. While booting, press BOOT_MENU_KEY on the PS/2 keyboard to enter Setup Menu. Try to navigate through the menu by using the USB keyboard. Note the results. Expected result USB keyboard should be non-operable. USB installer should not be visible as a bootable device. USS003.001 Enable USB Mass Storage (firmware) Test description This test aims to verify that USB Mass Storage might be enabled. If the storage support is activated, there will be an option to use USB bootable drives on the firmware level. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Verify that the Enable USB Mass Storage field is checked - if not, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Connect any USB with a bootable system and USB keyboard to the DUT. Reboot the device. While booting, press BOOT_MENU_KEY to enter Setup Menu. Note the result. Expected result USB installer should be visible as a bootable device. USS004.001 Disable USB Mass Storage (firmware) Test description This test aims to verify that USB Mass Storage might be disabled. If the storage support is deactivated, there will be no option to use USB bootable drives on the firmware level. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Verify that the Enable USB Mass Storage field is not checked - if so, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Connect any USB with a bootable system and USB keyboard to the DUT. Reboot the device. While booting, press BOOT_MENU_KEY to enter Setup Menu. Note the result. Expected result USB installer should not be visible as a bootable device.","title":"USB stack enable/disable"},{"location":"unified-test-documentation/dasharo-security/20S-usb-stack/#dasharo-security-usb-stack-enabledisable","text":"","title":"Dasharo Security: USB stack enable/disable"},{"location":"unified-test-documentation/dasharo-security/20S-usb-stack/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-security/20S-usb-stack/#uss001001-enable-usb-stack-firmware","text":"Test description This test aims to verify that the USB stack might be enabled. If the stack is activated, there will be an option to use USB bootable drives and USB keyboards on the firmware level. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the device. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Verify that the Enable USB stack field is checked - if not, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Connect any USB with a bootable system and USB keyboard to the DUT. Reboot the device. While booting, press BOOT_MENU_KEY on the USB keyboard to enter Setup Menu. Note the results. Expected result USB keyboard should be operable. USB installer should be visible as a bootable device.","title":"USS001.001 Enable USB stack (firmware)"},{"location":"unified-test-documentation/dasharo-security/20S-usb-stack/#uss002001-disable-usb-stack-firmware","text":"Test description This test aims to verify that the USB stack might be disabled. If the stack is deactivated, there will be no option to use USB bootable drives and USB keyboards on the firmware level. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Connect PS/2 keyboard to the device. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Verify that the Enable USB stack field is not checked - if so, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Connect any USB with a bootable system and USB keyboard to the DUT. Reboot the device. While booting, press BOOT_MENU_KEY on the PS/2 keyboard to enter Setup Menu. Try to navigate through the menu by using the USB keyboard. Note the results. Expected result USB keyboard should be non-operable. USB installer should not be visible as a bootable device.","title":"USS002.001 Disable USB stack (firmware)"},{"location":"unified-test-documentation/dasharo-security/20S-usb-stack/#uss003001-enable-usb-mass-storage-firmware","text":"Test description This test aims to verify that USB Mass Storage might be enabled. If the storage support is activated, there will be an option to use USB bootable drives on the firmware level. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Verify that the Enable USB Mass Storage field is checked - if not, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Connect any USB with a bootable system and USB keyboard to the DUT. Reboot the device. While booting, press BOOT_MENU_KEY to enter Setup Menu. Note the result. Expected result USB installer should be visible as a bootable device.","title":"USS003.001 Enable USB Mass Storage (firmware)"},{"location":"unified-test-documentation/dasharo-security/20S-usb-stack/#uss004001-disable-usb-mass-storage-firmware","text":"Test description This test aims to verify that USB Mass Storage might be disabled. If the storage support is deactivated, there will be no option to use USB bootable drives on the firmware level. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Dasharo System Features menu option. Verify that the Enable USB Mass Storage field is not checked - if so, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Connect any USB with a bootable system and USB keyboard to the DUT. Reboot the device. While booting, press BOOT_MENU_KEY to enter Setup Menu. Note the result. Expected result USB installer should not be visible as a bootable device.","title":"USS004.001 Disable USB Mass Storage (firmware)"},{"location":"unified-test-documentation/dasharo-security/20T-network-boot/","text":"Dasharo Security: Network stack enable/disable Test cases common documentation Test setup Proceed with the Generic test setup: firmware . The DUT should be connected to the Internet by using an Ethernet cable. NBA001.001 Enable Network Boot (firmware) Test description This test aims to verify that the Network Boot option might be enabled. If this option is activated, an additional option in the Boot menu which allows to boot the system from iPXE servers will appear. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Networking Options menu option. Verify that the Enable Network Boot field is checked - if not, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Reboot the device. While booting, press BOOT_MENU_KEY on the USB keyboard to enter Setup Menu. Note the results. Expected result The Network Boot option in the Boot menu should be visible. NBA002.001 Disable Network Boot (firmware) Test description This test aims to verify that the Network Boot option might be disabled. If this option is deactivated, an additional option in the Boot menu which allows to boot the system from iPXE servers will be hidden. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Networking Options menu option. Verify that the Enable Network Boot field is checked - if so, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Reboot the device. While booting, press BOOT_MENU_KEY on the USB keyboard to enter Setup Menu. Note the results. Expected result The Network Boot option in the Boot menu should not be visible.","title":"Network stack enable/disable"},{"location":"unified-test-documentation/dasharo-security/20T-network-boot/#dasharo-security-network-stack-enabledisable","text":"","title":"Dasharo Security: Network stack enable/disable"},{"location":"unified-test-documentation/dasharo-security/20T-network-boot/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . The DUT should be connected to the Internet by using an Ethernet cable.","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-security/20T-network-boot/#nba001001-enable-network-boot-firmware","text":"Test description This test aims to verify that the Network Boot option might be enabled. If this option is activated, an additional option in the Boot menu which allows to boot the system from iPXE servers will appear. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Networking Options menu option. Verify that the Enable Network Boot field is checked - if not, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Reboot the device. While booting, press BOOT_MENU_KEY on the USB keyboard to enter Setup Menu. Note the results. Expected result The Network Boot option in the Boot menu should be visible.","title":"NBA001.001 Enable Network Boot (firmware)"},{"location":"unified-test-documentation/dasharo-security/20T-network-boot/#nba002001-disable-network-boot-firmware","text":"Test description This test aims to verify that the Network Boot option might be disabled. If this option is deactivated, an additional option in the Boot menu which allows to boot the system from iPXE servers will be hidden. Test configuration data FIRMWARE = Dasharo Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. While booting, press the SETUP_MENU_KEY to enter Setup Menu. Enter the Networking Options menu option. Verify that the Enable Network Boot field is checked - if so, use Spacebar to change option settings. Save using F10 , and exit from the menu using Esc . Reboot the device. While booting, press BOOT_MENU_KEY on the USB keyboard to enter Setup Menu. Note the results. Expected result The Network Boot option in the Boot menu should not be visible.","title":"NBA002.001 Disable Network Boot (firmware)"},{"location":"unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/","text":"Dasharo Compatibility: NET controller after coldboot/warmboot/reboot/suspend Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . The Thunderbolt docking station connected to the Thunderbolt port. NET001.001 NET controller after coldboot (Ubuntu 22.04) Test description This test aims to verify that the network controller works and the platform is able to connect to the network after coldboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to the platform. Wait for internet connection to initialize. Open a terminal window and execute following command to list available network interfaces: ip a Determine the name of the ethernet controller. It typically is ethX or enpXsY , where X and Y are numbers. Then, execute following command to check if the network interface is working correctly: cat /sys/class/net//operstate Perform coldboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the command mentioned in point 8. Expected result The ip a command should return information about available NET interfaces. The list should contain the ethernet network interface, which is typically identified as ethX or enpXsY , where X and Y are numbers. Example output: 1 : lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00 inet 127 .0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2 : enp46s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff inet 192 .168.4.85/24 brd 192 .168.4.255 scope global dynamic noprefixroute enp46s0 valid_lft 40276sec preferred_lft 40276sec inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute valid_lft forever preferred_lft forever 3 : wlp0s20f3: mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 14 :18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff The cat /sys/class/net//operstate command should return information indicating if the network interface works correctly ( up ) or not ( down ). Example output: up NET002.001 NET controller after warmboot (Ubuntu 22.04) Test description This test aims to verify that the network controller works and the platform is able to connect to the network after warmboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to the platform. Wait for internet connection to initialize. Open a terminal window and execute following command to list available network interfaces: ip a Determine the name of the ethernet controller. It typically is ethX or enpXsY , where X and Y are numbers. Then, execute following command to check if the network interface is working correctly: cat /sys/class/net//operstate Perform warmboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the command mentioned in point 8. Expected result The ip a command should return information about available NET interfaces. The list should contain the ethernet network interface, which is typically identified as ethX or enpXsY , where X and Y are numbers. Example output: 1 : lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00 inet 127 .0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2 : enp46s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff inet 192 .168.4.85/24 brd 192 .168.4.255 scope global dynamic noprefixroute enp46s0 valid_lft 40276sec preferred_lft 40276sec inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute valid_lft forever preferred_lft forever 3 : wlp0s20f3: mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 14 :18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff The cat /sys/class/net//operstate command should return information indicating if the network interface works correctly ( up ) or not ( down ). Example output: up NET003.001 NET controller after reboot (Ubuntu 22.04) Test description This test aims to verify that the network controller works and the platform is able to connect to the network after coldboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to the platform. Wait for internet connection to initialize. Open a terminal window and execute following command to list available network interfaces: ip a Determine the name of the ethernet controller. It typically is ethX or enpXsY , where X and Y are numbers. Then, execute following command to check if the network interface is working correctly: cat /sys/class/net//operstate Reboot the system. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the command mentioned in point 8. Expected result The ip a command should return information about available NET interfaces. The list should contain the ethernet network interface, which is typically identified as ethX or enpXsY , where X and Y are numbers. Example output: 1 : lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00 inet 127 .0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2 : enp46s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff inet 192 .168.4.85/24 brd 192 .168.4.255 scope global dynamic noprefixroute enp46s0 valid_lft 40276sec preferred_lft 40276sec inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute valid_lft forever preferred_lft forever 3 : wlp0s20f3: mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 14 :18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff The cat /sys/class/net//operstate command should return information indicating if the network interface works correctly ( up ) or not ( down ). Example output: up NET004.001 NET controller after suspend (Ubuntu 22.04) Test description This test aims to verify that the network controller works and the platform is able to connect to the network after suspend. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to the platform. Wait for internet connection to initialize. Open a terminal window and execute following command to list available network interfaces: ip a Determine the name of the ethernet controller. It typically is ethX or enpXsY , where X and Y are numbers. Then, execute following command to check if the network interface is working correctly: cat /sys/class/net//operstate Execute following command to suspend the system and automatically wake it up after 10 seconds: sudo fwts s3 --s3-sleep-delay = 10 After the system wakes up, log into the system and execute the command mentioned in point 8. Expected result The ip a command should return information about available NET interfaces. The list should contain the ethernet network interface, which is typically identified as ethX or enpXsY , where X and Y are numbers. Example output: 1 : lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00 inet 127 .0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2 : enp46s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff inet 192 .168.4.85/24 brd 192 .168.4.255 scope global dynamic noprefixroute enp46s0 valid_lft 40276sec preferred_lft 40276sec inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute valid_lft forever preferred_lft forever 3 : wlp0s20f3: mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 14 :18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff The cat /sys/class/net//operstate command should return information indicating if the network interface works correctly ( up ) or not ( down ). Example output: up","title":"NET interface check after coldboot/warmboot/reboot/suspend"},{"location":"unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/#dasharo-compatibility-net-controller-after-coldbootwarmbootrebootsuspend","text":"","title":"Dasharo Compatibility: NET controller after coldboot/warmboot/reboot/suspend"},{"location":"unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . The Thunderbolt docking station connected to the Thunderbolt port.","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/#net001001-net-controller-after-coldboot-ubuntu-2204","text":"Test description This test aims to verify that the network controller works and the platform is able to connect to the network after coldboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to the platform. Wait for internet connection to initialize. Open a terminal window and execute following command to list available network interfaces: ip a Determine the name of the ethernet controller. It typically is ethX or enpXsY , where X and Y are numbers. Then, execute following command to check if the network interface is working correctly: cat /sys/class/net//operstate Perform coldboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the command mentioned in point 8. Expected result The ip a command should return information about available NET interfaces. The list should contain the ethernet network interface, which is typically identified as ethX or enpXsY , where X and Y are numbers. Example output: 1 : lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00 inet 127 .0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2 : enp46s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff inet 192 .168.4.85/24 brd 192 .168.4.255 scope global dynamic noprefixroute enp46s0 valid_lft 40276sec preferred_lft 40276sec inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute valid_lft forever preferred_lft forever 3 : wlp0s20f3: mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 14 :18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff The cat /sys/class/net//operstate command should return information indicating if the network interface works correctly ( up ) or not ( down ). Example output: up","title":"NET001.001 NET controller after coldboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/#net002001-net-controller-after-warmboot-ubuntu-2204","text":"Test description This test aims to verify that the network controller works and the platform is able to connect to the network after warmboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to the platform. Wait for internet connection to initialize. Open a terminal window and execute following command to list available network interfaces: ip a Determine the name of the ethernet controller. It typically is ethX or enpXsY , where X and Y are numbers. Then, execute following command to check if the network interface is working correctly: cat /sys/class/net//operstate Perform warmboot. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the command mentioned in point 8. Expected result The ip a command should return information about available NET interfaces. The list should contain the ethernet network interface, which is typically identified as ethX or enpXsY , where X and Y are numbers. Example output: 1 : lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00 inet 127 .0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2 : enp46s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff inet 192 .168.4.85/24 brd 192 .168.4.255 scope global dynamic noprefixroute enp46s0 valid_lft 40276sec preferred_lft 40276sec inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute valid_lft forever preferred_lft forever 3 : wlp0s20f3: mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 14 :18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff The cat /sys/class/net//operstate command should return information indicating if the network interface works correctly ( up ) or not ( down ). Example output: up","title":"NET002.001 NET controller after warmboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/#net003001-net-controller-after-reboot-ubuntu-2204","text":"Test description This test aims to verify that the network controller works and the platform is able to connect to the network after coldboot. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to the platform. Wait for internet connection to initialize. Open a terminal window and execute following command to list available network interfaces: ip a Determine the name of the ethernet controller. It typically is ethX or enpXsY , where X and Y are numbers. Then, execute following command to check if the network interface is working correctly: cat /sys/class/net//operstate Reboot the system. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and execute the command mentioned in point 8. Expected result The ip a command should return information about available NET interfaces. The list should contain the ethernet network interface, which is typically identified as ethX or enpXsY , where X and Y are numbers. Example output: 1 : lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00 inet 127 .0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2 : enp46s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff inet 192 .168.4.85/24 brd 192 .168.4.255 scope global dynamic noprefixroute enp46s0 valid_lft 40276sec preferred_lft 40276sec inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute valid_lft forever preferred_lft forever 3 : wlp0s20f3: mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 14 :18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff The cat /sys/class/net//operstate command should return information indicating if the network interface works correctly ( up ) or not ( down ). Example output: up","title":"NET003.001 NET controller after reboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/#net004001-net-controller-after-suspend-ubuntu-2204","text":"Test description This test aims to verify that the network controller works and the platform is able to connect to the network after suspend. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Plug in a Ethernet cable with internet connection to the platform. Wait for internet connection to initialize. Open a terminal window and execute following command to list available network interfaces: ip a Determine the name of the ethernet controller. It typically is ethX or enpXsY , where X and Y are numbers. Then, execute following command to check if the network interface is working correctly: cat /sys/class/net//operstate Execute following command to suspend the system and automatically wake it up after 10 seconds: sudo fwts s3 --s3-sleep-delay = 10 After the system wakes up, log into the system and execute the command mentioned in point 8. Expected result The ip a command should return information about available NET interfaces. The list should contain the ethernet network interface, which is typically identified as ethX or enpXsY , where X and Y are numbers. Example output: 1 : lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00 :00:00:00:00:00 brd 00 :00:00:00:00:00 inet 127 .0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2 : enp46s0: mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff inet 192 .168.4.85/24 brd 192 .168.4.255 scope global dynamic noprefixroute enp46s0 valid_lft 40276sec preferred_lft 40276sec inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute valid_lft forever preferred_lft forever 3 : wlp0s20f3: mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 14 :18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff The cat /sys/class/net//operstate command should return information indicating if the network interface works correctly ( up ) or not ( down ). Example output: up","title":"NET004.001 NET controller after suspend (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/","text":"Dasharo Stability: USB Type-A devices detection Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Connect the USB device to the USB Type-A port. SUD0001.001 USB devices detection after cold boot (Ubuntu 22.04) Test description This test aims to verify that the external USB devices are detected correctly after performing a cold boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result The output of each lsusb command should contain an entry of the connected USB device . SUD0002.001 USB devices detection after warm boot (Ubuntu 22.04) Test description This test aims to verify that the external USB devices are detected correctly after performing a warm boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Power off the DUT using the power button. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result The output of each lsusb command should contain an entry of the connected USB device . SUD0003.001 USB devices detection after reboot (Ubuntu 22.04) Test description This test aims to verify that the external USB devices are detected correctly after performing a reboot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result The output of each lsusb command should contain an entry of the connected USB device . SUD0004.001 USB devices detection after suspension (Ubuntu 22.04) Test description This test aims to verify that the external USB devices are detected correctly after performing suspension. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the Firmware test suite package. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Execute the following command to suspend the system and automatically wake it up after 10 seconds: sudo fwts s3 --s3-sleep-delay = 10 Open a terminal window and run the following command: lsusb Note the results. Expected result The output of each lsusb command should contain an entry of the connected USB device .","title":"USB Type-A devices detection"},{"location":"unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/#dasharo-stability-usb-type-a-devices-detection","text":"","title":"Dasharo Stability: USB Type-A devices detection"},{"location":"unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . Connect the USB device to the USB Type-A port.","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/#sud0001001-usb-devices-detection-after-cold-boot-ubuntu-2204","text":"Test description This test aims to verify that the external USB devices are detected correctly after performing a cold boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result The output of each lsusb command should contain an entry of the connected USB device .","title":"SUD0001.001 USB devices detection after cold boot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/#sud0002001-usb-devices-detection-after-warm-boot-ubuntu-2204","text":"Test description This test aims to verify that the external USB devices are detected correctly after performing a warm boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Power off the DUT using the power button. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result The output of each lsusb command should contain an entry of the connected USB device .","title":"SUD0002.001 USB devices detection after warm boot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/#sud0003001-usb-devices-detection-after-reboot-ubuntu-2204","text":"Test description This test aims to verify that the external USB devices are detected correctly after performing a reboot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Expected result The output of each lsusb command should contain an entry of the connected USB device .","title":"SUD0003.001 USB devices detection after reboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/#sud0004001-usb-devices-detection-after-suspension-ubuntu-2204","text":"Test description This test aims to verify that the external USB devices are detected correctly after performing suspension. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the Firmware test suite package. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lsusb Note the results. Execute the following command to suspend the system and automatically wake it up after 10 seconds: sudo fwts s3 --s3-sleep-delay = 10 Open a terminal window and run the following command: lsusb Note the results. Expected result The output of each lsusb command should contain an entry of the connected USB device .","title":"SUD0004.001 USB devices detection after suspension (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C02-m2-wi-fi/","text":"Dasharo Stability: M.2 Wi-fi Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . SMW0001.001 Wi-fi connection after cold boot (Ubuntu 22.04) Test description This test aims to verify that the Wi-Fi card is detected and working correctly after performing a cold boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of each lspci command should contain information about the mounted on the DUT network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a ) The output of each nmcli device wifi list` command should return a list of available Wi-Fi networks. Example output: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2 SMW0002.001 Wi-fi connection after warm boot (Ubuntu 22.04) Test description This test aims to verify that the Wi-Fi card is detected and working correctly after performing a warm boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Power off the DUT using the power button. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of each lspci command should contain information about the mounted on the DUT network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a ) The output of each nmcli device wifi list` command should return a list of available Wi-Fi networks. Example output: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2 SMW0003.001 Wi-fi connection after reboot (Ubuntu 22.04) Test description This test aims to verify that the Wi-Fi card is detected and working correctly after performing a reboot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of each lspci command should contain information about the mounted on the DUT network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a ) The output of each nmcli device wifi list` command should return a list of available Wi-Fi networks. Example output: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2 SMW0004.001 Wi-fi connection after suspension (Ubuntu 22.04) Test description This test aims to verify that the Wi-Fi card is detected and working correctly after performing suspension. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the Firmware test suite package. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Execute the following command to suspend the system and automatically wake it up after 10 seconds: sudo fwts s3 --s3-sleep-delay = 10 Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of each lspci command should contain information about the mounted on the DUT network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a ) The output of each nmcli device wifi list` command should return a list of available Wi-Fi networks. Example output: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2","title":"M.2 Wi-fi"},{"location":"unified-test-documentation/dasharo-stability/C02-m2-wi-fi/#dasharo-stability-m2-wi-fi","text":"","title":"Dasharo Stability: M.2 Wi-fi"},{"location":"unified-test-documentation/dasharo-stability/C02-m2-wi-fi/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-stability/C02-m2-wi-fi/#smw0001001-wi-fi-connection-after-cold-boot-ubuntu-2204","text":"Test description This test aims to verify that the Wi-Fi card is detected and working correctly after performing a cold boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of each lspci command should contain information about the mounted on the DUT network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a ) The output of each nmcli device wifi list` command should return a list of available Wi-Fi networks. Example output: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2","title":"SMW0001.001 Wi-fi connection after cold boot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C02-m2-wi-fi/#smw0002001-wi-fi-connection-after-warm-boot-ubuntu-2204","text":"Test description This test aims to verify that the Wi-Fi card is detected and working correctly after performing a warm boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Power off the DUT using the power button. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of each lspci command should contain information about the mounted on the DUT network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a ) The output of each nmcli device wifi list` command should return a list of available Wi-Fi networks. Example output: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2","title":"SMW0002.001 Wi-fi connection after warm boot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C02-m2-wi-fi/#smw0003001-wi-fi-connection-after-reboot-ubuntu-2204","text":"Test description This test aims to verify that the Wi-Fi card is detected and working correctly after performing a reboot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of each lspci command should contain information about the mounted on the DUT network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a ) The output of each nmcli device wifi list` command should return a list of available Wi-Fi networks. Example output: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2","title":"SMW0003.001 Wi-fi connection after reboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C02-m2-wi-fi/#smw0004001-wi-fi-connection-after-suspension-ubuntu-2204","text":"Test description This test aims to verify that the Wi-Fi card is detected and working correctly after performing suspension. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the Firmware test suite package. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Execute the following command to suspend the system and automatically wake it up after 10 seconds: sudo fwts s3 --s3-sleep-delay = 10 Open a terminal window and run the following command: lspci | grep \"Network Controller\" Open a terminal window and run the following commands: nmcli radio wifi on nmcli device wifi rescan # Wait ~5 seconds nmcli device wifi list Expected result The output of each lspci command should contain information about the mounted on the DUT network controller. Example output: 2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 ( rev 1a ) The output of each nmcli device wifi list` command should return a list of available Wi-Fi networks. Example output: IN-USE BSSID SSID MODE CHAN RATE SIGNAL BARS SECURITY XX:XX:XX:XX:XX:XX DIRECT-ny Infra 6 65 Mbit/s 75 \u2582\u2584\u2586_ WPA2 * XX:XX:XX:XX:XX:XX 3mdeb_abr_5GHz Infra 48 405 Mbit/s 72 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX 3mdeb_abr Infra 11 54 Mbit/s 69 \u2582\u2584\u2586_ WPA2 XX:XX:XX:XX:XX:XX FunBox2-F9BF_2.4GHz Infra 1 130 Mbit/s 50 \u2582\u2584__ WPA1 WPA2 XX:XX:XX:XX:XX:XX H_Office Infra 2 270 Mbit/s 35 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-xpPhaser 3330 Infra 1 65 Mbit/s 34 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 108 540 Mbit/s 32 \u2582\u2584__ WPA2 XX:XX:XX:XX:XX:XX DIRECT-KRM288x Series Infra 11 54 Mbit/s 22 \u2582___ WPA2 XX:XX:XX:XX:XX:XX Orange_Swiatlowod_A79A Infra 11 130 Mbit/s 20 \u2582___ WPA2 XX:XX:XX:XX:XX:XX DIRECT-ejPhaser 3330 Infra 1 65 Mbit/s 17 \u2582___ WPA2 XX:XX:XX:XX:XX:XX NED-WIFI Infra 11 270 Mbit/s 17 \u2582___ WPA2","title":"SMW0004.001 Wi-fi connection after suspension (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C03-nvme-detection/","text":"Dasharo Stability: NVMe detection Test cases common documentation Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk . SNV0001.001 NVMe detection after cold boot (Ubuntu 22.04) Test description This test aims to verify that the NVMe disk is correctly detected after performing a cold boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Expected result The output of each lspci command should contain information about the mounted on the DUT NVMe disk. Example output: 01 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980 SNV0001.001 NVMe detection after warm boot (Ubuntu 22.04) Test description This test aims to verify that the NVMe disk is correctly detected after performing a warm boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Power off the DUT using the power button. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Expected result The output of each lspci command should contain information about the mounted on the DUT NVMe disk. Example output: 01 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980 SNV0003.001 NVMe detection after reboot (Ubuntu 22.04) Test description This test aims to verify that the NVMe disk is correctly detected after performing a reboot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Expected result The output of each lspci command should contain information about the mounted on the DUT NVMe disk. Example output: 01 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980 SNV0004.001 NVMe detection after suspension (Ubuntu 22.04) Test description This test aims to verify that the NVMe disk is correctly detected after performing suspension. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the Firmware test suite package. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Execute the following command to suspend the system and automatically wake it up after 10 seconds: sudo fwts s3 --s3-sleep-delay = 10 Open a terminal window and run the following command: lspci | grep -i nvme Expected result The output of each lspci command should contain information about the mounted on the DUT NVMe disk. Example output: 01 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980","title":"NVMe detection"},{"location":"unified-test-documentation/dasharo-stability/C03-nvme-detection/#dasharo-stability-nvme-detection","text":"","title":"Dasharo Stability: NVMe detection"},{"location":"unified-test-documentation/dasharo-stability/C03-nvme-detection/#test-cases-common-documentation","text":"Test setup Proceed with the Generic test setup: firmware . Proceed with the Generic test setup: OS installer . Proceed with the Generic test setup: OS installation . Proceed with the Generic test setup: OS boot from disk .","title":"Test cases common documentation"},{"location":"unified-test-documentation/dasharo-stability/C03-nvme-detection/#snv0001001-nvme-detection-after-cold-boot-ubuntu-2204","text":"Test description This test aims to verify that the NVMe disk is correctly detected after performing a cold boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Expected result The output of each lspci command should contain information about the mounted on the DUT NVMe disk. Example output: 01 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980","title":"SNV0001.001 NVMe detection after cold boot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C03-nvme-detection/#snv0001001-nvme-detection-after-warm-boot-ubuntu-2204","text":"Test description This test aims to verify that the NVMe disk is correctly detected after performing a warm boot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Power off the DUT using the power button. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Expected result The output of each lspci command should contain information about the mounted on the DUT NVMe disk. Example output: 01 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980","title":"SNV0001.001 NVMe detection after warm boot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C03-nvme-detection/#snv0003001-nvme-detection-after-reboot-ubuntu-2204","text":"Test description This test aims to verify that the NVMe disk is correctly detected after performing a reboot. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Generic test setup: firmware Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Disconnect the power source, and remove the battery if present. Connect power and battery again. Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Expected result The output of each lspci command should contain information about the mounted on the DUT NVMe disk. Example output: 01 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980","title":"SNV0003.001 NVMe detection after reboot (Ubuntu 22.04)"},{"location":"unified-test-documentation/dasharo-stability/C03-nvme-detection/#snv0004001-nvme-detection-after-suspension-ubuntu-2204","text":"Test description This test aims to verify that the NVMe disk is correctly detected after performing suspension. The test should be performed in multiple iterations. Test configuration data FIRMWARE = Dasharo OPERATING_SYSTEM = Ubuntu 22.04 Test setup Proceed with the Test cases common documentation section. Install the Firmware test suite package. Test steps Power on the DUT. Boot into the system. Log into the system by using the proper login and password. Open a terminal window and run the following command: lspci | grep -i nvme Execute the following command to suspend the system and automatically wake it up after 10 seconds: sudo fwts s3 --s3-sleep-delay = 10 Open a terminal window and run the following command: lspci | grep -i nvme Expected result The output of each lspci command should contain information about the mounted on the DUT NVMe disk. Example output: 01 :00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980","title":"SNV0004.001 NVMe detection after suspension (Ubuntu 22.04)"},{"location":"value-prop/compatibility/","text":"Dasharo Compatibility Module From communication bus standards, through industry specifications like ACPI and ending up with support for Operating Systems, each platform needs set of compatibility criteria which have to be maintained across life cycle of market availability and sometimes even after it. This section describes what compatibility features Dasharo offer and how it make sure their availability in every firmware release.","title":"Compatibility"},{"location":"value-prop/compatibility/#dasharo-compatibility-module","text":"From communication bus standards, through industry specifications like ACPI and ending up with support for Operating Systems, each platform needs set of compatibility criteria which have to be maintained across life cycle of market availability and sometimes even after it. This section describes what compatibility features Dasharo offer and how it make sure their availability in every firmware release.","title":"Dasharo Compatibility Module"},{"location":"value-prop/marketing/","text":"Dasharo Marketing Module We think every advanced piece of software requires correct communication to all users who will interact with it. Marketing module helps in organizing and delivering information required to understand and correctly leverage software produced by Dasharo Ecosystem. Key Embedded Firmware marketing issues Differentiation through firmware Most hardware vendors do not leverage ability to differentiate through firmware features, which is way easier then designing new hardware. Products Embedded Firmware Release Website Newsletter Repository Community and Customer Support Issues repository maintenance Documentation repository maintenance Conference speaking Technical Sales Support","title":"Marketing"},{"location":"value-prop/marketing/#dasharo-marketing-module","text":"We think every advanced piece of software requires correct communication to all users who will interact with it. Marketing module helps in organizing and delivering information required to understand and correctly leverage software produced by Dasharo Ecosystem.","title":"Dasharo Marketing Module"},{"location":"value-prop/marketing/#key-embedded-firmware-marketing-issues","text":"","title":"Key Embedded Firmware marketing issues"},{"location":"value-prop/marketing/#products","text":"Embedded Firmware Release Website Newsletter Repository Community and Customer Support Issues repository maintenance Documentation repository maintenance Conference speaking Technical Sales Support","title":"Products"},{"location":"value-prop/overview/","text":"Dasharo Value Proposition There are multiple reasons why you should choose Dasharo. In this section we will try to structure and present whole value that Dasharo can bring to your hardware. Marketing - Dasharo Marketing Module was created to resolve problems of hardware vendors with communicating Embedded Firmware value. Finally, we agree with John Hennessy and David Patterson that we enter era of New Golden Age of domain specific computing with open architectures and open-source implementations. What eventually will lead to more firmware everywhere . Addressing mentioned areas is just beginning for Dasharo we think following years would need way more firmware expertise then at any other point in time.","title":"Overview"},{"location":"value-prop/overview/#dasharo-value-proposition","text":"There are multiple reasons why you should choose Dasharo. In this section we will try to structure and present whole value that Dasharo can bring to your hardware. Marketing - Dasharo Marketing Module was created to resolve problems of hardware vendors with communicating Embedded Firmware value. Finally, we agree with John Hennessy and David Patterson that we enter era of New Golden Age of domain specific computing with open architectures and open-source implementations. What eventually will lead to more firmware everywhere . Addressing mentioned areas is just beginning for Dasharo we think following years would need way more firmware expertise then at any other point in time.","title":"Dasharo Value Proposition"},{"location":"value-prop/security/","text":"Dasharo Security Module This module gathers all security features Dasharo Ecosystem can bring to your platform through software. No matter if this is new hardware at design stage, prototype waiting for bring up or well-established platform looking for after-market boost. In this section we will explain what features Dasharo provide in area of security.","title":"Security"},{"location":"value-prop/security/#dasharo-security-module","text":"This module gathers all security features Dasharo Ecosystem can bring to your platform through software. No matter if this is new hardware at design stage, prototype waiting for bring up or well-established platform looking for after-market boost. In this section we will explain what features Dasharo provide in area of security.","title":"Dasharo Security Module"},{"location":"variants/hardware-compatibility-list/","text":"Hardware Compatibility List Vendor Model Status Roadmap Shop Documentation Dell OptiPlex 7010 SFF Implementation TBD TBD link Dell OptiPlex 7010 DT Implementation TBD TBD link Dell OptiPlex 9010 SFF Implementation TBD TBD link Possible status: Planning - platform support is planned either through internal, community or commercial sponsorship. Implementation - under active development to provide baseline support. Testing and Integration - under validation to sign-off on baseline quality criteria. Maintenance - under active maintenance release cycle according to schedule presented in Roadmap.","title":"Hardware Compatibility List"},{"location":"variants/hardware-compatibility-list/#hardware-compatibility-list","text":"Vendor Model Status Roadmap Shop Documentation Dell OptiPlex 7010 SFF Implementation TBD TBD link Dell OptiPlex 7010 DT Implementation TBD TBD link Dell OptiPlex 9010 SFF Implementation TBD TBD link Possible status: Planning - platform support is planned either through internal, community or commercial sponsorship. Implementation - under active development to provide baseline support. Testing and Integration - under validation to sign-off on baseline quality criteria. Maintenance - under active maintenance release cycle according to schedule presented in Roadmap.","title":"Hardware Compatibility List"},{"location":"variants/overview/","text":"Supported hardware Following is up to date list of hardware platforms supported by Dasharo open-source firmware distribution. Network appliance Following network appliaces are supported under Dasharo Support Package: Protectli FW6 Protectli VP2410 Protectli VP2420 Protectli VP46xx Following network appliaces are planned to be supported under Dasharo Community Support: PC Engines Laptops Following laptops are supported under Dasharo Support Package NovaCustom NV4x 12th Gen NovaCustom NS5x/7x 12th Gen NovaCustom NV4x 11th Gen NovaCustom NS5x/7x 11th Gen Following laptops are supported under Dasharo Community Support Tuxedo IBS15 Desktop Following desktops are supported under Dasharo Community Support Dell OptiPlex MSI PRO Z690-A Workstation Following workstations are supported under Dasharo Community Support Asus KGPE-D16 Raptor CS Talos II Servers Following servers are supported under Dasharo Community Support Supermicro X11 LGA1151 Series","title":"Overview"},{"location":"variants/overview/#supported-hardware","text":"Following is up to date list of hardware platforms supported by Dasharo open-source firmware distribution.","title":"Supported hardware"},{"location":"variants/overview/#network-appliance","text":"Following network appliaces are supported under Dasharo Support Package: Protectli FW6 Protectli VP2410 Protectli VP2420 Protectli VP46xx Following network appliaces are planned to be supported under Dasharo Community Support: PC Engines","title":"Network appliance"},{"location":"variants/overview/#laptops","text":"Following laptops are supported under Dasharo Support Package NovaCustom NV4x 12th Gen NovaCustom NS5x/7x 12th Gen NovaCustom NV4x 11th Gen NovaCustom NS5x/7x 11th Gen Following laptops are supported under Dasharo Community Support Tuxedo IBS15","title":"Laptops"},{"location":"variants/overview/#desktop","text":"Following desktops are supported under Dasharo Community Support Dell OptiPlex MSI PRO Z690-A","title":"Desktop"},{"location":"variants/overview/#workstation","text":"Following workstations are supported under Dasharo Community Support Asus KGPE-D16 Raptor CS Talos II","title":"Workstation"},{"location":"variants/overview/#servers","text":"Following servers are supported under Dasharo Community Support Supermicro X11 LGA1151 Series","title":"Servers"},{"location":"variants/asus_kgpe_d16/building-manual/","text":"Building manual Building coreboot To build coreboot image, follow the steps below: Clone the coreboot repository: git clone https://github.com/dasharo/coreboot.git -b asus_kgpe-d16/release Get the submodules: cd coreboot git submodule update --init --recursive --checkout Start docker container: docker run --rm -it -u $UID \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:0ad5fbd48d /bin/bash Inside of the container, configure and start the build process: ( docker ) cp configs/config.asus_kgpe_d16_ .config ( docker ) make olddefconfig ( docker ) make This will produce a debug binary placed in build/coreboot.rom for a 2MB flash chip. In order to build for 8MB or 16MB chip use the configs/config.asus_kgpe_d16_8M and configs/config.asus_kgpe_d16_16M respectively. Dasharo v0.1.0 for KGPE-D16 supports only 8MB target with configs/config.asus_kgpe_d16 . To flash coreboot refer to Flashing section in the hardware setup page. Other variants Since the Dasharo v0.3.0 release the firmware comes in two more variatns: with TPM 1.2 and TPM 2.0 support. Now the possible confis to use are: configs/config.asus_kgpe_d16_vboot_tpm12 - 2MB target with vboot and TPM 1.2 configs/config.asus_kgpe_d16_vboot_tpm2 - 2MB target with vboot and TPM 2.0 configs/config.asus_kgpe_d16_8M_vboot_tpm12 - 8MB target with vboot and TPM 1.2 configs/config.asus_kgpe_d16_8M_vboot_tpm2 - 8MB target with vboot and TPM 2.0 configs/config.asus_kgpe_d16_16M_vboot_tpm12 - 16MB target with vboot and TPM 1.2 configs/config.asus_kgpe_d16_16M_vboot_tpm2 - 16MB target with vboot and TPM 2.0","title":"Building manual"},{"location":"variants/asus_kgpe_d16/building-manual/#building-manual","text":"","title":"Building manual"},{"location":"variants/asus_kgpe_d16/building-manual/#building-coreboot","text":"To build coreboot image, follow the steps below: Clone the coreboot repository: git clone https://github.com/dasharo/coreboot.git -b asus_kgpe-d16/release Get the submodules: cd coreboot git submodule update --init --recursive --checkout Start docker container: docker run --rm -it -u $UID \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:0ad5fbd48d /bin/bash Inside of the container, configure and start the build process: ( docker ) cp configs/config.asus_kgpe_d16_ .config ( docker ) make olddefconfig ( docker ) make This will produce a debug binary placed in build/coreboot.rom for a 2MB flash chip. In order to build for 8MB or 16MB chip use the configs/config.asus_kgpe_d16_8M and configs/config.asus_kgpe_d16_16M respectively. Dasharo v0.1.0 for KGPE-D16 supports only 8MB target with configs/config.asus_kgpe_d16 . To flash coreboot refer to Flashing section in the hardware setup page.","title":"Building coreboot"},{"location":"variants/asus_kgpe_d16/building-manual/#other-variants","text":"Since the Dasharo v0.3.0 release the firmware comes in two more variatns: with TPM 1.2 and TPM 2.0 support. Now the possible confis to use are: configs/config.asus_kgpe_d16_vboot_tpm12 - 2MB target with vboot and TPM 1.2 configs/config.asus_kgpe_d16_vboot_tpm2 - 2MB target with vboot and TPM 2.0 configs/config.asus_kgpe_d16_8M_vboot_tpm12 - 8MB target with vboot and TPM 1.2 configs/config.asus_kgpe_d16_8M_vboot_tpm2 - 8MB target with vboot and TPM 2.0 configs/config.asus_kgpe_d16_16M_vboot_tpm12 - 16MB target with vboot and TPM 1.2 configs/config.asus_kgpe_d16_16M_vboot_tpm2 - 16MB target with vboot and TPM 2.0","title":"Other variants"},{"location":"variants/asus_kgpe_d16/fan-control/","text":"Automatic fan control for ASUS KGPE-D16 Starting from KGPE-D16 Dasharo release v0.2.0, coreboot implements automatic fan control. The feature is realized on the Nuvoton W83795 hardware monitor. Testing fan control In order to check the monitoring values of W83795, one needs to install some packages: apt-get install lm-sensors Linux kernel by default should come with w83795 module. Load it with the following command: modprobe w83795 The dmesg should contain the following message after loading the module: i2c i2c-1: Found w83795g rev. B at 0x2f w83795 1 -002f: hwmon_device_register () is deprecated. Please convert the driver to use hwmon_device_register_with_info () . To check the monitoring values execute: sensors The output should be similar to the one below: k10temp-pci-00cb Adapter: PCI adapter temp1: +36.5\u00b0C ( high = +70.0\u00b0C ) ( crit = +106.0\u00b0C, hyst = +101.0\u00b0C ) w83795g-i2c-1-2f Adapter: SMBus PIIX4 adapter at 0b20 in0: 910 .00 mV ( min = +0.90 V, max = +1.50 V ) in1: 0 .00 V ( min = +0.90 V, max = +1.50 V ) ALARM in2: 1 .53 V ( min = +1.10 V, max = +1.61 V ) in3: 22 .00 mV ( min = +1.10 V, max = +1.61 V ) ALARM in4: 1 .21 V ( min = +1.14 V, max = +1.25 V ) in5: 0 .00 V ( min = +1.14 V, max = +1.25 V ) ALARM in6: 1 .19 V ( min = +1.05 V, max = +1.25 V ) in7: 1 .82 V ( min = +1.70 V, max = +1.90 V ) in8: 1 .21 V ( min = +1.14 V, max = +1.25 V ) in9: 1 .09 V ( min = +1.05 V, max = +1.15 V ) in10: 1 .60 V ( min = +1.50 V, max = +1.63 V ) in11: 752 .00 mV ( min = +0.00 V, max = +0.01 V ) ALARM +3.3V: 3 .26 V ( min = +2.96 V, max = +3.63 V ) 3VSB: 3 .28 V ( min = +2.96 V, max = +3.63 V ) Vbat: 3 .16 V ( min = +2.70 V, max = +3.63 V ) in15: 1 .02 V ( min = +0.91 V, max = +1.08 V ) in16: 1 .55 V ( min = +1.50 V, max = +1.62 V ) fan1: 1157 RPM ( min = 329 RPM ) fan2: 0 RPM ( min = 329 RPM ) ALARM fan3: 0 RPM ( min = 329 RPM ) ALARM fan4: 0 RPM ( min = 329 RPM ) ALARM fan5: 0 RPM ( min = 329 RPM ) ALARM fan6: 0 RPM ( min = 329 RPM ) ALARM fan7: 0 RPM ( min = 329 RPM ) ALARM fan8: 0 RPM ( min = 329 RPM ) ALARM temp1: +37.2\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +90.0\u00b0C, hyst = +80.0\u00b0C ) sensor = thermal diode temp2: -62.5\u00b0C ( high = +0.0\u00b0C, hyst = +0.0\u00b0C ) ( crit = +0.0\u00b0C, hyst = +0.0\u00b0C ) sensor = thermistor temp3: -62.5\u00b0C ( high = +0.0\u00b0C, hyst = +0.0\u00b0C ) ( crit = +0.0\u00b0C, hyst = +0.0\u00b0C ) sensor = thermistor temp7: +36.8\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +90.0\u00b0C, hyst = +80.0\u00b0C ) sensor = AMD AMDSI temp8: +0.0\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +90.0\u00b0C, hyst = +80.0\u00b0C ) sensor = AMD AMDSI intrusion0: ALARM beep_enable: disabled fam15h_power-pci-00c4 Adapter: PCI adapter power1: 49 .44 W ( crit = 139 .72 W ) k10temp-pci-00c3 Adapter: PCI adapter temp1: +36.8\u00b0C ( high = +70.0\u00b0C ) ( crit = +106.0\u00b0C, hyst = +99.0\u00b0C ) The CPU temperature is indicated with k10temp and w83795g temp7 inputs and the CPU fan speed is indicated by fan1. Alternative automatic fan control If you are using a coreboot for KGPE-D16 built from 4.11 branch or earlier there is also a software option to enable automatic fan control without modifications in coreboot. In order to configure the fan control, one needs to install the following package: apt-get install fancontrol Now we need to configure the fancontrol application by generating a /etc/fancontrol file containing the relation of temperature inputs to fans. Be sure that w83795 module is loaded (you may also add the module to be loaded automatically with echo w38795 >> /etc/modules ). Execute: pwmconfig This application will lead you through the process of identifying the relation of the fans and temperatures. Simply follow the instructions printed on the console. At the end do not select save and ext, just configure all PWMs, e.g.: Select fan output to configure, or other action: 1 ) hwmon0/device/pwm1 3 ) Just quit 5 ) Show configuration 2 ) Change INTERVAL 4 ) Save and quit select ( 1 -n ) : 1 Then set up temperature correlation by selecting either k10temp or hwmon0/device/temp7_input as temperature source for the fan1 (they should report identical temperature). When finished, select Save and quit . For a single CPU - single fan configuration it should result in a file like this: INTERVAL=10 DEVPATH=hwmon0=devices/pci0000:00/0000:00:14.0/i2c-1/1-002f DEVNAME=hwmon0=w83795g FCTEMPS=hwmon0/device/pwm1=hwmon0/device/temp7_input FCFANS= hwmon0/device/pwm1=hwmon0/device/fan1_input MINTEMP=hwmon0/device/pwm1=20 MAXTEMP=hwmon0/device/pwm1=80 MINSTART=hwmon0/device/pwm1=150 MINSTOP=hwmon0/device/pwm1=0 NOTE: hwmonX may be different depending on the order of loaded modules, if loaded automatically via etc/modules it may be hwmon0, if loaded using modprobe it may be hwmon3 or hwmon4. Now that the configuration file is ready, time to start the fancontrol service: systemctl enable fancontrol systemctl start fancontrol systemctl status fancontrol \u25cf fancontrol.service - fan speed regulator Loaded: loaded ( /lib/systemd/system/fancontrol.service ; enabled ; vendor pr> Active: active ( running ) since Wed 2021 -12-08 11 :23:23 CET ; 9min ago Docs: man:fancontrol ( 8 ) man:pwmconfig ( 8 ) Main PID: 1318 ( fancontrol ) Tasks: 2 ( limit: 19153 ) Memory: 1 .3M CPU: 1 .340s CGroup: /system.slice/fancontrol.service \u251c\u25001318 /bin/bash /usr/sbin/fancontrol \u2514\u25002228 sleep 10 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : Controls hwmon0/device/fan1_input Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MINTEMP = 20 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MAXTEMP = 80 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MINSTART = 150 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MINSTOP = 0 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MINPWM = 0 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MAXPWM = 255 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : AVERAGE = 1 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : Enabling PWM on fans... Dec 08 11 :23:24 debian fancontrol [ 1318 ] : Starting automatic fan control... It should print the service is running. Now check the fan speed with sensors command from lm-sensors package (install it if you haven't done it yet). For CPU temperature of 40 Celsius degrees the fan1 speed should be a little bit lower than 3000 RPM. Note it is advised to stop and disable the fancontrol service when using Dasharo for KGPE-D16 release v0.2.0 or newer: systemctl disable fancontrol systemctl stop fancontrol Verifying fan speed adaptation To check if the fan speed adapts to the temperature you may install stress-ng : apt-get install stress-ng With the following command you may cause a 2 minutes stress on the CPUs and raise its temperature (it should hit about 70 Celsius degrees with that): stress-ng --cpu 16 --io 8 --vm 4 --vm-bytes 4G --timeout 120s --metrics Simultaneously watch the fan speed with sensors command. Example for fancontrol service: k10temp-pci-00cb Adapter: PCI adapter temp1: +52.4\u00b0C ( high = +70.0\u00b0C ) w83795g-i2c-1-2f Adapter: SMBus PIIX4 adapter at 0b20 in0: 1 .09 V ( min = +0.90 V, max = +1.50 V ) in1: 0 .00 V ( min = +0.90 V, max = +1.50 V ) ALARM in2: 1 .53 V ( min = +1.10 V, max = +1.61 V ) in3: 22 .00 mV ( min = +1.10 V, max = +1.61 V ) ALARM in4: 1 .21 V ( min = +1.14 V, max = +1.25 V ) in5: 0 .00 V ( min = +1.14 V, max = +1.25 V ) ALARM in6: 1 .20 V ( min = +1.05 V, max = +1.25 V ) in7: 1 .82 V ( min = +1.70 V, max = +1.90 V ) in8: 1 .21 V ( min = +1.14 V, max = +1.25 V ) in9: 1 .09 V ( min = +1.05 V, max = +1.15 V ) in10: 1 .59 V ( min = +1.50 V, max = +1.63 V ) +3.3V: 3 .24 V ( min = +2.96 V, max = +3.63 V ) 3VSB: 3 .28 V ( min = +2.96 V, max = +3.63 V ) Vbat: 3 .06 V ( min = +2.70 V, max = +3.63 V ) in15: 1 .01 V ( min = +0.91 V, max = +1.08 V ) in16: 1 .54 V ( min = +1.50 V, max = +1.62 V ) fan1: 4299 RPM ( min = 329 RPM ) fan2: 0 RPM ( min = 329 RPM ) ALARM fan3: 0 RPM ( min = 329 RPM ) ALARM fan4: 0 RPM ( min = 329 RPM ) ALARM fan5: 0 RPM ( min = 329 RPM ) ALARM fan6: 0 RPM ( min = 329 RPM ) ALARM fan7: 0 RPM ( min = 329 RPM ) ALARM fan8: 0 RPM ( min = 329 RPM ) ALARM temp1: +52.5\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +85.0\u00b0C, hyst = +80.0\u00b0C ) sensor = thermal diode temp7: +52.8\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +85.0\u00b0C, hyst = +80.0\u00b0C ) sensor = AMD AMDSI temp8: +0.0\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +85.0\u00b0C, hyst = +80.0\u00b0C ) sensor = AMD AMDSI intrusion0: ALARM beep_enable: disabled fam15h_power-pci-00c4 Adapter: PCI adapter power1: 141 .35 W ( crit = 139 .72 W ) k10temp-pci-00c3 Adapter: PCI adapter temp1: +52.9\u00b0C ( high = +70.0\u00b0C ) For the software method with fancontrol service the fan speed adapts pretty quickly, but when using the automatic fan control from Dasharo release the spin up/down time is longer. coreboot configures the W83795 in Thermal Cruise mode which automatically probes the CPU temperature via AMD SB TSI interface. The target temperature is set to 50 Celsius degrees which means the chip will try to keep the CPU temperature to be around 50 degrees by adapting the fan speed. Summing it up, the longer the CPU temperature exceeds 50 degrees the faster the fan will spin by slowly increasing the RPM. When the temperature is below 50 degrees for a long period of time the fan rotates with a speed of around 1000 RPM. The critical temperature is set to 90 Celsius degrees. When this point is reached the W83795 should spin up to fans to full speed.","title":"Fan Control"},{"location":"variants/asus_kgpe_d16/fan-control/#automatic-fan-control-for-asus-kgpe-d16","text":"Starting from KGPE-D16 Dasharo release v0.2.0, coreboot implements automatic fan control. The feature is realized on the Nuvoton W83795 hardware monitor.","title":"Automatic fan control for ASUS KGPE-D16"},{"location":"variants/asus_kgpe_d16/fan-control/#testing-fan-control","text":"In order to check the monitoring values of W83795, one needs to install some packages: apt-get install lm-sensors Linux kernel by default should come with w83795 module. Load it with the following command: modprobe w83795 The dmesg should contain the following message after loading the module: i2c i2c-1: Found w83795g rev. B at 0x2f w83795 1 -002f: hwmon_device_register () is deprecated. Please convert the driver to use hwmon_device_register_with_info () . To check the monitoring values execute: sensors The output should be similar to the one below: k10temp-pci-00cb Adapter: PCI adapter temp1: +36.5\u00b0C ( high = +70.0\u00b0C ) ( crit = +106.0\u00b0C, hyst = +101.0\u00b0C ) w83795g-i2c-1-2f Adapter: SMBus PIIX4 adapter at 0b20 in0: 910 .00 mV ( min = +0.90 V, max = +1.50 V ) in1: 0 .00 V ( min = +0.90 V, max = +1.50 V ) ALARM in2: 1 .53 V ( min = +1.10 V, max = +1.61 V ) in3: 22 .00 mV ( min = +1.10 V, max = +1.61 V ) ALARM in4: 1 .21 V ( min = +1.14 V, max = +1.25 V ) in5: 0 .00 V ( min = +1.14 V, max = +1.25 V ) ALARM in6: 1 .19 V ( min = +1.05 V, max = +1.25 V ) in7: 1 .82 V ( min = +1.70 V, max = +1.90 V ) in8: 1 .21 V ( min = +1.14 V, max = +1.25 V ) in9: 1 .09 V ( min = +1.05 V, max = +1.15 V ) in10: 1 .60 V ( min = +1.50 V, max = +1.63 V ) in11: 752 .00 mV ( min = +0.00 V, max = +0.01 V ) ALARM +3.3V: 3 .26 V ( min = +2.96 V, max = +3.63 V ) 3VSB: 3 .28 V ( min = +2.96 V, max = +3.63 V ) Vbat: 3 .16 V ( min = +2.70 V, max = +3.63 V ) in15: 1 .02 V ( min = +0.91 V, max = +1.08 V ) in16: 1 .55 V ( min = +1.50 V, max = +1.62 V ) fan1: 1157 RPM ( min = 329 RPM ) fan2: 0 RPM ( min = 329 RPM ) ALARM fan3: 0 RPM ( min = 329 RPM ) ALARM fan4: 0 RPM ( min = 329 RPM ) ALARM fan5: 0 RPM ( min = 329 RPM ) ALARM fan6: 0 RPM ( min = 329 RPM ) ALARM fan7: 0 RPM ( min = 329 RPM ) ALARM fan8: 0 RPM ( min = 329 RPM ) ALARM temp1: +37.2\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +90.0\u00b0C, hyst = +80.0\u00b0C ) sensor = thermal diode temp2: -62.5\u00b0C ( high = +0.0\u00b0C, hyst = +0.0\u00b0C ) ( crit = +0.0\u00b0C, hyst = +0.0\u00b0C ) sensor = thermistor temp3: -62.5\u00b0C ( high = +0.0\u00b0C, hyst = +0.0\u00b0C ) ( crit = +0.0\u00b0C, hyst = +0.0\u00b0C ) sensor = thermistor temp7: +36.8\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +90.0\u00b0C, hyst = +80.0\u00b0C ) sensor = AMD AMDSI temp8: +0.0\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +90.0\u00b0C, hyst = +80.0\u00b0C ) sensor = AMD AMDSI intrusion0: ALARM beep_enable: disabled fam15h_power-pci-00c4 Adapter: PCI adapter power1: 49 .44 W ( crit = 139 .72 W ) k10temp-pci-00c3 Adapter: PCI adapter temp1: +36.8\u00b0C ( high = +70.0\u00b0C ) ( crit = +106.0\u00b0C, hyst = +99.0\u00b0C ) The CPU temperature is indicated with k10temp and w83795g temp7 inputs and the CPU fan speed is indicated by fan1.","title":"Testing fan control"},{"location":"variants/asus_kgpe_d16/fan-control/#alternative-automatic-fan-control","text":"If you are using a coreboot for KGPE-D16 built from 4.11 branch or earlier there is also a software option to enable automatic fan control without modifications in coreboot. In order to configure the fan control, one needs to install the following package: apt-get install fancontrol Now we need to configure the fancontrol application by generating a /etc/fancontrol file containing the relation of temperature inputs to fans. Be sure that w83795 module is loaded (you may also add the module to be loaded automatically with echo w38795 >> /etc/modules ). Execute: pwmconfig This application will lead you through the process of identifying the relation of the fans and temperatures. Simply follow the instructions printed on the console. At the end do not select save and ext, just configure all PWMs, e.g.: Select fan output to configure, or other action: 1 ) hwmon0/device/pwm1 3 ) Just quit 5 ) Show configuration 2 ) Change INTERVAL 4 ) Save and quit select ( 1 -n ) : 1 Then set up temperature correlation by selecting either k10temp or hwmon0/device/temp7_input as temperature source for the fan1 (they should report identical temperature). When finished, select Save and quit . For a single CPU - single fan configuration it should result in a file like this: INTERVAL=10 DEVPATH=hwmon0=devices/pci0000:00/0000:00:14.0/i2c-1/1-002f DEVNAME=hwmon0=w83795g FCTEMPS=hwmon0/device/pwm1=hwmon0/device/temp7_input FCFANS= hwmon0/device/pwm1=hwmon0/device/fan1_input MINTEMP=hwmon0/device/pwm1=20 MAXTEMP=hwmon0/device/pwm1=80 MINSTART=hwmon0/device/pwm1=150 MINSTOP=hwmon0/device/pwm1=0 NOTE: hwmonX may be different depending on the order of loaded modules, if loaded automatically via etc/modules it may be hwmon0, if loaded using modprobe it may be hwmon3 or hwmon4. Now that the configuration file is ready, time to start the fancontrol service: systemctl enable fancontrol systemctl start fancontrol systemctl status fancontrol \u25cf fancontrol.service - fan speed regulator Loaded: loaded ( /lib/systemd/system/fancontrol.service ; enabled ; vendor pr> Active: active ( running ) since Wed 2021 -12-08 11 :23:23 CET ; 9min ago Docs: man:fancontrol ( 8 ) man:pwmconfig ( 8 ) Main PID: 1318 ( fancontrol ) Tasks: 2 ( limit: 19153 ) Memory: 1 .3M CPU: 1 .340s CGroup: /system.slice/fancontrol.service \u251c\u25001318 /bin/bash /usr/sbin/fancontrol \u2514\u25002228 sleep 10 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : Controls hwmon0/device/fan1_input Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MINTEMP = 20 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MAXTEMP = 80 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MINSTART = 150 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MINSTOP = 0 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MINPWM = 0 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : MAXPWM = 255 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : AVERAGE = 1 Dec 08 11 :23:24 debian fancontrol [ 1318 ] : Enabling PWM on fans... Dec 08 11 :23:24 debian fancontrol [ 1318 ] : Starting automatic fan control... It should print the service is running. Now check the fan speed with sensors command from lm-sensors package (install it if you haven't done it yet). For CPU temperature of 40 Celsius degrees the fan1 speed should be a little bit lower than 3000 RPM. Note it is advised to stop and disable the fancontrol service when using Dasharo for KGPE-D16 release v0.2.0 or newer: systemctl disable fancontrol systemctl stop fancontrol","title":"Alternative automatic fan control"},{"location":"variants/asus_kgpe_d16/fan-control/#verifying-fan-speed-adaptation","text":"To check if the fan speed adapts to the temperature you may install stress-ng : apt-get install stress-ng With the following command you may cause a 2 minutes stress on the CPUs and raise its temperature (it should hit about 70 Celsius degrees with that): stress-ng --cpu 16 --io 8 --vm 4 --vm-bytes 4G --timeout 120s --metrics Simultaneously watch the fan speed with sensors command. Example for fancontrol service: k10temp-pci-00cb Adapter: PCI adapter temp1: +52.4\u00b0C ( high = +70.0\u00b0C ) w83795g-i2c-1-2f Adapter: SMBus PIIX4 adapter at 0b20 in0: 1 .09 V ( min = +0.90 V, max = +1.50 V ) in1: 0 .00 V ( min = +0.90 V, max = +1.50 V ) ALARM in2: 1 .53 V ( min = +1.10 V, max = +1.61 V ) in3: 22 .00 mV ( min = +1.10 V, max = +1.61 V ) ALARM in4: 1 .21 V ( min = +1.14 V, max = +1.25 V ) in5: 0 .00 V ( min = +1.14 V, max = +1.25 V ) ALARM in6: 1 .20 V ( min = +1.05 V, max = +1.25 V ) in7: 1 .82 V ( min = +1.70 V, max = +1.90 V ) in8: 1 .21 V ( min = +1.14 V, max = +1.25 V ) in9: 1 .09 V ( min = +1.05 V, max = +1.15 V ) in10: 1 .59 V ( min = +1.50 V, max = +1.63 V ) +3.3V: 3 .24 V ( min = +2.96 V, max = +3.63 V ) 3VSB: 3 .28 V ( min = +2.96 V, max = +3.63 V ) Vbat: 3 .06 V ( min = +2.70 V, max = +3.63 V ) in15: 1 .01 V ( min = +0.91 V, max = +1.08 V ) in16: 1 .54 V ( min = +1.50 V, max = +1.62 V ) fan1: 4299 RPM ( min = 329 RPM ) fan2: 0 RPM ( min = 329 RPM ) ALARM fan3: 0 RPM ( min = 329 RPM ) ALARM fan4: 0 RPM ( min = 329 RPM ) ALARM fan5: 0 RPM ( min = 329 RPM ) ALARM fan6: 0 RPM ( min = 329 RPM ) ALARM fan7: 0 RPM ( min = 329 RPM ) ALARM fan8: 0 RPM ( min = 329 RPM ) ALARM temp1: +52.5\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +85.0\u00b0C, hyst = +80.0\u00b0C ) sensor = thermal diode temp7: +52.8\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +85.0\u00b0C, hyst = +80.0\u00b0C ) sensor = AMD AMDSI temp8: +0.0\u00b0C ( high = +70.0\u00b0C, hyst = +65.0\u00b0C ) ( crit = +85.0\u00b0C, hyst = +80.0\u00b0C ) sensor = AMD AMDSI intrusion0: ALARM beep_enable: disabled fam15h_power-pci-00c4 Adapter: PCI adapter power1: 141 .35 W ( crit = 139 .72 W ) k10temp-pci-00c3 Adapter: PCI adapter temp1: +52.9\u00b0C ( high = +70.0\u00b0C ) For the software method with fancontrol service the fan speed adapts pretty quickly, but when using the automatic fan control from Dasharo release the spin up/down time is longer. coreboot configures the W83795 in Thermal Cruise mode which automatically probes the CPU temperature via AMD SB TSI interface. The target temperature is set to 50 Celsius degrees which means the chip will try to keep the CPU temperature to be around 50 degrees by adapting the fan speed. Summing it up, the longer the CPU temperature exceeds 50 degrees the faster the fan will spin by slowly increasing the RPM. When the temperature is below 50 degrees for a long period of time the fan rotates with a speed of around 1000 RPM. The critical temperature is set to 90 Celsius degrees. When this point is reached the W83795 should spin up to fans to full speed.","title":"Verifying fan speed adaptation"},{"location":"variants/asus_kgpe_d16/firmware-update/","text":"Firmware update Following documentation describes the process of Dasharo open-source firmware update. Build flashrom Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://review.coreboot.org/flashrom.git cd flashrom Build flashrom: make sudo make install Updating Dasharo The whole bios region must be updated. flashrom -p internal -w [ path ] --ifd -i bios","title":"Firmware update"},{"location":"variants/asus_kgpe_d16/firmware-update/#firmware-update","text":"Following documentation describes the process of Dasharo open-source firmware update.","title":"Firmware update"},{"location":"variants/asus_kgpe_d16/firmware-update/#build-flashrom","text":"Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://review.coreboot.org/flashrom.git cd flashrom Build flashrom: make sudo make install","title":"Build flashrom"},{"location":"variants/asus_kgpe_d16/firmware-update/#updating-dasharo","text":"The whole bios region must be updated. flashrom -p internal -w [ path ] --ifd -i bios","title":"Updating Dasharo"},{"location":"variants/asus_kgpe_d16/hardware-matrix/","text":"Hardware configuration matrix This document describes the hardware configurations used for validation of the coreboot port on ASUS KGPE-D16 platforms. ASUS KGPE-D16 8MB Component Description Board revision 1.03G CPU AMD Opteron(TM) Processor 6282 SE CPU Cooler RAM DDR3 16GB Kingston KVR16R11D4/16 Flash memory Winbond W25Q64FV 8MB Network Local network wired connection Attached devices 1. Goodram 16GB USB stick 2. ASUS TPM-L R2.0 module (chip Infineon SLB9665 TT2.0) Power Supply 700 W ATX type power supply Power Control 1. Sonoff S20 switch 2. Goldpin cables (RTE <-> Board connection) Remote Testing Environment 1. RTE v1.0.0 (firmware v0.5.3 ) connected via RS232 2. Goldpin cables + qspimux (RTE <-> flash memory connection) TPM Infineon SLB9665 TT2.0 Standard testing procedure is performed on setup without TPM module. ASUS KGPE-D16 16MB Component Description Board revision 1.03G CPU AMD Opteron(TM) Processor 6282 SE CPU Cooler RAM DDR3 16GB Kingston KVR16R11D4/16 Flash memory Winbond W25Q128JV 16MB Network Local network wired connection Attached devices: 1. Goodram 16GB USB stick 2. ASUS TPM 1.2 Rev 1.02h module (chip Infineon SLB9635 TT 1.2) 3. Post Debug Card Power Supply 700 W ATX type power supply Power Control: 1. Sonoff S20 switch 2. Goldpin cables (RTE <-> Board connection) Remote Testing Environment 1. RTE v1.0.0 (firmware v0.5.3 ) connected via RS232 2. POMONA Clip + DIP8/SOIC8 adapter (RTE <-> flash memory connection) TPM Infineon SLB9635 TT1.2 Standard testing procedure is performed on setup without TPM module. ASUS KGPE-D16 board ports, slots, and connectors description is available in the manufacturer documentation (page 2-7).","title":"Hardware configuration matrix"},{"location":"variants/asus_kgpe_d16/hardware-matrix/#hardware-configuration-matrix","text":"This document describes the hardware configurations used for validation of the coreboot port on ASUS KGPE-D16 platforms.","title":"Hardware configuration matrix"},{"location":"variants/asus_kgpe_d16/hardware-matrix/#asus-kgpe-d16-8mb","text":"Component Description Board revision 1.03G CPU AMD Opteron(TM) Processor 6282 SE CPU Cooler RAM DDR3 16GB Kingston KVR16R11D4/16 Flash memory Winbond W25Q64FV 8MB Network Local network wired connection Attached devices 1. Goodram 16GB USB stick 2. ASUS TPM-L R2.0 module (chip Infineon SLB9665 TT2.0) Power Supply 700 W ATX type power supply Power Control 1. Sonoff S20 switch 2. Goldpin cables (RTE <-> Board connection) Remote Testing Environment 1. RTE v1.0.0 (firmware v0.5.3 ) connected via RS232 2. Goldpin cables + qspimux (RTE <-> flash memory connection) TPM Infineon SLB9665 TT2.0 Standard testing procedure is performed on setup without TPM module.","title":"ASUS KGPE-D16 8MB"},{"location":"variants/asus_kgpe_d16/hardware-matrix/#asus-kgpe-d16-16mb","text":"Component Description Board revision 1.03G CPU AMD Opteron(TM) Processor 6282 SE CPU Cooler RAM DDR3 16GB Kingston KVR16R11D4/16 Flash memory Winbond W25Q128JV 16MB Network Local network wired connection Attached devices: 1. Goodram 16GB USB stick 2. ASUS TPM 1.2 Rev 1.02h module (chip Infineon SLB9635 TT 1.2) 3. Post Debug Card Power Supply 700 W ATX type power supply Power Control: 1. Sonoff S20 switch 2. Goldpin cables (RTE <-> Board connection) Remote Testing Environment 1. RTE v1.0.0 (firmware v0.5.3 ) connected via RS232 2. POMONA Clip + DIP8/SOIC8 adapter (RTE <-> flash memory connection) TPM Infineon SLB9635 TT1.2 Standard testing procedure is performed on setup without TPM module. ASUS KGPE-D16 board ports, slots, and connectors description is available in the manufacturer documentation (page 2-7).","title":"ASUS KGPE-D16 16MB"},{"location":"variants/asus_kgpe_d16/initial-deployment/","text":"Initial deployment Initial deployment of Dasharo firmware on ASUS KGPE-D16 can be done: using DTS, manually. Initial deployment using DTS To ensure a smooth deployment process, it is recommended to use the latest version of DTS available from the releases page . Once you have obtained it, you can then proceed with following the Dasharo zero-touch initial deployment section procedure. This will help you set up Dasharo effectively and without manual intervention. Initial deployment manually Initial flashing of Dasharo firmware can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 20.04. Build flashrom Currently, the latest flashrom release lacks support for Comet Lake U internal flashing. Because of this, we need to build flashrom from source. Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://review.coreboot.org/flashrom.git cd flashrom Build flashrom: make sudo make install Reading flash contents Always prepare a backup of the current firmware image. To read from the flash and save it to a file ( backup.rom ), execute the following command: flashrom -p internal -r backup.rom Flashing Dasharo To flash Dasharo on the platform, execute the following command - replace [path] with the path to the Dasharo image you want to flash, e.g. asus_kgpe-d16_v0.3.0_2M_vboot_TPM1.2.rom . flashrom -p internal -w [ path ] This will flash the full image, including the Intel ME. The operation requires a hard reset of the platform. To perform a hard reset: Power off the platform. Note, it may not power off completely due to flashed ME. Disconnect power supply from the board when OS finishes all tasks after power off (the screen goes dark or black). The platform should power on normally now. You can connect the battery back if it was disconnected.","title":"Initial deployment"},{"location":"variants/asus_kgpe_d16/initial-deployment/#initial-deployment","text":"Initial deployment of Dasharo firmware on ASUS KGPE-D16 can be done: using DTS, manually.","title":"Initial deployment"},{"location":"variants/asus_kgpe_d16/initial-deployment/#initial-deployment-using-dts","text":"To ensure a smooth deployment process, it is recommended to use the latest version of DTS available from the releases page . Once you have obtained it, you can then proceed with following the Dasharo zero-touch initial deployment section procedure. This will help you set up Dasharo effectively and without manual intervention.","title":"Initial deployment using DTS"},{"location":"variants/asus_kgpe_d16/initial-deployment/#initial-deployment-manually","text":"Initial flashing of Dasharo firmware can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 20.04.","title":"Initial deployment manually"},{"location":"variants/asus_kgpe_d16/overview/","text":"Overview Releases - groups information about all releases. Building manual - describes how to build Dasharo for ASUS KGPE D-16. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for ASUS KGPE D16. Firmware update - explains supported Dasharo open-source firmware update methods. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes validation scope used during Dasharo firmware validation procedure. Fan Control - describes the method of testing the automatic fan control mechanism. Hardware Setup - describes the method of enabling external flashing for ASUS KGPE-D16. SPI write protection - describes the method of setting the write protection for flash chip on ASUS KGPE-D16. TPM measured boot - describes the measured boot behaviour on ASUS KGPE D-16.","title":"Overview"},{"location":"variants/asus_kgpe_d16/overview/#overview","text":"Releases - groups information about all releases. Building manual - describes how to build Dasharo for ASUS KGPE D-16. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for ASUS KGPE D16. Firmware update - explains supported Dasharo open-source firmware update methods. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes validation scope used during Dasharo firmware validation procedure. Fan Control - describes the method of testing the automatic fan control mechanism. Hardware Setup - describes the method of enabling external flashing for ASUS KGPE-D16. SPI write protection - describes the method of setting the write protection for flash chip on ASUS KGPE-D16. TPM measured boot - describes the measured boot behaviour on ASUS KGPE D-16.","title":"Overview"},{"location":"variants/asus_kgpe_d16/recovery/","text":"Recovery Prequisitions To proceed with the recovery procedurethe backup with the vendor firmware will be necessary eg. backup.rom . Backup file should be generated before making any changes in device flash chip according to documentation in Reading flash contents section. Internal flashing If platform is booting properly it's possible to recover vendor firmware using procedure described in Flashing Dasharo section, setting path to file with vendor firmware as [path] argument.","title":"Recovery"},{"location":"variants/asus_kgpe_d16/recovery/#recovery","text":"","title":"Recovery"},{"location":"variants/asus_kgpe_d16/recovery/#prequisitions","text":"To proceed with the recovery procedurethe backup with the vendor firmware will be necessary eg. backup.rom . Backup file should be generated before making any changes in device flash chip according to documentation in Reading flash contents section.","title":"Prequisitions"},{"location":"variants/asus_kgpe_d16/recovery/#internal-flashing","text":"If platform is booting properly it's possible to recover vendor firmware using procedure described in Flashing Dasharo section, setting path to file with vendor firmware as [path] argument.","title":"Internal flashing"},{"location":"variants/asus_kgpe_d16/releases/","text":"Release Notes Following Release Notes describe status of Open Source Firmware development for ASUS KGPE-D16. For details about our release process please read Dasharo Standard Release Process . Subscribe to Release Newsletter Feel free to contact us on our Matrix Dasharo space . Test results for this platform can be found here . v0.4.0 - 2022-09-12 Test results for this release can be found here . Changed ACPI cleanup Added missing PCI bridge initialization Fixed KGPE-D16 can not boot with a GPU connected Configs for platforms without TPM Bugs in DQS timing (kudos to Mike Rothfuss) Known issues Booting from recovery doesn't work Fan controller gets stuck at 100% FreeBSD serial output is broken Linux kernel panic on booting USB media Builds are not reproducible Binaries asus_kgpe-d16_v0.4.0_16M_vboot_notpm.rom sha256 sha256.sig asus_kgpe-d16_v0.4.0_16M_vboot_tpm12.rom sha256 sha256.sig asus_kgpe-d16_v0.4.0_16M_vboot_tpm2.rom sha256 sha256.sig asus_kgpe-d16_v0.4.0_8M_vboot_notpm.rom sha256 sha256.sig asus_kgpe-d16_v0.4.0_8M_vboot_tpm12.rom sha256 sha256.sig asus_kgpe-d16_v0.4.0_8M_vboot_tpm2.rom sha256 sha256.sig asus_kgpe-d16_v0.4.0_vboot_notpm.rom sha256 sha256.sig asus_kgpe-d16_v0.4.0_vboot_tpm12.rom sha256 sha256.sig asus_kgpe-d16_v0.4.0_vboot_tpm2.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 03aef28f1613 revision cef95aaa SeaBIOS based on rel-1.14.0 revision 155821a1 v0.3.0 - 2021-12-16 Added TPM support vboot support (see how to sign and protect the image here ) build targets for vboot with measured boot using TPM 1.2 and TPM 2.0 Fixed cmos.layout being incorrectly mapped from RW CBFS during coreboot tables generation CC6 storage area being incorrectly included in cbmem top calculations ACPI DSDT LPC device name which caused TPM to be undetected by OS SPI controller driver sometimes dropping bytes sent/received through SPI FIFO Binaries 2MB vboot TPM 1.2 asus_kgpe-d16_v0.3.0_2M_vboot_TPM1.2.rom sha256 sha256.sig 2MB vboot TPM 2.0 asus_kgpe-d16_v0.3.0_2M_vboot_TPM2.0.rom sha256 sha256.sig 8MB vboot TPM 1.2 asus_kgpe-d16_v0.3.0_8M_vboot_TPM1.2.rom sha256 sha256.sig 8MB vboot TPM 2.0 asus_kgpe-d16_v0.3.0_8M_vboot_TPM2.0.rom sha256 sha256.sig 16MB vboot TPM 1.2 asus_kgpe-d16_v0.3.0_16M_vboot_TPM1.2.rom sha256 sha256.sig 16MB vboot TPM 2.0 asus_kgpe-d16_v0.3.0_16M_vboot_TPM2.0.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on 4.14 revision 67190bf SeaBIOS based on rel-1.14.0 revision 155821a1 iPXE based on 2019.3 revision ebf2eaf5 nvramcui based on 4.14 revision f1d1309f v0.2.0 - 2021-12-9 Added coreboot resource allocator v4 support Nuvoton W83795 HW monitor driver automatic fan control with W83795 platform and silicon ramstage support 2MB, 8MB and 16MB SPI flash targets SeaBIOS, iPXE and nvramcui payloads Binaries 2MB target asus_kgpe-d16_v0.2.0_2M.rom sha256 sha256.sig 8MB target asus_kgpe-d16_v0.2.0_8M.rom sha256 sha256.sig 16MB target asus_kgpe-d16_v0.2.0_16M.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on 4.14 revision 63b7cbc1 SeaBIOS based on rel-1.14.0 revision 155821a1 iPXE based on 2019.3 revision ebf2eaf5 nvramcui based on 4.14 revision 63b7cbc1 v0.1.0 - 2021-11-10 Added C bootblock support postcar stage and no CAR global migration support separated chipset and mainboard code put non-mainboard specific romstage initialization to northirdge support for relocatable ramstage with caching in CBMEM Binaries asus_kgpe-d16_v0.1.0.rom asus_kgpe-d16_v0.1.0.rom.sha256 asus_kgpe-d16_v0.1.0.rom.sha256.sig SBOM (Software Bill of Materials) coreboot based on 03aef28 revision e6af2206","title":"Releases"},{"location":"variants/asus_kgpe_d16/releases/#release-notes","text":"Following Release Notes describe status of Open Source Firmware development for ASUS KGPE-D16. For details about our release process please read Dasharo Standard Release Process . Subscribe to Release Newsletter Feel free to contact us on our Matrix Dasharo space . Test results for this platform can be found here .","title":"Release Notes"},{"location":"variants/asus_kgpe_d16/releases/#v040-2022-09-12","text":"Test results for this release can be found here .","title":"v0.4.0 - 2022-09-12"},{"location":"variants/asus_kgpe_d16/releases/#v030-2021-12-16","text":"","title":"v0.3.0 - 2021-12-16"},{"location":"variants/asus_kgpe_d16/releases/#v020-2021-12-9","text":"","title":"v0.2.0 - 2021-12-9"},{"location":"variants/asus_kgpe_d16/releases/#v010-2021-11-10","text":"","title":"v0.1.0 - 2021-11-10"},{"location":"variants/asus_kgpe_d16/setup/","text":"RTE v.0.5.3 with ASUS KGPE-D16 connection Power supply Power to the Asus KGPE-D16 is delivered by a common PC power supply. Simply connect the power supply to ATX compatible connectors on the mainboard (SSIPWR1, SSI12V1, SSI12V2). SPI BIOS SPI flash is a socketed DIP-8. There is no simple way to attach to it with any tools. That is why we have thought about the qspimux made by Felix Held which can attach to various SPI modules footprints and sockets. The DIP-8 adapter is put into the DIP-8 socket on the mainboard, which allows attaching the qspimux SPI multiplexer. The multiplexer is responsible for switching between the external SPI lines and the mainboard lines routed to the external SPI flash chip. The external flash chip is soldered on a SOIC8 adapter, which is connected to the qspimux. The connection of the RTE and qspimux is as follows: RTE header J7 pin qspimux J101 pin 1 (VCC) 2 (VCC_PROG) 2 (GND) 7 (GND) 3 (CS) 1 (CS_PROG#) 4 (SCLK) 6 (CLK_PROG) 5 (MISO) 8 (IO0_DI_PROG) 6 (MOSI) 3 (IO1_DO_PROG) 7 (NC) Not connected 8 (NC) Not connected Additionally, one has to tie the IO3_HOLD_PROG (qspimux pin 4) high, so connect it to the 3.3V permanently. Another additional GPIO is required to control the routing of SPI lines. The MUX_SEL (qspimux pin 9) decides whether the programmer is allowed to access the SPI flash or the mainboard. One more GPIO is used to control state of #WP of the flash chip by connecting GPIO to IO2_WP_PROG. The proposed connections used: RTE GPIO400 to control MUX_SEL RTE GPIO401 to control IO3_HOLD_PROG RTE GPIO402 to control IO2_WP_PROG Simple flashing script looks as follows: # select flash <-> programmer echo \"0\" > /sys/class/gpio/gpio400/value # deassert SPI HOLD# echo \"1\" > /sys/class/gpio/gpio401/value flashrom -w firmware.bin -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 # select flash <-> board echo \"1\" > /sys/class/gpio/gpio400/value Controlling state of #WP: # configure direction of the pin echo \"out\" > /sys/class/gpio/gpio402/direction # deassert WP pin to disable hardware protection of status registers echo \"1\" > /sys/class/gpio/gpio402/value # assert WP pin to enable hardware protection of status registers echo \"0\" > /sys/class/gpio/gpio402/value RTE header J10 pin qspimux J101 pin 1 (GPIO400) 9 (MUX_SEL) 2 (GPIO401) 4 (IO3_HOLD_PROG) 3 (GPIO402) 5 (IO2_WP_PROG) qspimux schematic is available here Serial Asus KGPE-D16 has a DB9 serial connector for the debug UART. Connect it to the RTE via RS232 DB9 cable. TPM Asus KGPE-D16 has an LPC header for TPM or debugging. Since there is no other option to connect a TPM, we use the header for that purpose. IMPORTANT: Use only TPM modules which match their pinout with the board's header! Using a spider web connection degrades the signal quality to the point where CPU cannot properly talk to TPM via LPC bus. Tested with PC Engines TPM module and failed to succeed this way. Designing and producing proper TPM header and/or reliable adapter, could solve this problem. The TwPM project could help here in the future. TPM modules that were tested and verified to work in 3mdeb lab with coreboot: ASUS TPM-L R2.0 module (chip Infineon SLB9665 TT 2.0) ASUS TPM 1.2 Rev 1.02h module (chip Infineon SLB9635 TT 1.2) Power management Asus KGPE-D16 provides a front panel pin header (PANEL1): RTE header J11 pin Asus KGPE-D16 8 (OC buffer output) PANEL1 pin 11 (PWR) 9 (OC buffer output) PANEL1 pin 17 (RESET) Additionally, connect one of the PANEL1 ground pins to one of the ground pins on RTE. Manunal For more details about the KGPE-D16, refer to the manual . Theory of operation Flashing There are two RTEs connected to two Asus KGPE-D16 boards: 192.168.20.15 192.168.4.111 Both boards are equipped with the qspimux and a replaced flash chip (Winbond W25Q64FV 8MB). The flash chip is attached to the qspimux with an adapter available with qspimux. Flashing may be done via the commands shown earlier or the flash script which is present in the root directory of the RTE: ./flash.sh coreboot.rom The script will automatically power off the board and update flash chip contents using flashrom. After the operation is finished the routing of SPI signals is restored to the platform. The flash chip adapter In order to provide an easy way to protect the SPI flash chip one may use a DIP-8 to SOIC-8 adapter with a special long pin header for WP pin jumper. It allows to use a SOIC-8 packaged flash in the DIP-8 socket and easily place a jumper to protect the flash. In order to assembly the adapter you will need the target SPI flash chip (we use either Winbond W25Q64FV (8MB) or W25Q128JV (16MB)), male pin headers 2.54 mm pitch (6 pins) male long pin headers 2.54 mm pitch (2 pins) for the WP jumper SOIC-8 to DIP-8 adapter soldering station and the solder The build shall look like this: Such adapters are now available in our online shop for purchase. For more details how to enable SPI flash protection refer to SPI Flash protection page . Power management RTE can control the power of the board with the RteCtrl command-line application, or with the web GUI ( RteCtrl ) available at RTE's IP address port 8000. Possible commands are: ./RteCtrl -pon # power on the platform ./RteCtrl -poff # force 5seconds power button power off ./RteCtrl -reset # briefly assert platform reset pin to perform reset It is also possible to control the ATX power supply by disconnecting it from the power socket. For this special purpose, Sonoff S20 is used to remotely control the power socket activity. Sonoff IP to RTE IP mapping: RTE IP 192.168.20.15 - Sonoff IP 192.168.4.125 RTE IP 192.168.4.111 - Sonoff IP 192.168.4.146 Sonoffs respond to rest API requests to enable or disable the power socket. Shell scripts have been added to RTE root directories to ease the control of power of the KGPE-D16 platform: #!/bin/bash SONOFF_IP = 192 .168.4.125 if [[ \" $1 \" == \"off\" ]] ; then wget -q -O - http:// $SONOFF_IP /switch/sonoff_s20_relay/turn_off --method = POST elif [[ \" $1 \" == \"on\" ]] ; then wget -q -O - http:// $SONOFF_IP /switch/sonoff_s20_relay/turn_on --method = POST elif [[ \" $1 \" == \"show\" ]] ; then wget -q -O - http:// $SONOFF_IP /switch/sonoff_s20_relay echo -e '\\n' else echo -e \"\\$1 == on|off|show|toggle\\nEdit this script to set the sonoff ip.\" echo -e 'Current state:' wget -q -O - http:// $SONOFF_IP /switch/sonoff_s20_relay echo -e '\\n' fi To turn off the power from the platform ./sonoff.sh off and to turn it on ./sonoff.sh on . Invoking the script without any argument will print the current state of the switch. Serial console access A serial port is very useful in debugging and as a remote console of the system on the platform. The serial port of KGPE-D16 is connected to the RTE's serial port which can be accessed on RTE with /dev/ttyS1 . One may use minicom directly or take advantage of the ser2net service running on RTE which exposes the serial port over the network. The serial port can be accessed remotely like this telnet RTE_IP 13541 , e.g.: telnet 192 .168.20.15 13541 Demo A short demo presenting RTE capabilities with KGPE-D16: Remote access If you are interested in developing coreboot on KGPE-D16 and have some spare time, there is a possibility to obtain access to the hardware. Drop us an email to leads@3mdeb.com with a request. Newsletter If you are interested in this project, you can subscribe to the Dasharo KGPE-D16 Newsletter . If you are interested in the Dasharo in general, you are welcome to subscribe to the Dasharo Newsletter . Gallery","title":"Hardware setup"},{"location":"variants/asus_kgpe_d16/setup/#rte-v053-with-asus-kgpe-d16-connection","text":"","title":"RTE v.0.5.3 with ASUS KGPE-D16 connection"},{"location":"variants/asus_kgpe_d16/setup/#power-supply","text":"Power to the Asus KGPE-D16 is delivered by a common PC power supply. Simply connect the power supply to ATX compatible connectors on the mainboard (SSIPWR1, SSI12V1, SSI12V2).","title":"Power supply"},{"location":"variants/asus_kgpe_d16/setup/#spi","text":"BIOS SPI flash is a socketed DIP-8. There is no simple way to attach to it with any tools. That is why we have thought about the qspimux made by Felix Held which can attach to various SPI modules footprints and sockets. The DIP-8 adapter is put into the DIP-8 socket on the mainboard, which allows attaching the qspimux SPI multiplexer. The multiplexer is responsible for switching between the external SPI lines and the mainboard lines routed to the external SPI flash chip. The external flash chip is soldered on a SOIC8 adapter, which is connected to the qspimux. The connection of the RTE and qspimux is as follows: RTE header J7 pin qspimux J101 pin 1 (VCC) 2 (VCC_PROG) 2 (GND) 7 (GND) 3 (CS) 1 (CS_PROG#) 4 (SCLK) 6 (CLK_PROG) 5 (MISO) 8 (IO0_DI_PROG) 6 (MOSI) 3 (IO1_DO_PROG) 7 (NC) Not connected 8 (NC) Not connected Additionally, one has to tie the IO3_HOLD_PROG (qspimux pin 4) high, so connect it to the 3.3V permanently. Another additional GPIO is required to control the routing of SPI lines. The MUX_SEL (qspimux pin 9) decides whether the programmer is allowed to access the SPI flash or the mainboard. One more GPIO is used to control state of #WP of the flash chip by connecting GPIO to IO2_WP_PROG. The proposed connections used: RTE GPIO400 to control MUX_SEL RTE GPIO401 to control IO3_HOLD_PROG RTE GPIO402 to control IO2_WP_PROG Simple flashing script looks as follows: # select flash <-> programmer echo \"0\" > /sys/class/gpio/gpio400/value # deassert SPI HOLD# echo \"1\" > /sys/class/gpio/gpio401/value flashrom -w firmware.bin -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 # select flash <-> board echo \"1\" > /sys/class/gpio/gpio400/value Controlling state of #WP: # configure direction of the pin echo \"out\" > /sys/class/gpio/gpio402/direction # deassert WP pin to disable hardware protection of status registers echo \"1\" > /sys/class/gpio/gpio402/value # assert WP pin to enable hardware protection of status registers echo \"0\" > /sys/class/gpio/gpio402/value RTE header J10 pin qspimux J101 pin 1 (GPIO400) 9 (MUX_SEL) 2 (GPIO401) 4 (IO3_HOLD_PROG) 3 (GPIO402) 5 (IO2_WP_PROG) qspimux schematic is available here","title":"SPI"},{"location":"variants/asus_kgpe_d16/setup/#serial","text":"Asus KGPE-D16 has a DB9 serial connector for the debug UART. Connect it to the RTE via RS232 DB9 cable.","title":"Serial"},{"location":"variants/asus_kgpe_d16/setup/#tpm","text":"Asus KGPE-D16 has an LPC header for TPM or debugging. Since there is no other option to connect a TPM, we use the header for that purpose. IMPORTANT: Use only TPM modules which match their pinout with the board's header! Using a spider web connection degrades the signal quality to the point where CPU cannot properly talk to TPM via LPC bus. Tested with PC Engines TPM module and failed to succeed this way. Designing and producing proper TPM header and/or reliable adapter, could solve this problem. The TwPM project could help here in the future. TPM modules that were tested and verified to work in 3mdeb lab with coreboot: ASUS TPM-L R2.0 module (chip Infineon SLB9665 TT 2.0) ASUS TPM 1.2 Rev 1.02h module (chip Infineon SLB9635 TT 1.2)","title":"TPM"},{"location":"variants/asus_kgpe_d16/setup/#power-management","text":"Asus KGPE-D16 provides a front panel pin header (PANEL1): RTE header J11 pin Asus KGPE-D16 8 (OC buffer output) PANEL1 pin 11 (PWR) 9 (OC buffer output) PANEL1 pin 17 (RESET) Additionally, connect one of the PANEL1 ground pins to one of the ground pins on RTE.","title":"Power management"},{"location":"variants/asus_kgpe_d16/setup/#manunal","text":"For more details about the KGPE-D16, refer to the manual .","title":"Manunal"},{"location":"variants/asus_kgpe_d16/setup/#demo","text":"A short demo presenting RTE capabilities with KGPE-D16:","title":"Demo"},{"location":"variants/asus_kgpe_d16/setup/#newsletter","text":"If you are interested in this project, you can subscribe to the Dasharo KGPE-D16 Newsletter . If you are interested in the Dasharo in general, you are welcome to subscribe to the Dasharo Newsletter .","title":"Newsletter"},{"location":"variants/asus_kgpe_d16/setup/#gallery","text":"","title":"Gallery"},{"location":"variants/asus_kgpe_d16/spi-wp/","text":"SPI hardware write protection In order to from a Root of Trust in the firmware, e.g. in the immutable piece of firmware code for Static Root of Trust of Measurement one has to ensure the protection of this piece of code. One may achieve it by enabling Intel Boot Guard or AMD Platform Secure Boot. However these technologies may into always be available. In such case SPI hardware write protection becomes handy. Thanks to the patchset implementing write protection and OTP support in flashrom one can easily set the SPI write protection of the platform from the operating system user space. This page explain how to build the flashrom with WP and OTP support and use to to protect the coreboot's bootblock to form SRTM. Building flashrom In order to build flashrom we will need some packages and librares. For Debian based distros execute: sudo apt-get install git make binutils build-essential ca-certificates \\ libpci-dev libftdi-dev libusb-1.0-0-dev Now clone the flashrom repository and fetch the patchset: git clone https://github.com/flashrom/flashrom cd flashrom git fetch https://review.coreboot.org/flashrom refs/changes/13/59713/7 && \\ git checkout FETCH_HEAD Build flashrom: make The freshly built flashrom will be present in root directory of the repository. Flashrom write protection CLI Invoke the following command to see a list of available options for flashrom: ./flashrom --help flashrom v1.2-585-g3542afe on Linux 5 .10.0-9-amd64 ( x86_64 ) flashrom is free software, get the source code at https://flashrom.org Usage: ./flashrom [ -h | -R | -L | -p [ : ] [ -c ] ( --flash-name | --flash-size | [ -E | -x | ( -r | -w | -v ) ] [( -l | --ifd | --fmap | --fmap-file ) [ -i [ : ]] ... ] [ -n ] [ -N ] [ -f ])] [ -V [ V [ V ]]] [ -o ] -h | --help print this help text -R | --version print version ( release ) -r | --read read flash and save to -w | --write write or the content provided on the standard input to flash -v | --verify verify flash against or the content provided on the standard input -E | --erase erase flash memory -V | --verbose more verbose output -c | --chip probe only for specified flash chip -f | --force force specific operations ( see man page ) -n | --noverify don ' t auto-verify -N | --noverify-all verify included regions only ( cf. -i ) -x | --extract extract regions to files -l | --layout read ROM layout from --wp-disable disable write protection --wp-enable enable write protection --wp-list list supported write protection ranges --wp-status show write protection status --wp-range = , set write protection range ( use --wp-range = 0 ,0 to unprotect the entire flash ) --wp-region set write protection region --otp-status print information about OTP regions --otp-region OTP region number ( base 1 ) to operate on --otp-read read OTP region and save it to --otp-write write to OTP region --otp-erase erase OTP region --otp-lock lock OTP region --flash-name read out the detected flash name --flash-size read out the detected flash size --fmap read ROM layout from fmap embedded in ROM --fmap-file read ROM layout from fmap in --ifd read layout from an Intel Firmware Descriptor -i | --image [ : ] only read/write image from layout ( optionally with data from ) -o | --output log output to --flash-contents assume flash contents to be -L | --list-supported print supported devices -p | --programmer [ : ] specify the programmer device. One of internal, dummy, nic3com, nicrealtek, gfxnvidia, raiden_debug_spi, drkaiser, satasii, atavia, it8212, ft2232_spi, serprog, buspirate_spi, dediprog, developerbox, rayer_spi, pony_spi, nicintel, nicintel_spi, nicintel_eeprom, ogp_spi, satamv, linux_mtd, linux_spi, usbblaster_spi, pickit2_spi, ch341a_spi, digilent_spi, stlinkv3_spi. You can specify one of -h, -R, -L, -E, -r, -w, -v or no operation. If no operation is specified, flashrom will only probe for flash chips. We will use only a few of those options to set the protection on the coreboot's bootblock. We protect the bootblock only, since it is the stage responsible for measurements and verification of next stages. Setting flash protection using flashrom NOTE: be sure to update the firmware first before proceeding! Estimating bootblock size and protection range First let's see how much space we need to protect. Take your coreboot.rom file and use cbfstool to show its contents: cd /path/to/coreboot/build ./cbfstool coreboot.rom print FMAP REGION: COREBOOT Name Offset Type Size Comp cbfs master header 0x0 cbfs header 32 none fallback/romstage 0x80 stage 171040 none fallback/ramstage 0x29d40 stage 98703 LZMA ( 229532 decompressed ) config 0x41f40 raw 709 none revision 0x42240 raw 723 none build_info 0x42540 raw 101 none fallback/dsdt.aml 0x42600 raw 7055 none cmos.default 0x441c0 cmos_default 256 none cmos_layout.bin 0x44300 cmos_layout 3676 none fallback/postcar 0x451c0 stage 21216 none img/nvramcui 0x4a500 simple elf 70630 none fallback/payload 0x5b940 simple elf 69936 none payload_config 0x6cac0 raw 1621 none payload_revision 0x6d140 raw 237 none pci8086,10d3.rom 0x6d280 raw 82944 none etc/sercon-port 0x816c0 raw 8 none ( empty ) 0x81700 null 8128932 none bootblock 0xffcac0 bootblock 13056 none The bootblock is taking slightly more than 12KB of space on the bottom of the flash. Converting 12KB to hex would be equal to 0x3000 but we must cover a little bit more than that. Let's see what protection ranges are available for the chip (running from the tagret machine to be protected): ./flashrom -p internal --wp-list ... Available write protection ranges: start = 0x00000000 length = 0x00000000 ( none ) start = 0x00000000 length = 0x00001000 ( lower 1 /2048 ) start = 0x007ff000 length = 0x00001000 ( upper 1 /2048 ) start = 0x00000000 length = 0x00002000 ( lower 1 /1024 ) start = 0x007fe000 length = 0x00002000 ( upper 1 /1024 ) start = 0x00000000 length = 0x00004000 ( lower 1 /512 ) start = 0x007fc000 length = 0x00004000 ( upper 1 /512 ) start = 0x00000000 length = 0x00008000 ( lower 1 /256 ) start = 0x007f8000 length = 0x00008000 ( upper 1 /256 ) start = 0x00000000 length = 0x00020000 ( lower 1 /64 ) start = 0x007e0000 length = 0x00020000 ( upper 1 /64 ) start = 0x00000000 length = 0x00040000 ( lower 1 /32 ) start = 0x007c0000 length = 0x00040000 ( upper 1 /32 ) start = 0x00000000 length = 0x00080000 ( lower 1 /16 ) start = 0x00780000 length = 0x00080000 ( upper 1 /16 ) start = 0x00000000 length = 0x00100000 ( lower 1 /8 ) start = 0x00700000 length = 0x00100000 ( upper 1 /8 ) start = 0x00000000 length = 0x00200000 ( lower 1 /4 ) start = 0x00600000 length = 0x00200000 ( upper 1 /4 ) start = 0x00000000 length = 0x00400000 ( lower 1 /2 ) start = 0x00400000 length = 0x00400000 ( upper 1 /2 ) start = 0x00000000 length = 0x00600000 ( lower 3 /4 ) start = 0x00200000 length = 0x00600000 ( upper 3 /4 ) start = 0x00000000 length = 0x00700000 ( lower 7 /8 ) start = 0x00100000 length = 0x00700000 ( upper 7 /8 ) start = 0x00000000 length = 0x00780000 ( lower 15 /16 ) start = 0x00080000 length = 0x00780000 ( upper 15 /16 ) start = 0x00000000 length = 0x007c0000 ( lower 31 /32 ) start = 0x00040000 length = 0x007c0000 ( upper 31 /32 ) start = 0x00000000 length = 0x007e0000 ( lower 63 /64 ) start = 0x00020000 length = 0x007e0000 ( upper 63 /64 ) start = 0x00000000 length = 0x007f8000 ( lower 255 /256 ) start = 0x00008000 length = 0x007f8000 ( upper 255 /256 ) start = 0x00000000 length = 0x007fc000 ( lower 511 /512 ) start = 0x00004000 length = 0x007fc000 ( upper 511 /512 ) start = 0x00000000 length = 0x007fe000 ( lower 1023 /1024 ) start = 0x00002000 length = 0x007fe000 ( upper 1023 /1024 ) start = 0x00000000 length = 0x007ff000 ( lower 2047 /2048 ) start = 0x00001000 length = 0x007ff000 ( upper 2047 /2048 ) start = 0x00000000 length = 0x00800000 ( all ) The output abvoe comes from Winbond W25Q64FV, a 8MB chip. Bootblock is always mapped to the bottom of the flash. 1MB is equal to 0x100000 so 8MB would be 0x800000. We need at least 0x4000 (16KB) to be protected starting at the bottom of the flash. And fortunately we have found our best match: start=0x007fc000 length=0x00004000 (upper 1/512) . Clearing SPI write protection Now that we have selected the desired range to protect, it is time to check the current protection status: ./flashrom -p internal --wp-status ... WP config bits: SRP1 = 0 SRP0 = 0 CMP = 0 SEC = 0 TB = 0 BP2 = 0 BP1 = 0 BP0 = 0 Protection range: start = 0x00000000 length = 0x00000000 ( none ) Protection mode: disabled The protection range should be set to zeros and all WP config bits should be cleared. If you see some bits were not cleared, ensure the WP pin jumper on the flash is not placed and invoke: ./flashrom -p internal --wp-disable ./flashrom -p internal --wp-range = 0 ,0 now that we have a clear state of the flash protection we may proceed with enabling the right range. Setting protection range Copy the range base and length and invoke: ./flashrom -p internal --wp-range = 0x007fc000,0x00004000 Setting SPI status register protection Flashrom should report Sucessfully set the requested protection range. . Now set the status register protection so the range protection cannot be changed: ./flashrom -p internal --wp-enable Flashrom should report Sucessfully set the requested mode. . Verifying SPI write protection To check whether the settings are desired invoke: ./flashrom -p internal --wp-status ... WP config bits: SRP1 = 0 SRP0 = 1 CMP = 0 SEC = 1 TB = 0 BP2 = 0 BP1 = 1 BP0 = 1 Protection range: start = 0x007fc000 length = 0x00004000 ( upper 1 /512 ) Protection mode: hardware If it matches what you have wanted to set it is time to lock the status register protection bit (SRP0) from being changed. SRP0 protects the CMP, SEC, TB and BPx bits from being changed. In order to lock the SRP0 bit you have to place the jumper on the WP pin and tie it to ground (GND). This will assert the WP pin and prevent any WP config bits from being changed. To verify it invoke: ./flashrom -p internal --wp-disable ... Writing new WP configuration failed during verification: Expected configuration: SRP1 = 0 SRP0 = 0 CMP = 0 SEC = 1 TB = 0 BP2 = 0 BP1 = 1 BP0 = 1 Actual configuration: SRP1 = 0 SRP0 = 1 CMP = 0 SEC = 1 TB = 0 BP2 = 0 BP1 = 1 BP0 = 1 You should get the above result. Changing the protection range Now if you want to reprogram the protection range, you need to take off the jumper and invoke: ./flashrom -p internal --wp-disable Now you should get Sucessfully set the requested mode. now. Check the WP status: WP config bits: SRP1 = 0 SRP0 = 0 CMP = 0 SEC = 1 TB = 0 BP2 = 0 BP1 = 1 BP0 = 1 Protection range: start = 0x007fc000 length = 0x00004000 ( upper 1 /512 ) Protection mode: disabled It must indicate Protection mode: disabled . Now you may reconfigure the range, e.g. ./flashrom -p internal --wp-range = 0x007e0000,0x00020000 And proceed with enabling protection and setting back the jumper. Setting flash protection for vboot In case when vboot is enabled the protection range must be extended in order to cover other parts of the firmware. Vboot model assumes there is a read-only copy of the coreboot and payload called recovery partition. The recovery partition is supposed to be protected with a SPI write protection. The read-only region contains the bootblock, verstage (vboot stage used to verify other firmware components) and vboot keys and all other stages required to boot the platform in case of emergency. Typically the read-only partition occupies a space that matches the possible write protected regions of the flash chip. There are also read-write partitions (up to 2) that contain an updatable copies of the coreboot and payload. Unlike read-only partitions, read-write partitions are being verified using the signatures put into the read-write partitions. vboot checks the signature and decides whether read-write partition is safe to boot, otherwise it proceeds with execution of recovery firmware. The boot flow is shown on the diagram below: In order to properly protect the firmware, one has to lock whole WP_RO region define by flashmap in coreboot. To locate the region offset and size one has to use cbfstool to retrieve layout: cd /path/to/coreboot/build ./cbfstool coreboot.rom layout -w This image contains the following sections that can be accessed with this tool: 'RW_MISC' ( read-only, size 524288 , offset 0 ) 'UNIFIED_MRC_CACHE' ( read-only, size 131072 , offset 0 ) 'RECOVERY_MRC_CACHE' ( size 65536 , offset 0 ) 'RW_MRC_CACHE' ( size 65536 , offset 65536 ) 'SMMSTORE' ( preserve, size 262144 , offset 131072 ) 'CONSOLE' ( size 131072 , offset 393216 ) 'RW_NVRAM' ( size 16384 , offset 524288 ) 'RW_SECTION_A' ( read-only, size 5750784 , offset 540672 ) 'VBLOCK_A' ( size 8192 , offset 540672 ) 'FW_MAIN_A' ( CBFS, size 5742528 , offset 548864 ) 'RW_FWID_A' ( size 64 , offset 6291392 ) 'WP_RO' ( read-only, size 2097152 , offset 6291456 ) 'RO_VPD' ( preserve, size 16384 , offset 6291456 ) 'RO_SECTION' ( read-only, size 2080768 , offset 6307840 ) 'FMAP' ( read-only, size 2048 , offset 6307840 ) 'RO_FRID' ( size 64 , offset 6309888 ) 'RO_FRID_PAD' ( size 1984 , offset 6309952 ) 'GBB' ( size 16384 , offset 6311936 ) 'COREBOOT' ( CBFS, size 2060288 , offset 6328320 ) It is at least possible to perform the read action on every section listed above. The above example shows the KGPE-D16 8MB target with vboot enabled. The WP_RO section is at offset of 6291456 bytes from the beginning of the flash and has size of 2097152 bytes. These numbers are in decimal, so one must convert them to hex. Either use an online hex converter or use the command in bash like a pro :) printf \"0x%x\\n\" 6291456 0x600000 printf \"0x%x\\n\" 2097152 0x200000 So our WP range would be 2MB at 6MB offset start=0x00600000 length=0x00200000 (upper 1/4) . But before proceeding with setting the WP range, one may want to sign the firmware with own vboot keys. The Dasharo build come by default with Google vboot developer keys, so to take advantage of vboot, one should sign the binary before flashing and setting the WP range. Refer to vboot signing . Unfortunately the utilities support only 2 RW partitions for resiging. Otherwise a whole image must be rebuilt. After custo mkeys have been used to sign the ifmrware image and the image has been flashed proceed with enalbing the protection: ./flashrom -p internal --wp-range = 0x00600000,0x00200000 Then proceed with Setting SPI status register protection and Verifying SPI write protection . At this point you should have your coreboot firmware with vboot well protected and ready to go. Place the jumper in order to prevent any changes to the configuration.","title":"SPI write protection"},{"location":"variants/asus_kgpe_d16/spi-wp/#spi-hardware-write-protection","text":"In order to from a Root of Trust in the firmware, e.g. in the immutable piece of firmware code for Static Root of Trust of Measurement one has to ensure the protection of this piece of code. One may achieve it by enabling Intel Boot Guard or AMD Platform Secure Boot. However these technologies may into always be available. In such case SPI hardware write protection becomes handy. Thanks to the patchset implementing write protection and OTP support in flashrom one can easily set the SPI write protection of the platform from the operating system user space. This page explain how to build the flashrom with WP and OTP support and use to to protect the coreboot's bootblock to form SRTM.","title":"SPI hardware write protection"},{"location":"variants/asus_kgpe_d16/spi-wp/#building-flashrom","text":"In order to build flashrom we will need some packages and librares. For Debian based distros execute: sudo apt-get install git make binutils build-essential ca-certificates \\ libpci-dev libftdi-dev libusb-1.0-0-dev Now clone the flashrom repository and fetch the patchset: git clone https://github.com/flashrom/flashrom cd flashrom git fetch https://review.coreboot.org/flashrom refs/changes/13/59713/7 && \\ git checkout FETCH_HEAD Build flashrom: make The freshly built flashrom will be present in root directory of the repository.","title":"Building flashrom"},{"location":"variants/asus_kgpe_d16/spi-wp/#flashrom-write-protection-cli","text":"Invoke the following command to see a list of available options for flashrom: ./flashrom --help flashrom v1.2-585-g3542afe on Linux 5 .10.0-9-amd64 ( x86_64 ) flashrom is free software, get the source code at https://flashrom.org Usage: ./flashrom [ -h | -R | -L | -p [ : ] [ -c ] ( --flash-name | --flash-size | [ -E | -x | ( -r | -w | -v ) ] [( -l | --ifd | --fmap | --fmap-file ) [ -i [ : ]] ... ] [ -n ] [ -N ] [ -f ])] [ -V [ V [ V ]]] [ -o ] -h | --help print this help text -R | --version print version ( release ) -r | --read read flash and save to -w | --write write or the content provided on the standard input to flash -v | --verify verify flash against or the content provided on the standard input -E | --erase erase flash memory -V | --verbose more verbose output -c | --chip probe only for specified flash chip -f | --force force specific operations ( see man page ) -n | --noverify don ' t auto-verify -N | --noverify-all verify included regions only ( cf. -i ) -x | --extract extract regions to files -l | --layout read ROM layout from --wp-disable disable write protection --wp-enable enable write protection --wp-list list supported write protection ranges --wp-status show write protection status --wp-range = , set write protection range ( use --wp-range = 0 ,0 to unprotect the entire flash ) --wp-region set write protection region --otp-status print information about OTP regions --otp-region OTP region number ( base 1 ) to operate on --otp-read read OTP region and save it to --otp-write write to OTP region --otp-erase erase OTP region --otp-lock lock OTP region --flash-name read out the detected flash name --flash-size read out the detected flash size --fmap read ROM layout from fmap embedded in ROM --fmap-file read ROM layout from fmap in --ifd read layout from an Intel Firmware Descriptor -i | --image [ : ] only read/write image from layout ( optionally with data from ) -o | --output log output to --flash-contents assume flash contents to be -L | --list-supported print supported devices -p | --programmer [ : ] specify the programmer device. One of internal, dummy, nic3com, nicrealtek, gfxnvidia, raiden_debug_spi, drkaiser, satasii, atavia, it8212, ft2232_spi, serprog, buspirate_spi, dediprog, developerbox, rayer_spi, pony_spi, nicintel, nicintel_spi, nicintel_eeprom, ogp_spi, satamv, linux_mtd, linux_spi, usbblaster_spi, pickit2_spi, ch341a_spi, digilent_spi, stlinkv3_spi. You can specify one of -h, -R, -L, -E, -r, -w, -v or no operation. If no operation is specified, flashrom will only probe for flash chips. We will use only a few of those options to set the protection on the coreboot's bootblock. We protect the bootblock only, since it is the stage responsible for measurements and verification of next stages.","title":"Flashrom write protection CLI"},{"location":"variants/asus_kgpe_d16/spi-wp/#setting-flash-protection-using-flashrom","text":"NOTE: be sure to update the firmware first before proceeding!","title":"Setting flash protection using flashrom"},{"location":"variants/asus_kgpe_d16/spi-wp/#setting-flash-protection-for-vboot","text":"In case when vboot is enabled the protection range must be extended in order to cover other parts of the firmware. Vboot model assumes there is a read-only copy of the coreboot and payload called recovery partition. The recovery partition is supposed to be protected with a SPI write protection. The read-only region contains the bootblock, verstage (vboot stage used to verify other firmware components) and vboot keys and all other stages required to boot the platform in case of emergency. Typically the read-only partition occupies a space that matches the possible write protected regions of the flash chip. There are also read-write partitions (up to 2) that contain an updatable copies of the coreboot and payload. Unlike read-only partitions, read-write partitions are being verified using the signatures put into the read-write partitions. vboot checks the signature and decides whether read-write partition is safe to boot, otherwise it proceeds with execution of recovery firmware. The boot flow is shown on the diagram below: In order to properly protect the firmware, one has to lock whole WP_RO region define by flashmap in coreboot. To locate the region offset and size one has to use cbfstool to retrieve layout: cd /path/to/coreboot/build ./cbfstool coreboot.rom layout -w This image contains the following sections that can be accessed with this tool: 'RW_MISC' ( read-only, size 524288 , offset 0 ) 'UNIFIED_MRC_CACHE' ( read-only, size 131072 , offset 0 ) 'RECOVERY_MRC_CACHE' ( size 65536 , offset 0 ) 'RW_MRC_CACHE' ( size 65536 , offset 65536 ) 'SMMSTORE' ( preserve, size 262144 , offset 131072 ) 'CONSOLE' ( size 131072 , offset 393216 ) 'RW_NVRAM' ( size 16384 , offset 524288 ) 'RW_SECTION_A' ( read-only, size 5750784 , offset 540672 ) 'VBLOCK_A' ( size 8192 , offset 540672 ) 'FW_MAIN_A' ( CBFS, size 5742528 , offset 548864 ) 'RW_FWID_A' ( size 64 , offset 6291392 ) 'WP_RO' ( read-only, size 2097152 , offset 6291456 ) 'RO_VPD' ( preserve, size 16384 , offset 6291456 ) 'RO_SECTION' ( read-only, size 2080768 , offset 6307840 ) 'FMAP' ( read-only, size 2048 , offset 6307840 ) 'RO_FRID' ( size 64 , offset 6309888 ) 'RO_FRID_PAD' ( size 1984 , offset 6309952 ) 'GBB' ( size 16384 , offset 6311936 ) 'COREBOOT' ( CBFS, size 2060288 , offset 6328320 ) It is at least possible to perform the read action on every section listed above. The above example shows the KGPE-D16 8MB target with vboot enabled. The WP_RO section is at offset of 6291456 bytes from the beginning of the flash and has size of 2097152 bytes. These numbers are in decimal, so one must convert them to hex. Either use an online hex converter or use the command in bash like a pro :) printf \"0x%x\\n\" 6291456 0x600000 printf \"0x%x\\n\" 2097152 0x200000 So our WP range would be 2MB at 6MB offset start=0x00600000 length=0x00200000 (upper 1/4) . But before proceeding with setting the WP range, one may want to sign the firmware with own vboot keys. The Dasharo build come by default with Google vboot developer keys, so to take advantage of vboot, one should sign the binary before flashing and setting the WP range. Refer to vboot signing . Unfortunately the utilities support only 2 RW partitions for resiging. Otherwise a whole image must be rebuilt. After custo mkeys have been used to sign the ifmrware image and the image has been flashed proceed with enalbing the protection: ./flashrom -p internal --wp-range = 0x00600000,0x00200000 Then proceed with Setting SPI status register protection and Verifying SPI write protection . At this point you should have your coreboot firmware with vboot well protected and ready to go. Place the jumper in order to prevent any changes to the configuration.","title":"Setting flash protection for vboot"},{"location":"variants/asus_kgpe_d16/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. coreboot base port CBP All 2. SMBIOS DMI DMI001.001, DMI002.001, DMI003.001, DMI004.001 3. coreboot fan control FAN All 4. Custom boot menu key CBK All 5. Debian Stable and Ubuntu LTS support LBT LBT001.001, LBT001.002, LBT002.001, LBT002.002 6. Network boot PXE PXE007.001 7. USB detection UDT All 8. USB booting UBT All 9. Platform suspend and resume SUSP SUSP001.001 10. Flash write protection HWP All 11. Display ports and LCD support DSP DSP004.001, DSP004.002 Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM TPM001.002 2. Verified Boot support VBO VBO006.001, VBO007.001, VBO008.001 Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. Fan control measure FNM All","title":"Test matrix"},{"location":"variants/asus_kgpe_d16/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/asus_kgpe_d16/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"About"},{"location":"variants/asus_kgpe_d16/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. coreboot base port CBP All 2. SMBIOS DMI DMI001.001, DMI002.001, DMI003.001, DMI004.001 3. coreboot fan control FAN All 4. Custom boot menu key CBK All 5. Debian Stable and Ubuntu LTS support LBT LBT001.001, LBT001.002, LBT002.001, LBT002.002 6. Network boot PXE PXE007.001 7. USB detection UDT All 8. USB booting UBT All 9. Platform suspend and resume SUSP SUSP001.001 10. Flash write protection HWP All 11. Display ports and LCD support DSP DSP004.001, DSP004.002","title":"Module: Dasharo compatibility"},{"location":"variants/asus_kgpe_d16/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM TPM001.002 2. Verified Boot support VBO VBO006.001, VBO007.001, VBO008.001","title":"Module: Dasharo security"},{"location":"variants/asus_kgpe_d16/test-matrix/#module-dasharo-performance","text":"No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. Fan control measure FNM All","title":"Module: Dasharo performance"},{"location":"variants/asus_kgpe_d16/tpm-mboot/","text":"TPM measured boot Since the Dasharo release v0.3.0 for KGPE-D16 TPM and measured boot are enabled by default. The firmware comes with 2 variants for all 3 flash size targets: vboot and TPM 1.2 measured boot for 2MB, 8MB and 16MB flash vboot and TPM 2.0 measured boot for 2MB, 8MB and 16MB flash TPM support 3mdeb office validates the following setups: KGPE-D16 8MB flash with ASUS TPM-L R2.0 (Infineon SLB9665 TT2.0). KGPE-D16 16MB flash with ASUS TPM 1.2 Rev 1.02h (Infineon SLB9635 TT1.2). Both chips are supported by coreboot. For the time being the platforms will be tested with ASUS modules until OSHW lpnTPM with open-source TPM firmware is ready. Measured boot behaviour It is also possible to have builds without vboot: TPM 1.2 measured boot only (no vboot) for 2MB, 8MB and 16MB flash TPM 2.0 measured boot only (no vboot) for 2MB, 8MB and 16MB flash These targets are for cases where only the bootblock is intended to be locked to form Static Root of Trust for Measurement. For details how to lock flash depending on the firmware variant (with or without vboot) refer to SPI hardware write protection . Note the targets without vboot do not need to have any division into read-only and read-write partitions. Everything can be contained in a single COREBOOT flashmap region like in a standard coreboot build to have the largest free space for big payloads like heads. The variants without vboot have enabled measured boot with an additional option to initialize the TPM in bootblock in order to send the measurements directly to TPM in bootblock and other early stages. Otherwise the TPM measurements are cached in memory and sent to TPM PCRs late in ramstage during TPM setup. The downside of this approach is that the memory could be corrupted in the meantime and the measurements could be faked before they are migrated to the TPM. If you check the boot logs either on serial port on via cbmem utility you should see: coreboot-asus_kgpe-d16_v0.2.0-15-g521dec6dff Wed Dec 15 11 :43:34 UTC 2021 bootblock starting ( log level: 8 ) ... CPU INIT detected 00000000 Found TPM SLB9665 TT 2 .0 by Infineon tlcl_send_startup: Startup return code is 0 TPM: Write digests cached in TCPA log to PCR TPM: Write digest for FMAP: FMAP into PCR 2 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: bootblock into PCR 2 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: cmos.default into PCR 3 tlcl_extend: response is 0 TPM: setup succeeded CBFS: Found 'fallback/romstage' @0x80 size 0x2d688 in mcache @0x0004962c FMAP: area COREBOOT found @ 200 ( 8388096 bytes ) TPM: Extending digest for FMAP: COREBOOT CBFS: fallback/romstage into PCR 2 tlcl_extend: response is 0 TPM: Digest of FMAP: COREBOOT CBFS: fallback/romstage to PCR 2 measured BS: bootblock times ( exec / console ) : total ( unknown ) / 62 ms When vboot is enabled and the verstage is being located, the bootblock measures itself and the verstage, but the measurements are sent to the TPM PCRs not in bootblock, but in verstage: coreboot-asus_kgpe-d16_v0.2.0-15-g521dec6dff Wed Dec 15 11 :43:34 UTC 2021 bootblock starting ( log level: 8 ) ... CPU INIT detected 00000000 VBOOT: Loading verstage. CBFS: Found 'fallback/verstage' @0x8c300 size 0xd848 in mcache @0x0004c8fc FMAP: area COREBOOT found @ 609000 ( 2060288 bytes ) TPM: Digest of FMAP: COREBOOT CBFS: fallback/verstage to PCR 2 logged coreboot-asus_kgpe-d16_v0.2.0-15-g521dec6dff Wed Dec 15 11 :43:34 UTC 2021 verstage starting ( log level: 8 ) ... VBNV: CMOS invalid, restoring from flash FMAP: area RW_NVRAM found @ 80000 ( 16384 bytes ) spi_init: SPI base fec10000 Manufacturer: ef SF: Detected ef 4017 with sector size 0x1000, total 0x800000 VBNV: Restore from flash failed Found TPM SLB9665 TT 2 .0 by Infineon tlcl_send_startup: Startup return code is 0 TPM: Write digests cached in TCPA log to PCR TPM: Write digest for FMAP: FMAP into PCR 2 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: bootblock into PCR 2 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: cmos.default into PCR 3 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: fallback/verstage into PCR 2 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: cmos_layout.bin into PCR 2 tlcl_extend: response is 0 TPM: setup succeeded","title":"TPM measured boot"},{"location":"variants/asus_kgpe_d16/tpm-mboot/#tpm-measured-boot","text":"Since the Dasharo release v0.3.0 for KGPE-D16 TPM and measured boot are enabled by default. The firmware comes with 2 variants for all 3 flash size targets: vboot and TPM 1.2 measured boot for 2MB, 8MB and 16MB flash vboot and TPM 2.0 measured boot for 2MB, 8MB and 16MB flash","title":"TPM measured boot"},{"location":"variants/asus_kgpe_d16/tpm-mboot/#tpm-support","text":"3mdeb office validates the following setups: KGPE-D16 8MB flash with ASUS TPM-L R2.0 (Infineon SLB9665 TT2.0). KGPE-D16 16MB flash with ASUS TPM 1.2 Rev 1.02h (Infineon SLB9635 TT1.2). Both chips are supported by coreboot. For the time being the platforms will be tested with ASUS modules until OSHW lpnTPM with open-source TPM firmware is ready.","title":"TPM support"},{"location":"variants/asus_kgpe_d16/tpm-mboot/#measured-boot-behaviour","text":"It is also possible to have builds without vboot: TPM 1.2 measured boot only (no vboot) for 2MB, 8MB and 16MB flash TPM 2.0 measured boot only (no vboot) for 2MB, 8MB and 16MB flash These targets are for cases where only the bootblock is intended to be locked to form Static Root of Trust for Measurement. For details how to lock flash depending on the firmware variant (with or without vboot) refer to SPI hardware write protection . Note the targets without vboot do not need to have any division into read-only and read-write partitions. Everything can be contained in a single COREBOOT flashmap region like in a standard coreboot build to have the largest free space for big payloads like heads. The variants without vboot have enabled measured boot with an additional option to initialize the TPM in bootblock in order to send the measurements directly to TPM in bootblock and other early stages. Otherwise the TPM measurements are cached in memory and sent to TPM PCRs late in ramstage during TPM setup. The downside of this approach is that the memory could be corrupted in the meantime and the measurements could be faked before they are migrated to the TPM. If you check the boot logs either on serial port on via cbmem utility you should see: coreboot-asus_kgpe-d16_v0.2.0-15-g521dec6dff Wed Dec 15 11 :43:34 UTC 2021 bootblock starting ( log level: 8 ) ... CPU INIT detected 00000000 Found TPM SLB9665 TT 2 .0 by Infineon tlcl_send_startup: Startup return code is 0 TPM: Write digests cached in TCPA log to PCR TPM: Write digest for FMAP: FMAP into PCR 2 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: bootblock into PCR 2 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: cmos.default into PCR 3 tlcl_extend: response is 0 TPM: setup succeeded CBFS: Found 'fallback/romstage' @0x80 size 0x2d688 in mcache @0x0004962c FMAP: area COREBOOT found @ 200 ( 8388096 bytes ) TPM: Extending digest for FMAP: COREBOOT CBFS: fallback/romstage into PCR 2 tlcl_extend: response is 0 TPM: Digest of FMAP: COREBOOT CBFS: fallback/romstage to PCR 2 measured BS: bootblock times ( exec / console ) : total ( unknown ) / 62 ms When vboot is enabled and the verstage is being located, the bootblock measures itself and the verstage, but the measurements are sent to the TPM PCRs not in bootblock, but in verstage: coreboot-asus_kgpe-d16_v0.2.0-15-g521dec6dff Wed Dec 15 11 :43:34 UTC 2021 bootblock starting ( log level: 8 ) ... CPU INIT detected 00000000 VBOOT: Loading verstage. CBFS: Found 'fallback/verstage' @0x8c300 size 0xd848 in mcache @0x0004c8fc FMAP: area COREBOOT found @ 609000 ( 2060288 bytes ) TPM: Digest of FMAP: COREBOOT CBFS: fallback/verstage to PCR 2 logged coreboot-asus_kgpe-d16_v0.2.0-15-g521dec6dff Wed Dec 15 11 :43:34 UTC 2021 verstage starting ( log level: 8 ) ... VBNV: CMOS invalid, restoring from flash FMAP: area RW_NVRAM found @ 80000 ( 16384 bytes ) spi_init: SPI base fec10000 Manufacturer: ef SF: Detected ef 4017 with sector size 0x1000, total 0x800000 VBNV: Restore from flash failed Found TPM SLB9665 TT 2 .0 by Infineon tlcl_send_startup: Startup return code is 0 TPM: Write digests cached in TCPA log to PCR TPM: Write digest for FMAP: FMAP into PCR 2 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: bootblock into PCR 2 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: cmos.default into PCR 3 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: fallback/verstage into PCR 2 tlcl_extend: response is 0 TPM: Write digest for FMAP: COREBOOT CBFS: cmos_layout.bin into PCR 2 tlcl_extend: response is 0 TPM: setup succeeded","title":"Measured boot behaviour"},{"location":"variants/dell_optiplex/building-manual/","text":"Dell OptiPlex 7010/9010 Dasharo - building manual Please read the overview page first! To build Dasharo compatible with Dell OptiPlex 7010/9010, follow the steps below: Clone the coreboot repository: git clone https://github.com/dasharo/coreboot.git cd coreboot Replace vX.Y.Z with valid version: git checkout dell_optiplex_9010_vX.Y.Z Checkout submodules: git submodule update --init --recursive --checkout Start docker container: To build Dasharo (coreboot+SeaBIOS) v0.1.0 : docker run --rm -it \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:2022-04-04_9a8d0a03db /bin/bash To build Dasharo (coreboot+UEFI) v0.1.0 : docker run --rm -it \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:2021-09-23_b0d87f753c /bin/bash To understand difference between versions please read FAQ . Inside of the container, configure and start the build process: make distclean To build Dasharo (coreboot+SeaBIOS) v0.1.0 cp configs/config.dell_optiplex_9010 .config To build Dasharo (coreboot+UEFI) v0.1.0 cp configs/config.dell_optiplex_9010 .config To build Dasharo (coreboot+SeaBIOS) v0.1.0 debug version (very verbose logging). cp configs/config.dell_optiplex_9010.debug .config To build Dasharo (coreboot+UEFI) v0.1.0 debug version (very verbose logging). cp configs/config.dell_optiplex_9010.uefi.debug .config make olddefconfig make or simply: make distclean && cp configs/CONFIG_NAME .config && make olddefconfig && make This will produce a Dasharo binary placed in build/coreboot.rom , which can be flashed in following ways, depending on your situation: To flash Dasharo first time refer to initial deployment manual . To update Dashro refer firmware update .","title":"Building manual"},{"location":"variants/dell_optiplex/building-manual/#dell-optiplex-70109010-dasharo-building-manual","text":"Please read the overview page first! To build Dasharo compatible with Dell OptiPlex 7010/9010, follow the steps below: Clone the coreboot repository: git clone https://github.com/dasharo/coreboot.git cd coreboot Replace vX.Y.Z with valid version: git checkout dell_optiplex_9010_vX.Y.Z Checkout submodules: git submodule update --init --recursive --checkout Start docker container: To build Dasharo (coreboot+SeaBIOS) v0.1.0 : docker run --rm -it \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:2022-04-04_9a8d0a03db /bin/bash To build Dasharo (coreboot+UEFI) v0.1.0 : docker run --rm -it \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ coreboot/coreboot-sdk:2021-09-23_b0d87f753c /bin/bash To understand difference between versions please read FAQ . Inside of the container, configure and start the build process: make distclean To build Dasharo (coreboot+SeaBIOS) v0.1.0 cp configs/config.dell_optiplex_9010 .config To build Dasharo (coreboot+UEFI) v0.1.0 cp configs/config.dell_optiplex_9010 .config To build Dasharo (coreboot+SeaBIOS) v0.1.0 debug version (very verbose logging). cp configs/config.dell_optiplex_9010.debug .config To build Dasharo (coreboot+UEFI) v0.1.0 debug version (very verbose logging). cp configs/config.dell_optiplex_9010.uefi.debug .config make olddefconfig make or simply: make distclean && cp configs/CONFIG_NAME .config && make olddefconfig && make This will produce a Dasharo binary placed in build/coreboot.rom , which can be flashed in following ways, depending on your situation: To flash Dasharo first time refer to initial deployment manual . To update Dashro refer firmware update .","title":"Dell OptiPlex 7010/9010 Dasharo - building manual"},{"location":"variants/dell_optiplex/faq/","text":"FAQ I see orange LED blinking, but no output, is my board broken? It means ME is broken and backup firmware would be required to recover it. Please follow additional recovery step to fix that problem. I see white LED, but no output, is my board broken? There maybe many reasons of this behavior. One may be, it boots fine but there is no visible output. It may mean firmware stuck at some point or maybe platform booting normally but all output is disabled. Debugging that requires rebuilding with CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y . Instruction for that can be found here . Is it safe to work without heatsink? It should be safe for debugging and recovery purposes. CPU after ~1min will reach temperature limits and will shutdown the platform. CPU was replaced & warm reset required loop If serial console logs contain: [ NOTE ] ME: Wrong mode : 15 [ NOTE ] ME: HFS error : 15 [ NOTE ] ME: FWS2: 0xffffffff [ NOTE ] ME: Bist in progress: 0x1 [ NOTE ] ME: ICC Status : 0x3 [ NOTE ] ME: Invoke MEBx : 0x1 [ NOTE ] ME: CPU replaced : 0x1 [ NOTE ] ME: MBP ready : 0x1 [ NOTE ] ME: MFS failure : 0x1 [ NOTE ] ME: Warm reset req : 0x1 [ NOTE ] ME: CPU repl valid : 0x1 [ NOTE ] ME: ( Reserved ) : 0x3 [ NOTE ] ME: FW update req : 0x1 [ NOTE ] ME: ( Reserved ) : 0xf [ NOTE ] ME: Current state : 0xff [ NOTE ] ME: Current PM event: 0xf [ NOTE ] ME: Progress code : 0xf [ NOTE ] CPU was replaced & warm reset required... [ INFO ] system_reset () called! It means ME is broken and backup firmware would be required to recover it. Please follow additional recovery step to fix that problem. This may happen accidentally when you flash whole 12MB BIOS binary without passing parameters about FMAP.","title":"FAQ"},{"location":"variants/dell_optiplex/faq/#faq","text":"","title":"FAQ"},{"location":"variants/dell_optiplex/faq/#i-see-orange-led-blinking-but-no-output-is-my-board-broken","text":"It means ME is broken and backup firmware would be required to recover it. Please follow additional recovery step to fix that problem.","title":"I see orange LED blinking, but no output, is my board broken?"},{"location":"variants/dell_optiplex/faq/#i-see-white-led-but-no-output-is-my-board-broken","text":"There maybe many reasons of this behavior. One may be, it boots fine but there is no visible output. It may mean firmware stuck at some point or maybe platform booting normally but all output is disabled. Debugging that requires rebuilding with CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y . Instruction for that can be found here .","title":"I see white LED, but no output, is my board broken?"},{"location":"variants/dell_optiplex/faq/#is-it-safe-to-work-without-heatsink","text":"It should be safe for debugging and recovery purposes. CPU after ~1min will reach temperature limits and will shutdown the platform.","title":"Is it safe to work without heatsink?"},{"location":"variants/dell_optiplex/faq/#cpu-was-replaced-warm-reset-required-loop","text":"If serial console logs contain: [ NOTE ] ME: Wrong mode : 15 [ NOTE ] ME: HFS error : 15 [ NOTE ] ME: FWS2: 0xffffffff [ NOTE ] ME: Bist in progress: 0x1 [ NOTE ] ME: ICC Status : 0x3 [ NOTE ] ME: Invoke MEBx : 0x1 [ NOTE ] ME: CPU replaced : 0x1 [ NOTE ] ME: MBP ready : 0x1 [ NOTE ] ME: MFS failure : 0x1 [ NOTE ] ME: Warm reset req : 0x1 [ NOTE ] ME: CPU repl valid : 0x1 [ NOTE ] ME: ( Reserved ) : 0x3 [ NOTE ] ME: FW update req : 0x1 [ NOTE ] ME: ( Reserved ) : 0xf [ NOTE ] ME: Current state : 0xff [ NOTE ] ME: Current PM event: 0xf [ NOTE ] ME: Progress code : 0xf [ NOTE ] CPU was replaced & warm reset required... [ INFO ] system_reset () called! It means ME is broken and backup firmware would be required to recover it. Please follow additional recovery step to fix that problem. This may happen accidentally when you flash whole 12MB BIOS binary without passing parameters about FMAP.","title":"CPU was replaced & warm reset required loop"},{"location":"variants/dell_optiplex/firmware-update/","text":"Firmware update Please read the overview page first! Following documentation describe process of Dasharo open-source firmware distribution update. OS booting For simplicity we recommend using network booted Dasharo Tools Suite . Dasharo (coreboot+SeaBIOS) and Dasharo (coreboot+UEFI) update Make sure a wired network cable to the device's Ethernet port Perform DTS network boot Dasharo (coreboot+SeaBIOS) While booting enter SeaBIOS menu using Esc Choose option iPXE (PCI 00:19.0) Dasharo (coreboot+UEFI) Press F7 and choose iPXE Network boot In the Dasharo Network Boot Menu, select the Dasharo Tools Suite option Enter shell using option 9) Download the Dell OptiPlex 7010/9010 Dasharo from release section or build from source . Flash it using: flashrom -p internal --ifd -i bios -w Please note that not using -i bios may lead to this issue","title":"Firmware update"},{"location":"variants/dell_optiplex/firmware-update/#firmware-update","text":"Please read the overview page first! Following documentation describe process of Dasharo open-source firmware distribution update.","title":"Firmware update"},{"location":"variants/dell_optiplex/firmware-update/#os-booting","text":"For simplicity we recommend using network booted Dasharo Tools Suite .","title":"OS booting"},{"location":"variants/dell_optiplex/hardware-matrix/","text":"Hardware configuration matrix Please read the overview page first! The tables below contain information about current components of the testing environment for Dell OptiPlex workstations available in 3mdeb testing laboratory. OptiPlex 7010 Component Description CPU Intel Core iTBD CPU Cooler GPU N/A RAM TBD HDD TBD SSD TBD Flash memory TBD Network Local network wired connection Attached devices 1. TBD USB stick Power Supply TBD Power Control 1. Sonoff TBD Remote Testing Environment 1. RTE TBD OptiPlex 9010 Component Description CPU Intel Core iTBD CPU Cooler GPU N/A RAM TBD HDD TBD SSD TBD Flash memory TBD Network Local network wired connection Attached devices 1. TBD USB stick Power Supply TBD Power Control 1. Sonoff Web Server Remote Testing Environment 1. RTE v1.0.0 (firmware v0.5.3 ) connected via RS232 OptiPlex 9010 full (miczyg) This is private setup. Component Description CPU Intel Core i7-3770 Stock Dell CPU Cooler GPU 1. Integrated Intel HD Graphics 2. Dell Radeon HD7570 low profile, half height in PCIe x16 slot RAM SK-Hynix HMT451U6BFR8A-PB x4 HDD None SSD 1. NVMe: PLEXTOR PX-512M9PeG 2. SATA SSD: SSDPR-CL100-240 3. SATA SSD: Micron_1100_MTFD Flash memory 12MB (8+4) dual SPI flash Network Local network wired connection Attached devices 1. i-tec Adapter PCI-E SATA 2x M.2 Card PCI-E/SATA in PCIe x4 slot 2. PS/2 mouse: Fujitsu M530 via USB to PS/2 adapter 3. PS/2 keyboard: Media-Tech MT122K 4. Display: Samsung SyncMaster 2233 5. Stock Dell DVD RW Power Supply Stock Dell PSU Power Control Manual Remote Testing Environment RTE v1.0.0 (firmware v0.5.3 ) connected via RS232","title":"Hardware Configuration Matrix"},{"location":"variants/dell_optiplex/hardware-matrix/#hardware-configuration-matrix","text":"Please read the overview page first! The tables below contain information about current components of the testing environment for Dell OptiPlex workstations available in 3mdeb testing laboratory.","title":"Hardware configuration matrix"},{"location":"variants/dell_optiplex/hardware-matrix/#optiplex-7010","text":"Component Description CPU Intel Core iTBD CPU Cooler GPU N/A RAM TBD HDD TBD SSD TBD Flash memory TBD Network Local network wired connection Attached devices 1. TBD USB stick Power Supply TBD Power Control 1. Sonoff TBD Remote Testing Environment 1. RTE TBD","title":"OptiPlex 7010"},{"location":"variants/dell_optiplex/hardware-matrix/#optiplex-9010","text":"Component Description CPU Intel Core iTBD CPU Cooler GPU N/A RAM TBD HDD TBD SSD TBD Flash memory TBD Network Local network wired connection Attached devices 1. TBD USB stick Power Supply TBD Power Control 1. Sonoff Web Server Remote Testing Environment 1. RTE v1.0.0 (firmware v0.5.3 ) connected via RS232","title":"OptiPlex 9010"},{"location":"variants/dell_optiplex/hardware-matrix/#optiplex-9010-full-miczyg","text":"This is private setup. Component Description CPU Intel Core i7-3770 Stock Dell CPU Cooler GPU 1. Integrated Intel HD Graphics 2. Dell Radeon HD7570 low profile, half height in PCIe x16 slot RAM SK-Hynix HMT451U6BFR8A-PB x4 HDD None SSD 1. NVMe: PLEXTOR PX-512M9PeG 2. SATA SSD: SSDPR-CL100-240 3. SATA SSD: Micron_1100_MTFD Flash memory 12MB (8+4) dual SPI flash Network Local network wired connection Attached devices 1. i-tec Adapter PCI-E SATA 2x M.2 Card PCI-E/SATA in PCIe x4 slot 2. PS/2 mouse: Fujitsu M530 via USB to PS/2 adapter 3. PS/2 keyboard: Media-Tech MT122K 4. Display: Samsung SyncMaster 2233 5. Stock Dell DVD RW Power Supply Stock Dell PSU Power Control Manual Remote Testing Environment RTE v1.0.0 (firmware v0.5.3 ) connected via RS232","title":"OptiPlex 9010 full (miczyg)"},{"location":"variants/dell_optiplex/initial-deployment/","text":"Initial deployment Please read the overview page first! Following documentation describe process of replacing original BIOS/UEFI firmware with Dasharo open-source firmware. Following procedure is supported for following models Vendor Model Dell OptiPlex 7010 SFF Dell OptiPlex 7010 DT Dell OptiPlex 9010 SFF Dell OptiPlex 9010 MT Hardware preparation Flash descriptor security override To perform any SPI NOR flash operations in the presence of ME, we have to put it in the flash descriptor security override mode. Please follow the below steps: Open the case by lifting the handle on the case. Lift the whole top cover and take it off. Now, it is time to release the disk dock. Lift the handle of the CD/DVD drive bay. Pull the CD/DVD drive bay to the CPU fan side. Move the blue disk dock handle to the CPU fan side. The screw should be at the giant hole now. Lift the whole dock to remove it. When the dock is removed, the service mode jumper should be visible. Place the jumper in the place marked by the red rectangle. It should look like this. Power on the machine. You should see a warning that the service jumper is active. Press F1 to proceed and boot to your Linux system. Initial deployment To ensure a smooth deployment process, it is recommended to use the latest version of DTS available from the releases page . Once you have obtained it, you can then proceed with following the Dasharo zero-touch initial deployment section procedure. This will help you set up Dasharo effectively and without manual intervention. Verification If everything went well (flashrom has verified the flash content), Shut down the machine, move the jumper to the original place Power on the machine. After rebooting, you should see the Dasharo Workstation logo when booting. When the logo appears, you may press Esc to select the boot device if you want to reboot from another source. From that point you can use firmware update methods to update your firmware. Troubleshooting If you do not see the logo after a few seconds, something probably went wrong, or you encountered a bug. If the LED on the power button shines white, that means the platform booted correctly. If the power button LED constantly shines in orange color, that means you have hit an error. The LED will start blinking soon. If you see the logo and after that system does not starts (black screen), please take the following steps: Put a bootable USB stick to the USB port. Restart the computer using the power button. Press the Esc key to enter a boot menu. Choose a USB drive from the list. Re-install the operating system. Common deployment problems you can find in FAQ . Ubuntu installation Ubuntu legacy installers have problems with graphical setup mode. When you see this error: graphics initialization failed Error setting up gfxboot boot:_ You need a workaround to proceed with the installation. To boot the installer, type live-install and press ENTER . It will boot to Ubuntu Live, and the installer will launch automatically. Version affected: Dasharo Workstation v0.1. If you see blinking yellow LED and black screen after reboot: 1. Unplug the power supply cable 2. Wait for the 30s 3. Plug in the power supply again (machine should start automatically) Bug reporting If you encountered an error or bug, please report it in the Dasharo Issues repo .","title":"Initial deployment"},{"location":"variants/dell_optiplex/initial-deployment/#initial-deployment","text":"Please read the overview page first! Following documentation describe process of replacing original BIOS/UEFI firmware with Dasharo open-source firmware. Following procedure is supported for following models Vendor Model Dell OptiPlex 7010 SFF Dell OptiPlex 7010 DT Dell OptiPlex 9010 SFF Dell OptiPlex 9010 MT","title":"Initial deployment"},{"location":"variants/dell_optiplex/initial-deployment/#hardware-preparation","text":"","title":"Hardware preparation"},{"location":"variants/dell_optiplex/initial-deployment/#initial-deployment_1","text":"To ensure a smooth deployment process, it is recommended to use the latest version of DTS available from the releases page . Once you have obtained it, you can then proceed with following the Dasharo zero-touch initial deployment section procedure. This will help you set up Dasharo effectively and without manual intervention.","title":"Initial deployment"},{"location":"variants/dell_optiplex/initial-deployment/#verification","text":"If everything went well (flashrom has verified the flash content), Shut down the machine, move the jumper to the original place Power on the machine. After rebooting, you should see the Dasharo Workstation logo when booting. When the logo appears, you may press Esc to select the boot device if you want to reboot from another source. From that point you can use firmware update methods to update your firmware.","title":"Verification"},{"location":"variants/dell_optiplex/initial-deployment/#troubleshooting","text":"If you do not see the logo after a few seconds, something probably went wrong, or you encountered a bug. If the LED on the power button shines white, that means the platform booted correctly. If the power button LED constantly shines in orange color, that means you have hit an error. The LED will start blinking soon. If you see the logo and after that system does not starts (black screen), please take the following steps: Put a bootable USB stick to the USB port. Restart the computer using the power button. Press the Esc key to enter a boot menu. Choose a USB drive from the list. Re-install the operating system. Common deployment problems you can find in FAQ .","title":"Troubleshooting"},{"location":"variants/dell_optiplex/overview/","text":"Overview Dell OptiPlex 7010/9010 SFF is small SOHO desktop computer sometimes used as firewall or NAS . To learn more about our motivation for the coreboot port and Dasharo compatible with Dell OptiPlex 7010/9010 SFF please check references section. If you want to build, initially deploy, update or recover your setup please check documentation sections on the left. Status Dasharo compatible with Dell OptiPlex 7010/9010 is a community-driven effort. We work on this in our free time, since we have no sponsor for this project. To address the issue we organize virtual hackathon called OptiPlex Tuesday on Dasharo Matrix almost every Tuesday. If you are interested in this project, you can consider joining the event or supporting us in other way . The most advanced code is on rel_v0.1.0 branch and the most advanced documentation related to rel_v0.1.0 branch is already available from menu on the left. This code supports only Dasharo (coreboot+SeaBIOS) , so legacy boot. UEFI is also quite ready, but we need to release v0.1.0 properly first. References Dell OptiPlex and coreboot - a story about porting cursed hardware (part 1) Dell OptiPlex and coreboot - a story about porting cursed hardware (part 2) Dasharo for Dell OptiPlex 7010 / 9010","title":"Overview"},{"location":"variants/dell_optiplex/overview/#overview","text":"Dell OptiPlex 7010/9010 SFF is small SOHO desktop computer sometimes used as firewall or NAS . To learn more about our motivation for the coreboot port and Dasharo compatible with Dell OptiPlex 7010/9010 SFF please check references section. If you want to build, initially deploy, update or recover your setup please check documentation sections on the left.","title":"Overview"},{"location":"variants/dell_optiplex/overview/#status","text":"Dasharo compatible with Dell OptiPlex 7010/9010 is a community-driven effort. We work on this in our free time, since we have no sponsor for this project. To address the issue we organize virtual hackathon called OptiPlex Tuesday on Dasharo Matrix almost every Tuesday. If you are interested in this project, you can consider joining the event or supporting us in other way . The most advanced code is on rel_v0.1.0 branch and the most advanced documentation related to rel_v0.1.0 branch is already available from menu on the left. This code supports only Dasharo (coreboot+SeaBIOS) , so legacy boot. UEFI is also quite ready, but we need to release v0.1.0 properly first.","title":"Status"},{"location":"variants/dell_optiplex/overview/#references","text":"Dell OptiPlex and coreboot - a story about porting cursed hardware (part 1) Dell OptiPlex and coreboot - a story about porting cursed hardware (part 2) Dasharo for Dell OptiPlex 7010 / 9010","title":"References"},{"location":"variants/dell_optiplex/recovery/","text":"Recovery Please read the overview page first! Following documentation describes the process of recovering hardware from brick state with RTE and Dasharo open-source firmware. Following procedure is supported for following models Vendor Model Dell OptiPlex 7010 SFF Dell OptiPlex 7010 DT Dell OptiPlex 9010 SFF Step 1: Prepare hardware To prepare hardware please follow hardware preparation procedure. Follow instruction in the video to remove heatsink: Step 2: Find SPI_1, SPI_2/SPI_3 Step 3: Connect SOIC-8 Pomona clip between RTE and target Connect SOIC-8 Pomona according to MX25L3206E datasheet . RTE J7 Pomona SOIC clip CS pin 1 (upside) MISO pin 2 (upside) GND pin 4 (upside) VCC pin 5 (downside) SCLK pin 7 (downside) MOSI pin 8 (downside) Numbers 1-4 have to be on one side and numbers 5-8 have to be on the other side of the clip. Clip on the SPI_1 chip. Match pin 1 ( CS ) of the Pomona clip with the first pin of SPI_1 chip, marked with a small dot engraved on the chip. Step 4: Connect RTE Connect J2 Orange Pi Zero system debug output Power the board and confirm it boots Please note typical convention of USB-UART converter colors is as follows black - GND red - +5V green - TX white - RX Connect terminal to RTE and read OS version: sudo minicom -b 115200 -D /dev/ttyUSB0 -o -C /tmp/minicom.cap -b 115200 sets baudrate -D /dev/ttyUSB0 points to USB-UART converter device, it can be different if you already have some devices connected or you use different operating system -o skip initialization -C /tmp/minicom.cap capture serial terminal output, if you will have problems with exercises please post this file Login using following credentials: login: root password: meta-rte Step 5: Prepare recovery binary Following procedure assume that you use recovery binary created during backup process . Backup has 12MB, so it have to be split split -b4M bios_backup_YYYYMMDD.bin Step 6: Flash 4MB (BIOS) part echo 1 > /sys/class/gpio/gpio405/value echo 1 > /sys/class/gpio/gpio406/value echo 1 > /sys/class/gpio/gpio404/value xac is third file resulting from the previous binary split, so it contains Dasharo code and data which fits into 4MB and in case of Dell OptiPlex 9010/7010 should be flashed to 4MB SPI. flashrom -w xac -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 -c \"MX25L3205D/MX25L3208D\" (Optional) Step 7: Flash 8MB (ME) part If a more serious problem occurs, like broken ME , it may be necessary to use your firmware backup and restore content of 8MB chip. Step 7a: Connect SOIC-16 Pomona clip between RTE and target Connect SOIC-16 Pomona according to MX25L6406E datasheet . RTE J7 Pomona SOIC clip VCC pin 2 (upside) CS pin 7 (upside) MISO pin 8 (upside) SCLK pin 16 (downside) MOSI pin 15 (downside) GND pin 10 (downside) Numbers 1-8 have to be on one side and numbers 9-16 have to be on the other side of the clip. Clip on the SPI_2/SPI_3 chip. Match pin 1 ( HOLD# ) of the Pomona clip with the first pin of SPI_2/SPI_3 chip, marked with a small dot engraved on the chip. Step 7b: Flash 8MB (ME) part echo 1 > /sys/class/gpio/gpio405/value echo 1 > /sys/class/gpio/gpio406/value echo 1 > /sys/class/gpio/gpio404/value Dasharo recovery Use following procedure if your 4M flash contain Dasharo open-source firmware. cat > dell_optiplex.layout < /sys/class/gpio/gpio405/value echo 1 > /sys/class/gpio/gpio406/value echo 1 > /sys/class/gpio/gpio404/value xac is third file resulting from the previous binary split, so it contains Dasharo code and data which fits into 4MB and in case of Dell OptiPlex 9010/7010 should be flashed to 4MB SPI. flashrom -w xac -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 -c \"MX25L3205D/MX25L3208D\"","title":"Step 6: Flash 4MB (BIOS) part"},{"location":"variants/dell_optiplex/recovery/#optional-step-7-flash-8mb-me-part","text":"If a more serious problem occurs, like broken ME , it may be necessary to use your firmware backup and restore content of 8MB chip.","title":"(Optional) Step 7: Flash 8MB (ME) part"},{"location":"variants/dell_optiplex/releases/","text":"Dasharo compatible with Dell OptiPlex 7010/9010 SFF Please read the overview page first! Following Release Notes describe status of Open Source Firmware development for Dell OptiPlex 7010 SFF, DT and Dell OptiPlex 9010 SFF, MT. For details about our release process please read Dasharo Standard Release Process . Subscribe to Dell OptiPlex 7010/9010 Dasharo Release Newsletter","title":"Releases"},{"location":"variants/dell_optiplex/releases/#dasharo-compatible-with-dell-optiplex-70109010-sff","text":"Please read the overview page first! Following Release Notes describe status of Open Source Firmware development for Dell OptiPlex 7010 SFF, DT and Dell OptiPlex 9010 SFF, MT. For details about our release process please read Dasharo Standard Release Process . Subscribe to Dell OptiPlex 7010/9010 Dasharo Release Newsletter","title":"Dasharo compatible with Dell OptiPlex 7010/9010 SFF"},{"location":"variants/dell_optiplex/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. Display ports and LCD support DSP DSP003.001, DSP003.003, DSP004.001, DSP004.003 3. USB HID and MSC Support USB All 4. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 5. Custom boot logo CLG All 6. Audio subsystem AUD AUD001.001, AUD004.001, AUD005.001, AUD006.001 7. NVMe support \u00b9 NVM NVM001.001, NVM001.002 8. Network boot PXE Without PXE007.001 9. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 10. Custom boot menu key CBK All 11. PCI Express ports support PEX PEX001.001 12. EC and Super I/O initialization SIO SIO001.001, SIO002.001, SIO002.002, SIO003.001, SIO004.001, SIO004.002 13. Fan control FAN FAN001.002\u00b2 1) Requires a PCIe x4 to M.2 adapter 2) Fans have to be checked manually. No support for reading the fan speed. There is also no W83795G HWM on this machine. Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM TPM001.002 2. Measured Boot support MBO All Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All","title":"Test matrix"},{"location":"variants/dell_optiplex/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/dell_optiplex/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"About"},{"location":"variants/dell_optiplex/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. Display ports and LCD support DSP DSP003.001, DSP003.003, DSP004.001, DSP004.003 3. USB HID and MSC Support USB All 4. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 5. Custom boot logo CLG All 6. Audio subsystem AUD AUD001.001, AUD004.001, AUD005.001, AUD006.001 7. NVMe support \u00b9 NVM NVM001.001, NVM001.002 8. Network boot PXE Without PXE007.001 9. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 10. Custom boot menu key CBK All 11. PCI Express ports support PEX PEX001.001 12. EC and Super I/O initialization SIO SIO001.001, SIO002.001, SIO002.002, SIO003.001, SIO004.001, SIO004.002 13. Fan control FAN FAN001.002\u00b2 1) Requires a PCIe x4 to M.2 adapter 2) Fans have to be checked manually. No support for reading the fan speed. There is also no W83795G HWM on this machine.","title":"Module: Dasharo compatibility"},{"location":"variants/dell_optiplex/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM TPM001.002 2. Measured Boot support MBO All","title":"Module: Dasharo security"},{"location":"variants/msi_z690/building-manual/","text":"Building manual Intro This documents describes the procedure for compiling Dasharo firmware compatible with MSI PRO Z690-A WIFI DDR4. Requirements Ubuntu 20.04/21.04/22.04 as a host OS was tested Internet connection Docker installed follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git, wget, unzip installed sudo apt install git unzip wget UEFIExtract installed this tool is used in the build.sh script to extract CPU microcode from the original MSI firmware sudo apt install wget wget https://github.com/LongSoft/UEFITool/releases/download/A59/UEFIExtract_NE_A59_linux_x86_64.zip unzip UEFIExtract_NE_A59_linux_x86_64.zip sudo cp ./UEFIExtract /usr/local/bin Procedure Obtain Dasharo source code for MSI PRO Z690-A WIFI DDR4: Replace the REVISION with one of the: msi_ms7d25/release for the latest released version msi_ms7d25_vVERSION (e.g. msi_ms7d25_v0.1.0 ) for the given release git clone https://github.com/Dasharo/coreboot.git -b REVISION Navigate to the source code directory and start the build process: cd coreboot ./build.sh ddr4 The resulting Dasharo firmware image will be placed at build/coreboot.rom .","title":"Building manual"},{"location":"variants/msi_z690/building-manual/#building-manual","text":"","title":"Building manual"},{"location":"variants/msi_z690/building-manual/#intro","text":"This documents describes the procedure for compiling Dasharo firmware compatible with MSI PRO Z690-A WIFI DDR4.","title":"Intro"},{"location":"variants/msi_z690/building-manual/#requirements","text":"Ubuntu 20.04/21.04/22.04 as a host OS was tested Internet connection Docker installed follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git, wget, unzip installed sudo apt install git unzip wget UEFIExtract installed this tool is used in the build.sh script to extract CPU microcode from the original MSI firmware sudo apt install wget wget https://github.com/LongSoft/UEFITool/releases/download/A59/UEFIExtract_NE_A59_linux_x86_64.zip unzip UEFIExtract_NE_A59_linux_x86_64.zip sudo cp ./UEFIExtract /usr/local/bin","title":"Requirements"},{"location":"variants/msi_z690/building-manual/#procedure","text":"Obtain Dasharo source code for MSI PRO Z690-A WIFI DDR4: Replace the REVISION with one of the: msi_ms7d25/release for the latest released version msi_ms7d25_vVERSION (e.g. msi_ms7d25_v0.1.0 ) for the given release git clone https://github.com/Dasharo/coreboot.git -b REVISION Navigate to the source code directory and start the build process: cd coreboot ./build.sh ddr4 The resulting Dasharo firmware image will be placed at build/coreboot.rom .","title":"Procedure"},{"location":"variants/msi_z690/community-test-results/","text":"Community test results About The following document contains information about additional tests which were carried out on the MSI Z690-A platform with Dasharo firmware by community members. The following list is created based on the information from the community - people which are currently using the platform with Dasharo firmware. This document contains three main sections: - Contributing in which we are describing preferred of reporting the results. - Testing method in which we are describing our preferred testing method. - Hardware Compatible List in which in a labelled manner we show all tests carried out by the community. Contributing Feel free to perform different tests and report your results via email or submit a Pull Request to Dasharo documentation repository or by using Dasharo issues repository . Testing method Platform testing might be carried out on the basis of Dasharo Test Specification . If you prefer another mechanism for checking any functionality or check any mechanism that we did not include in the documentation - describe it in the test report issue. Community test results No. Description Link to description Notes 1.","title":"Community Test Results"},{"location":"variants/msi_z690/community-test-results/#community-test-results","text":"","title":"Community test results"},{"location":"variants/msi_z690/community-test-results/#about","text":"The following document contains information about additional tests which were carried out on the MSI Z690-A platform with Dasharo firmware by community members. The following list is created based on the information from the community - people which are currently using the platform with Dasharo firmware. This document contains three main sections: - Contributing in which we are describing preferred of reporting the results. - Testing method in which we are describing our preferred testing method. - Hardware Compatible List in which in a labelled manner we show all tests carried out by the community.","title":"About"},{"location":"variants/msi_z690/community-test-results/#contributing","text":"Feel free to perform different tests and report your results via email or submit a Pull Request to Dasharo documentation repository or by using Dasharo issues repository .","title":"Contributing"},{"location":"variants/msi_z690/community-test-results/#testing-method","text":"Platform testing might be carried out on the basis of Dasharo Test Specification . If you prefer another mechanism for checking any functionality or check any mechanism that we did not include in the documentation - describe it in the test report issue.","title":"Testing method"},{"location":"variants/msi_z690/community-test-results/#community-test-results_1","text":"No. Description Link to description Notes 1.","title":"Community test results"},{"location":"variants/msi_z690/development/","text":"Dasharo compatible with MSI PRO Z690-A - development Intro This document gather various notes and documentation useful for development of Dasharo compatible with the MSI PRO Z690-A platform. Hardware connection Requirements peripherals listed in the Hardware Configuration Matrix RTE Sonoff S20 Smart Plug with custom firmware Serial debug Attach the jumpers in J16 header to enable header J18 according to the table below: Jumper position (TX) Jumper position (RX) EXT + COM EXT + COM Connect signals from the J18 header to serial receiver: RTE Msi Z690 J18 pin 1 (GND) JBD1 pin 1 (pin closer to JBAT1) J18 pin 2 (RX) JBD1 pin 2 (pin further from JBAT1) Pins on JBD1 are not described in the documentation. They have been discovered experimentally. Pay attention to the connections. Please also note that this is uni-directional communication. We can gether logs from booting, but we cannot provide input to the platform at the same time. SPI For external flashing, connect RTE with motherboard according to the table below: RTE SPI header MSI Z690-A J7 pin 1 (Vcc) JTPM1 pin 1 (SPI Power) J7 pin 2 (GND) JTPM1 pin 7 (GND) J7 pin 3 (CS) JTPM1 pin 5 (RESERVED / BIOS SPI CS pin) J7 pin 4 (SCLK) JTPM1 pin 6 (SPI Clock) J7 pin 5 (MISO) JTPM1 pin 3 (MISO) J7 pin 6 (MOSI) JTPM1 pin 4 (MOSI) JTPM1 is a 2mm pitch header, you will need 2mm to 2.54mm female-female dupont wires to connect to RTE. The JTPM1 pin5 is actually BIOS SPI CS pin (marked as reserved in the board manual). Example connection: Power control Power buttons control Connect 12V/4A power supply to RTE J13 connector to power on RTE Connect power control pins from mainboard to RTE according to the table below: JFP1 is located in the corner of the mainbaord, near SATA interface ports RTE Msi Z690 J11 pin 9 JFP1 pin 6 (PWR_ON) J11 pin 8 JFP1 pin 7 (RST) J15 pin 1 (GND) JFP1 pin 5 (GND) Power supply control Connect SeaSonic FOCUS Plus Platinum power supply unit to the mains via Sonoff S20 Smart Plug . To power control via RTE, Sonoff smart plug","title":"Development"},{"location":"variants/msi_z690/development/#dasharo-compatible-with-msi-pro-z690-a-development","text":"","title":"Dasharo compatible with MSI PRO Z690-A - development"},{"location":"variants/msi_z690/development/#intro","text":"This document gather various notes and documentation useful for development of Dasharo compatible with the MSI PRO Z690-A platform.","title":"Intro"},{"location":"variants/msi_z690/development/#hardware-connection","text":"","title":"Hardware connection"},{"location":"variants/msi_z690/faq/","text":"FAQ Why MSI Z690-A (WIFI) (DDR4) was chosen for Dasharo ? Please read this extensive analysis contributed to Intel Reddit. Why do you use the nomenclature MSI Z690-A (WIFI) (DDR4) ? This nomenclature is the result of the naming used by the producer. MSI PRO Z690-A is the nomenclature used for naming the platform with DDR5 memory slots. If the platform is also equipped with the WiFi module, its naming nomenclature will additionally include the phrase WIFI . If instead of DDR5 memory slots, the platform is equipped with DDR4 memory slots, its naming nomenclature will additionally include the phrase DDR4 . Will this work on my MSI PRO Z690-A (model with DDR5 support)? Yes, during test procedures the Dasharo firmware work has been confirmed for the DDR5 platform without WIFI. Dasharo working correctness has not been tested on MSI PRO Z690-A WIFI . However, given its similarity to the other boards, there should be no problems using Dasharo on it as well. Will this work on my MSI PRO Z690-A DDR4 ? Yes, during test procedures the Dasharo firmware work has been confirmed for the DDR4 WIFI platform. In turn, Dasharo working correctness on MSI PRO Z690-A DDR4 has been confirmed by the community. Can I safely try this on my board? If you are afraid of bricking the board and have no means of recovering from failed installation , we do not recommend trying it out until at least the v1.0.0 is released. Recovery process is not suitable for inexperienced users right now. We will be trying to make it easier, and if that happens, we may change our recommendation here. Can I destroy my hardware by installing this firmware? We give no warranty, although it is highly unlikely, provided that you use the supported board model and follow the Initial Deployment . In the worst scenario, you might \"brick\" the board, rendering it unbootable. It can be fixed by following the recovery procedure . In case of concerns, we invite you to buy the equipment directly in our online store with a subscription service, under which we perform the Dasharo installation with the latest release, and offer full support through invite-only Matrix channel. How can I know if the board is \"bricked\"? In such a case, you would get stuck with black screen on the display. There will be no beeping sounds from the buzzer as well. The only way to get some information on what's going on in that state is to use the Serial header to read out error information. What can be the reason of board \"bricking\"? The most common reason would be the fact that you DDR memory modules are not initialized properly. The other reason might be improper or interrupted installation. Please make sure to follow the Initial Deployment Manual correctly. How can I \"unbrick\" my board? Please follow the recovery procedure . Which CPUs are supported? We can say the \"supported\" one is the one that have been tested during Validation Procedure or have been tested by the community. The list of all supported CPUs is available in the CPU HCL documentation. In practice, any Alder Lake-S Processor should work. 12900KS is rather unknown at the moment, because it was released later and may require more recent microcode. Which memory modules are supported? We can say the \"supported\" one is the one that have been tested during Validation Procedure or have been tested by the community. The list of all supported memory modules is available in the Memory HCL documentation. What is the memory profile? Currently, Dasharo firmware picks the highest standard SPD Profile, no support for XMP ones. This means that on the Kingston modules it is actually working at 2400 MHz, but it is expected to work all the way to 3200 MHz. Why my GPU doesn't work on MSI PRO Z690-A (DDR4) (WIFI) ? Due to the fact, that there's no possibility to insert all available GPU drivers into the firmware, the solution in the form of the Option ROM is in use. Option ROMs are the drivers flashed in the GPUs non-volatile memory. These types of drivers can be divided into Legacy Option ROMs and EFI Option ROMs . Legacy Option ROMs are only supported on legacy BIOS, such as SeaBIOS. Legacy BIOS checks the availability of Option ROM and if its signature matches, it executes its entry point. This option ROM initializes the graphics. The only way to support Option ROM in UEFI is through CSM, which we do not have implemented. EFI Option ROMs are nothing more than EFI drivers which have the same form as the UEFI files (PE format). UEFI firmware scans the Option ROM space of the graphics card and if it finds a potential EFI Option ROM with PE signature, it executes the file. This option ROM initializes the graphics. Considering the above, the firmware might have a problem with initializing older graphics cards - UEFI standard appeared about 15 years ago. The problem might also be caused by an enabled Secure boot - because there is no certainty that EFI Option ROM is signed correctly. Which GPUs are supported? We can say the \"supported\" one is the one that have been tested during Validation Procedure or have been tested by the community. The list of all supported memory modules is available in the GPU HCL documentation. What does the obligatory Dasharo Subscripion includes? The Dasharo Bronze Subscription includes: The latest Dasharo release installed by Dasharo Team Dasharo Updates \u2013 number of updates depends on the number of Dasharo Subscriptions sold and the availability of other funding (e.g., NLNet, corporate sponsors, community donations ) Priority support for Dasharo Subscribers through invite-only Matrix channel Influence on Dasharo features roadmap \u2013 you can have a real impact on Dasharo development by direct access with the developers or premium voting on github. You will gain the access to the dedicated channels on the matrix communicator. If you wish to share your Github nickname with us, the votes cast for the features that you would like to have implemented in the future will be treated with priority, i.e. they will have a higher priority than the votes of non-subscribers. By buying this product, you support open-source firmware and Dasharo distribution. What means in warranty conditions \"No signs of customer interference...\"? Full question: \"In the Disclaimer, you wrote that one of the warranty conditions is: \"No signs of customer interference with the platform or firmware.\" How would a user modify firmware without losing the warranty? Being open source to be easy to modify, then saying \"don't touch this\" seems contradictory. How would you add an exception?\" Playing with firmware parameters can result in damaging the mainboard. Such action excludes the acceptance of the return. You can improve the Dasharo by contributing, so we can pass Dasharo Certification Program and release it in the next version.","title":"FAQ"},{"location":"variants/msi_z690/faq/#faq","text":"","title":"FAQ"},{"location":"variants/msi_z690/faq/#why-msi-z690-a-wifi-ddr4-was-chosen-for-dasharo","text":"Please read this extensive analysis contributed to Intel Reddit.","title":"Why MSI Z690-A (WIFI) (DDR4) was chosen for Dasharo ?"},{"location":"variants/msi_z690/faq/#why-do-you-use-the-nomenclature-msi-z690-a-wifi-ddr4","text":"This nomenclature is the result of the naming used by the producer. MSI PRO Z690-A is the nomenclature used for naming the platform with DDR5 memory slots. If the platform is also equipped with the WiFi module, its naming nomenclature will additionally include the phrase WIFI . If instead of DDR5 memory slots, the platform is equipped with DDR4 memory slots, its naming nomenclature will additionally include the phrase DDR4 .","title":"Why do you use the nomenclature MSI Z690-A (WIFI) (DDR4)?"},{"location":"variants/msi_z690/faq/#will-this-work-on-my-msi-pro-z690-a-model-with-ddr5-support","text":"Yes, during test procedures the Dasharo firmware work has been confirmed for the DDR5 platform without WIFI. Dasharo working correctness has not been tested on MSI PRO Z690-A WIFI . However, given its similarity to the other boards, there should be no problems using Dasharo on it as well.","title":"Will this work on my MSI PRO Z690-A (model with DDR5 support)?"},{"location":"variants/msi_z690/faq/#will-this-work-on-my-msi-pro-z690-a-ddr4","text":"Yes, during test procedures the Dasharo firmware work has been confirmed for the DDR4 WIFI platform. In turn, Dasharo working correctness on MSI PRO Z690-A DDR4 has been confirmed by the community.","title":"Will this work on my MSI PRO Z690-A DDR4?"},{"location":"variants/msi_z690/faq/#can-i-safely-try-this-on-my-board","text":"If you are afraid of bricking the board and have no means of recovering from failed installation , we do not recommend trying it out until at least the v1.0.0 is released. Recovery process is not suitable for inexperienced users right now. We will be trying to make it easier, and if that happens, we may change our recommendation here.","title":"Can I safely try this on my board?"},{"location":"variants/msi_z690/faq/#can-i-destroy-my-hardware-by-installing-this-firmware","text":"We give no warranty, although it is highly unlikely, provided that you use the supported board model and follow the Initial Deployment . In the worst scenario, you might \"brick\" the board, rendering it unbootable. It can be fixed by following the recovery procedure . In case of concerns, we invite you to buy the equipment directly in our online store with a subscription service, under which we perform the Dasharo installation with the latest release, and offer full support through invite-only Matrix channel.","title":"Can I destroy my hardware by installing this firmware?"},{"location":"variants/msi_z690/faq/#how-can-i-know-if-the-board-is-bricked","text":"In such a case, you would get stuck with black screen on the display. There will be no beeping sounds from the buzzer as well. The only way to get some information on what's going on in that state is to use the Serial header to read out error information.","title":"How can I know if the board is \"bricked\"?"},{"location":"variants/msi_z690/faq/#what-can-be-the-reason-of-board-bricking","text":"The most common reason would be the fact that you DDR memory modules are not initialized properly. The other reason might be improper or interrupted installation. Please make sure to follow the Initial Deployment Manual correctly.","title":"What can be the reason of board \"bricking\"?"},{"location":"variants/msi_z690/faq/#how-can-i-unbrick-my-board","text":"Please follow the recovery procedure .","title":"How can I \"unbrick\" my board?"},{"location":"variants/msi_z690/faq/#which-cpus-are-supported","text":"We can say the \"supported\" one is the one that have been tested during Validation Procedure or have been tested by the community. The list of all supported CPUs is available in the CPU HCL documentation. In practice, any Alder Lake-S Processor should work. 12900KS is rather unknown at the moment, because it was released later and may require more recent microcode.","title":"Which CPUs are supported?"},{"location":"variants/msi_z690/faq/#which-memory-modules-are-supported","text":"We can say the \"supported\" one is the one that have been tested during Validation Procedure or have been tested by the community. The list of all supported memory modules is available in the Memory HCL documentation.","title":"Which memory modules are supported?"},{"location":"variants/msi_z690/faq/#what-is-the-memory-profile","text":"Currently, Dasharo firmware picks the highest standard SPD Profile, no support for XMP ones. This means that on the Kingston modules it is actually working at 2400 MHz, but it is expected to work all the way to 3200 MHz.","title":"What is the memory profile?"},{"location":"variants/msi_z690/faq/#why-my-gpu-doesnt-work-on-msi-pro-z690-a-ddr4-wifi","text":"Due to the fact, that there's no possibility to insert all available GPU drivers into the firmware, the solution in the form of the Option ROM is in use. Option ROMs are the drivers flashed in the GPUs non-volatile memory. These types of drivers can be divided into Legacy Option ROMs and EFI Option ROMs . Legacy Option ROMs are only supported on legacy BIOS, such as SeaBIOS. Legacy BIOS checks the availability of Option ROM and if its signature matches, it executes its entry point. This option ROM initializes the graphics. The only way to support Option ROM in UEFI is through CSM, which we do not have implemented. EFI Option ROMs are nothing more than EFI drivers which have the same form as the UEFI files (PE format). UEFI firmware scans the Option ROM space of the graphics card and if it finds a potential EFI Option ROM with PE signature, it executes the file. This option ROM initializes the graphics. Considering the above, the firmware might have a problem with initializing older graphics cards - UEFI standard appeared about 15 years ago. The problem might also be caused by an enabled Secure boot - because there is no certainty that EFI Option ROM is signed correctly.","title":"Why my GPU doesn't work on MSI PRO Z690-A (DDR4) (WIFI)?"},{"location":"variants/msi_z690/faq/#which-gpus-are-supported","text":"We can say the \"supported\" one is the one that have been tested during Validation Procedure or have been tested by the community. The list of all supported memory modules is available in the GPU HCL documentation.","title":"Which GPUs are supported?"},{"location":"variants/msi_z690/faq/#what-does-the-obligatory-dasharo-subscripion-includes","text":"The Dasharo Bronze Subscription includes: The latest Dasharo release installed by Dasharo Team Dasharo Updates \u2013 number of updates depends on the number of Dasharo Subscriptions sold and the availability of other funding (e.g., NLNet, corporate sponsors, community donations ) Priority support for Dasharo Subscribers through invite-only Matrix channel Influence on Dasharo features roadmap \u2013 you can have a real impact on Dasharo development by direct access with the developers or premium voting on github. You will gain the access to the dedicated channels on the matrix communicator. If you wish to share your Github nickname with us, the votes cast for the features that you would like to have implemented in the future will be treated with priority, i.e. they will have a higher priority than the votes of non-subscribers. By buying this product, you support open-source firmware and Dasharo distribution.","title":"What does the obligatory Dasharo Subscripion includes?"},{"location":"variants/msi_z690/faq/#what-means-in-warranty-conditions-no-signs-of-customer-interference","text":"Full question: \"In the Disclaimer, you wrote that one of the warranty conditions is: \"No signs of customer interference with the platform or firmware.\" How would a user modify firmware without losing the warranty? Being open source to be easy to modify, then saying \"don't touch this\" seems contradictory. How would you add an exception?\" Playing with firmware parameters can result in damaging the mainboard. Such action excludes the acceptance of the return. You can improve the Dasharo by contributing, so we can pass Dasharo Certification Program and release it in the next version.","title":"What means in warranty conditions \"No signs of customer interference...\"?"},{"location":"variants/msi_z690/firmware-update/","text":"Firmware update The following documentation describes the process of Dasharo open-source firmware update. The update process may be different, depending on which firmware version is currently installed on your device. The currently installed firmware version can be checked with the following command in a Linux environment: sudo dmidecode -t bios | grep Version Alternatively, it can be checked in the BIOS Setup Menu . Prerequisites Before proceeding, ensure that the firmware protections are disabled in Dasharo Security Options . Both BIOS boot medium lock and Enable SMM BIOS write protection should be unchecked. UEFI Secure Boot must be disabled as well (uncheck Attempt Secure Boot if Current Secure Boot State does not say Disabled ). To apply changes you will need to reboot. Please use one of the following environments to perform Dasharo update: Dasharo Tools Suite (DTS) Linux distribution of your choice We recommend using the DTS. Dasharo Tools Suite The DTS allows performing automatic firmware update process, which is the recommended method. To update your firmware, follow below steps. Boot DTS using iPXE on your platform. Follow firmware update procedure described in DTS documentation. Linux distribution of your choice Linux distributions may not yet have the support for the newest chipsets in flashrom installed via package manager so building the flashrom from source may be inevitable. You may check if your flashrom supports the Z690 chipset by doing a dry run without firmware binary: sudo flashrom -p internal Example output of undetected chipset: flashrom v1.2 on Linux 5.19.0-32-generic (x86_64) flashrom is free software, get the source code at https://flashrom.org Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns). Cannot open file stream for /dev/mtd0 No DMI table found. WARNING: No chipset found. Flash detection will most likely fail. ======================================================================== You may be running flashrom on an unknown laptop. We could not detect this for sure because your vendor has not set up the SMBIOS tables correctly. Some internal buses have been disabled for safety reasons. You can enforce using all buses by adding -p internal:laptop=this_is_not_a_laptop to the command line, but please read the following warning if you are not sure. Laptops, notebooks and netbooks are difficult to support and we recommend to use the vendor flashing utility. The embedded controller (EC) in these machines often interacts badly with flashing. See the manpage and https://flashrom.org/Laptops for details. If flash is shared with the EC, erase is guaranteed to brick your laptop and write may brick your laptop. Read and probe may irritate your EC and cause fan failure, backlight failure and sudden poweroff. You have been warned. ======================================================================== No EEPROM/flash device found. Note: flashrom can never write if the flash chip isn't found automatically. It means you cannot proceed with this flashrom version and you have to remove it using your package manager. Then follow the procedure for building the right flashrom is described in Build flashrom section in the Initial deployment documentation (note the procedure describes Ubuntu case only, your package manager and package names to install may be slightly different). We recommend to use Dasharo Tools Suite . Example of good output: flashrom v1.2-1031-g6b2061b on Linux 5.19.0-32-generic (x86_64) flashrom is free software, get the source code at https://flashrom.org Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns). No DMI table found. Found chipset \"Intel Z690\". Enabling flash write... SPI Configuration is locked down. FREG0: Flash Descriptor region (0x00000000-0x00000fff) is read-write. FREG1: BIOS region (0x01000000-0x01ffffff) is read-write. FREG2: Management Engine region (0x00001000-0x003d8fff) is read-write. Enabling hardware sequencing because some important opcode is locked. OK. Found Programmer flash chip \"Opaque flash chip\" (32768 kB, Programmer-specific) on internal. No operations were specified. That means you are good to go. Migrating SMBIOS unique data (optional) Before flashing you may migrate your serial number and UUID as described in Initial deployment . Applicable to Dasharo v1.1.0 and later. Version v1.1.0 or newer Version v1.1.0 had to change the flashmap layout and requires usage of the procedure below when migrating from v1.0.0 or older. Only the RW_SECTION_A and RW_SECTION_B partitions of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w [ path ] --fmap -i RW_SECTION_A -i RW_SECTION_B To flash newer firmware the command described in the section below might be also used. But remember, in that case, all Dasharo UEFI settings will be lost. Also, the memory training procedure will have to be carried out again. Version older than v1.1.0 In this case, the whole bios region must be updated. flashrom -p internal -w [ path ] --ifd -i bios Troubleshooting Possible errors are described in the Generic deployment problems with flashrom","title":"Firmware update"},{"location":"variants/msi_z690/firmware-update/#firmware-update","text":"The following documentation describes the process of Dasharo open-source firmware update. The update process may be different, depending on which firmware version is currently installed on your device. The currently installed firmware version can be checked with the following command in a Linux environment: sudo dmidecode -t bios | grep Version Alternatively, it can be checked in the BIOS Setup Menu .","title":"Firmware update"},{"location":"variants/msi_z690/firmware-update/#prerequisites","text":"Before proceeding, ensure that the firmware protections are disabled in Dasharo Security Options . Both BIOS boot medium lock and Enable SMM BIOS write protection should be unchecked. UEFI Secure Boot must be disabled as well (uncheck Attempt Secure Boot if Current Secure Boot State does not say Disabled ). To apply changes you will need to reboot. Please use one of the following environments to perform Dasharo update: Dasharo Tools Suite (DTS) Linux distribution of your choice We recommend using the DTS.","title":"Prerequisites"},{"location":"variants/msi_z690/gpu-hcl/","text":"GPU HCL Contributing Feel free to test different graphics cards and report your results via email or submit a Pull Request to Dasharo documentation repository or by using Dasharo issues repository . If you already have reported your results and you change some hardware configuration we would appreciate an additional HCL report. HCL list GPU Hardware Compatibility List presents the GPUs tested and verified to work with Dasharo by community. The following list does not include GPU which is tested and verfied in 3mdeb laboratory - this information might be found in Hardware Matrix documentation. Legend: GPU name: the full name of GPU including vendor and model name. Memory size: total amount of GPU memory declared by vendor. Memory type: GPU's type of memory. Bandwidth: GPU's bandwidth. PCI-E Architecture: declared by producer generation of PCI-E architecture. Multi-Graphics Technology: information about support for Multi-Graphics Technology. Information about GPU might be read from GPU package or documentation. GPU name Memory size Memory type Bandwidth PCI-E Gen Multi-Graphics Technology Results Nvidia GeForce GTX 1060 3072 MB GDDR5 192GB/s Gen3 1 Qubes HCL reports MSI Radeon RX 6950 XT 16 GB GDDR6 576GB/s Gen4 1 EVGA NVidia RTX 2080 8 GB GDDR6 448GB/s Gen3 1 PNY NVidia RTX A5000 24 GB GDDR6 768GB/s Gen4 1 Nvidia GeForce GTX 1080TI 11264 MB GDDR5X x16 Gen3 1 Qubes HCL reports MSI Radeon RX 6500 XT MECH 2X 4G OC 4 GB GDDR6 x4 (x16 connector) Gen4 1 Works only on Dasharo v1.1.0 or newer MSI GeForce RTX 3060 GAMING Z TRIO LHR 12 GB GDDR6 x16 Gen4 1 miczyg setup MSI GeForce RTX 4090 GAMING X TRIO 24GB GDDR6X x16 Gen4 1 reported via email/matrix","title":"GPU HCL"},{"location":"variants/msi_z690/gpu-hcl/#gpu-hcl","text":"","title":"GPU HCL"},{"location":"variants/msi_z690/gpu-hcl/#contributing","text":"Feel free to test different graphics cards and report your results via email or submit a Pull Request to Dasharo documentation repository or by using Dasharo issues repository . If you already have reported your results and you change some hardware configuration we would appreciate an additional HCL report.","title":"Contributing"},{"location":"variants/msi_z690/gpu-hcl/#hcl-list","text":"GPU Hardware Compatibility List presents the GPUs tested and verified to work with Dasharo by community. The following list does not include GPU which is tested and verfied in 3mdeb laboratory - this information might be found in Hardware Matrix documentation. Legend: GPU name: the full name of GPU including vendor and model name. Memory size: total amount of GPU memory declared by vendor. Memory type: GPU's type of memory. Bandwidth: GPU's bandwidth. PCI-E Architecture: declared by producer generation of PCI-E architecture. Multi-Graphics Technology: information about support for Multi-Graphics Technology. Information about GPU might be read from GPU package or documentation. GPU name Memory size Memory type Bandwidth PCI-E Gen Multi-Graphics Technology Results Nvidia GeForce GTX 1060 3072 MB GDDR5 192GB/s Gen3 1 Qubes HCL reports MSI Radeon RX 6950 XT 16 GB GDDR6 576GB/s Gen4 1 EVGA NVidia RTX 2080 8 GB GDDR6 448GB/s Gen3 1 PNY NVidia RTX A5000 24 GB GDDR6 768GB/s Gen4 1 Nvidia GeForce GTX 1080TI 11264 MB GDDR5X x16 Gen3 1 Qubes HCL reports MSI Radeon RX 6500 XT MECH 2X 4G OC 4 GB GDDR6 x4 (x16 connector) Gen4 1 Works only on Dasharo v1.1.0 or newer MSI GeForce RTX 3060 GAMING Z TRIO LHR 12 GB GDDR6 x16 Gen4 1 miczyg setup MSI GeForce RTX 4090 GAMING X TRIO 24GB GDDR6X x16 Gen4 1 reported via email/matrix","title":"HCL list"},{"location":"variants/msi_z690/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configuration used for validation of the coreboot port on the MSI PRO Z690-A workstation. For additional information, please check the FAQ section . MSI PRO Z690-A WiFi DDR4, SN: 07D2511_LA1E012608 Component Description CPU Intel Core i5-12600K 3.7 Noctua NH-U12S CPU Cooler RAM Slot 1: Kingston KF436C17BBK4/32 Slot 2: Kingston KF436C17BBK4/32 Slot 3: Kingston KF436C17BBK4/32 Slot 4: Kingston KF436C17BBK4/32 Flash memory Macronix MX25U25673G SSD Intel 670p 512 GB M26472-201 NVME USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB 2. Kingston DataTraveler 3.1Gen1 16 GB SD cards SanDisk Ultra microSD HC I 16 GB Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p 3. 1-port USB Type-C Network Local network wired connection Power Supply SeaSonic FOCUS Plus Platinum Power Control Sonoff S20 EU type E Remote Testing Environment RTE v1.1.0 KVM PiKVM based on Raspberry Pi 4 MSI PRO Z690-A WiFi DDR4, SN: 07D2511 LA1E346864 Component Description CPU Intel Core i5-12600K 3.7 Noctua NH-U12S CPU Cooler RAM Slot 1: Kingston KF436C17BBK4/32 Slot 2: Kingston KF436C17BBK4/32 Slot 3: Kingston KF436C17BBK4/32 Slot 4: Kingston KF436C17BBK4/32 Flash memory Macronix MX25U25673G SSD Intel 670p 512 GB M26472-201 NVME USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB 2. Kingston DataTraveler 3.1Gen1 16 GB SD cards SanDisk Ultra microSD HC I 16 GB Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p 3. 1-port USB Type-C Network Local network wired connection Power Supply SeaSonic FOCUS Plus Platinum Power Control Sonoff S20 EU type E Remote Testing Environment RTE v1.1.0 MSI PRO Z690-A DDR5, SN: 07D2511_LA1E360456 Component Description CPU Intel Core i5-12600K 3.7 Noctua NH-U12S CPU Cooler RAM Slot 1: CRUCIAL CT8G48C40U5 Slot 2: CRUCIAL CT8G48C40U5 Slot 3: CRUCIAL CT8G48C40U5 Slot 4: CRUCIAL CT8G48C40U5 Flash memory Macronix MX25U25635F SSD Intel 670p 512 GB M26472-201 NVME USB pendrives SanDisk Ultra Flair USB 3.0 16 GB Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p Network Local network wired connection Power Supply SeaSonic Focus PX-750 Power Control Sonoff S20 EU type E Remote Testing Environment RTE v1.1.0 KVM PiKVM based on Raspberry Pi 4","title":"Hardware Configuration Matrix"},{"location":"variants/msi_z690/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/msi_z690/hardware-matrix/#introduction","text":"This document describes the hardware configuration used for validation of the coreboot port on the MSI PRO Z690-A workstation. For additional information, please check the FAQ section .","title":"Introduction"},{"location":"variants/msi_z690/hardware-matrix/#msi-pro-z690-a-wifi-ddr4-sn-07d2511_la1e012608","text":"Component Description CPU Intel Core i5-12600K 3.7 Noctua NH-U12S CPU Cooler RAM Slot 1: Kingston KF436C17BBK4/32 Slot 2: Kingston KF436C17BBK4/32 Slot 3: Kingston KF436C17BBK4/32 Slot 4: Kingston KF436C17BBK4/32 Flash memory Macronix MX25U25673G SSD Intel 670p 512 GB M26472-201 NVME USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB 2. Kingston DataTraveler 3.1Gen1 16 GB SD cards SanDisk Ultra microSD HC I 16 GB Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p 3. 1-port USB Type-C Network Local network wired connection Power Supply SeaSonic FOCUS Plus Platinum Power Control Sonoff S20 EU type E Remote Testing Environment RTE v1.1.0 KVM PiKVM based on Raspberry Pi 4","title":"MSI PRO Z690-A WiFi DDR4, SN: 07D2511_LA1E012608"},{"location":"variants/msi_z690/hardware-matrix/#msi-pro-z690-a-wifi-ddr4-sn-07d2511-la1e346864","text":"Component Description CPU Intel Core i5-12600K 3.7 Noctua NH-U12S CPU Cooler RAM Slot 1: Kingston KF436C17BBK4/32 Slot 2: Kingston KF436C17BBK4/32 Slot 3: Kingston KF436C17BBK4/32 Slot 4: Kingston KF436C17BBK4/32 Flash memory Macronix MX25U25673G SSD Intel 670p 512 GB M26472-201 NVME USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB 2. Kingston DataTraveler 3.1Gen1 16 GB SD cards SanDisk Ultra microSD HC I 16 GB Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p 3. 1-port USB Type-C Network Local network wired connection Power Supply SeaSonic FOCUS Plus Platinum Power Control Sonoff S20 EU type E Remote Testing Environment RTE v1.1.0","title":"MSI PRO Z690-A WiFi DDR4, SN: 07D2511 LA1E346864"},{"location":"variants/msi_z690/hardware-matrix/#msi-pro-z690-a-ddr5-sn-07d2511_la1e360456","text":"Component Description CPU Intel Core i5-12600K 3.7 Noctua NH-U12S CPU Cooler RAM Slot 1: CRUCIAL CT8G48C40U5 Slot 2: CRUCIAL CT8G48C40U5 Slot 3: CRUCIAL CT8G48C40U5 Slot 4: CRUCIAL CT8G48C40U5 Flash memory Macronix MX25U25635F SSD Intel 670p 512 GB M26472-201 NVME USB pendrives SanDisk Ultra Flair USB 3.0 16 GB Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p Network Local network wired connection Power Supply SeaSonic Focus PX-750 Power Control Sonoff S20 EU type E Remote Testing Environment RTE v1.1.0 KVM PiKVM based on Raspberry Pi 4","title":"MSI PRO Z690-A DDR5, SN: 07D2511_LA1E360456"},{"location":"variants/msi_z690/hcl/","text":"Hardware Compatibility Lists Following compatibility list is compiled thanks to community contribution and Dasharo Team work. Please note there are other good sources of information about compatibility like: OpenBenchmarking.org linux-hardware.org bsd-hardwre.info Feel free to refer to above sources or contact community , if you can't find your hardware. CPU HCL (20 Jul 2023) Memory HCL (20 Jul 2023) GPU HCL CPU Hardware Compatibility List presents the CPUs tested and verified to work with Dasharo by community. The following list does not include CPU which is tested and verfied in 3mdeb laboratory - this information might be found in Hardware Matrix documentation. Legend: CPU Model: CPU Model name. Dasharo version: Dasharo version on which report was created. - if version was not reported Source: Link to report if it is public. Dasharo HCL report if it was reported using DTS . CPU Model Dasharo version Source 12th Gen Intel(R) Core(TM) i5-12400F - Github PR 12th Gen Intel(R) Core(TM) i5-12400F v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12500T v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12500T v1.1.0 Dasharo HCL report 12th Gen Intel(R) Core(TM) i5-12600 v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12600 v1.1.0 Dasharo HCL report 12th Gen Intel(R) Core(TM) i5-12600K v1.0.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12600K v1.0.0 Dasharo HCL report 12th Gen Intel(R) Core(TM) i5-12600K v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12600K v1.1.0 Dasharo HCL report 12th Gen Intel(R) Core(TM) i5-12600K v1.1.1 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12600K v1.1.1-rc4 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i7-12700K v1.0.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i7-12700K v1.0.0 Dasharo HCL report 12th Gen Intel(R) Core(TM) i7-12700K v1.0.0 Qubes HCL reports 12th Gen Intel(R) Core(TM) i7-12700K v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i7-12700K v1.1.1 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i9-12900K v0.4.0 Qubes HCL reports 12th Gen Intel(R) Core(TM) i9-12900K v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i9-12900K v1.1.1 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i9-12900KS v1.1.1 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i9-12900T v1.1.0 Dasharo HCL Report Memory hardware Compatibility List presents the DIMM modules tested and verified to work with Dasharo in 3mdeb laboratory. Memory Modules are tested in 1, 2 and 4 modules configurations. These follow the DIMM population procedures as stated in the Board Manual: 1 module in DIMMA2 Slot (Single Channel), 2 by adding another module in DIMMB2 (Dual Channel), and 4 by populating all 4 slots. Testing is defined as passing firmware POST and booting an OS, since what is being tested is that the Intel FSP (Firmware Support Package) component is initializing the Memory Modules. We don't stress test them for stability. Each SPD Profile is tested, so each Memory Module can have from 1 to 4 entries. You may also check out Intel memory validation results page and see the results for DDR4 UDIMM testing. Maximum ratings for Alder Lake S CPUs is also available in the CPU datasheet . Legend: Configuration 1/2/4 - means given memory module was tested in 1, 2 and 4 DIMMs populated configuration, \u2714 means successfully tested, \u2716 means platform did not boot with Dasharo, e.g. \u2714/\u2714/\u2714 means all configurations work, - means not tested Size: DIMM capacity in MB SPD profile: can be one of JEDEC(Standard) / XMP Profile #1 / XMP Profile #2. Profile data: Type/speed: for example DDR4-2400 means DDR4 module clocked at max 2400MHz for given profile Timings: for example CL17-17-17 means CAS Latency 17, tRCD 17, tRP 17 (numbers expressed in clock cycles) for given memory profile Voltage: memory voltage in Volts for given memory profile NOTE: some XMP profiles may have lower speeds than other ones, but also have smaller CAS latency. Also the memory frequency configured in the memory controller and reported by DMI/SMBIOS may be slightly lower than advertised in the module specifications. This can vary based on the board design, CPU and many other factors. HCL list - MSI PRO Z690-A DDR4 Manufacturer Part Number Size Speed Configuration 1/2/4 Dasharo version Source Corsair CMK32GX4M2E3200C16 16384 MB 2133 MT/s (PC4-17000) \u2714/-/- v1.1.1 Dasharo HCL report Corsair CMK32GX4M2E3200C16 16384 MB 2133 MT/s (PC4-17000) -/-/\u2714 v1.1.0 Dasharo HCL report Corsair CMK64GX4M2E3200C16 32768 MB 2133 MT/s (PC4-17000) \u2714/-/- v1.1.1 Dasharo HCL report Crucial Technology BL16G32C16U4B.16FE 16384 MB 2666 MT/s (PC4-21300) \u2714/-/- v1.1.0 Dasharo HCL report Crucial Technology BL16G32C16U4B.16FE 16384 MB 2666 MT/s (PC4-21300) \u2714/-/- v1.1.1 Dasharo HCL report Crucial Technology CT8G4DFS8266.C8FJ 8192 MB 2666 MT/s (PC4-21300) \u2714/-/- v1.1.0 Dasharo HCL report Kingston KF3200C16D4/16GX 16384 MB 2400 MT/s (PC4-19200) \u2714/-/- v1.1.1 Dasharo HCL report Kingston KF3200C16D4/16GX 16384 MB 2400 MT/s (PC4-19200) -/-/\u2714 v1.1.1 Dasharo HCL report Kingston KF3200C16D4/32GX 32768 MB 2400 MT/s (PC4-19200) -/-/\u2714 v1.1.0 Dasharo HCL report Kingston KF3200C16D4/32GX 32768 MB 2400 MT/s (PC4-19200) -/-/\u2714 v1.1.1 Dasharo HCL report Kingston KF3600C17D4/8GX 8192 MB 2400 MT/s (PC4-19200) \u2714/-/- v1.0.0 Dasharo HCL report Kingston KF3600C17D4/8GX 8192 MB 2400 MT/s (PC4-19200) -/-/\u2714 v1.0.0 Dasharo HCL report Kingston KF3600C17D4/8GX 8192 MB 2400 MT/s (PC4-19200) -/-/\u2714 v1.1.0 Dasharo HCL report Kingston KF3600C17D4/8GX 8192 MB 2400 MT/s (PC4-19200) -/-/\u2714 v1.1.1 Dasharo HCL report Kingston KF3600C17D4/8GX 8192 MB 2400 MT/s (PC4-19200) -/-/\u2714 v1.1.1-rc4 Dasharo HCL report Patriot Memory 4400 C19 Series 8192 MB 2133 MT/s (PC4-17000) \u2714/-/- v1.0.0 Dasharo HCL report Thermaltake Technology Co Ltd RG26D408GX2-3600C18A 8192 MB 2666 MT/s (PC4-21300) \u2714/-/- v1.1.0 Dasharo HCL report HCL list - MSI PRO Z690-A DDR5 DIMM vendor Part Number Size SPD profile Configuration 1/2/4 Kingston KF556C40BB/8 8GB 5600MT/s 40-40-40 1.25V \u2714/\u2714/\u2714 Crucial CT8G48C40U5.M4A1/8 8GB 4800MT/s 40-39-39 1.1V \u2714/\u2714/\u2714 ADATA AD5U48008G-S 8GB 4800MT/s 40-40-40 1.1V \u2714/\u2714/\u2714 NOTE : Since we cannot extend following list based on automatic Dasharo HCL reports parsing until this issue would be addressed we decided to not update GPU HCL ourselves. We will merge PRs to GPU HCL, if following criteria would be addressed: Card has to be installed on main metal 16x slot, and there shouldn't be any other GPU except Intel integrated one if non-F CPU. Confirmation than Dasharo splash screen and Firmware menus were working. Actual GPU chip (PCI Vendor ID / Device ID). Video Card model (Subsystem Vendor ID / Device ID). Option ROM version. Secure Boot status (Enabled/Disabled, in case than there are Option ROM signing issues. This also means than the VBIOS should NOT be modded, factory original versions only) GPU Hardware Compatibility List presents the GPUs tested and verified to work with Dasharo by community. The following list does not include GPU which is tested and verfied in 3mdeb laboratory - this information might be found in Hardware Matrix documentation. Legend: GPU name: the full name of GPU including vendor and model name. Memory size: total amount of GPU memory declared by vendor. Memory type: GPU's type of memory. Bandwidth: GPU's bandwidth. PCI-E Architecture: declared by producer generation of PCI-E architecture. Multi-Graphics Technology: information about support for Multi-Graphics Technology. Information about GPU might be read from GPU package or documentation. GPU name Memory size Memory type Bandwidth PCI-E Gen Multi-Graphics Technology Results Nvidia GeForce GTX 1060 3072 MB GDDR5 192GB/s Gen3 1 Qubes HCL reports MSI Radeon RX 6950 XT 16 GB GDDR6 576GB/s Gen4 1 EVGA NVidia RTX 2080 8 GB GDDR6 448GB/s Gen3 1 PNY NVidia RTX A5000 24 GB GDDR6 768GB/s Gen4 1 Nvidia GeForce GTX 1080TI 11264 MB GDDR5X x16 Gen3 1 Qubes HCL reports MSI Radeon RX 6500 XT MECH 2X 4G OC 4 GB GDDR6 x4 (x16 connector) Gen4 1 Works only on Dasharo v1.1.0 or newer MSI GeForce RTX 3060 GAMING Z TRIO LHR 12 GB GDDR6 x16 Gen4 1 For details how to maintain this documentation please consult Dasharo HCL Maintainer documentation . Contributing Use Dasharo Tools Suite HCL report to upload report automatically. Create new issue in Dasharo issues repository . Create PR directly to Dasharo documentation repository . CPU HCL email your /proc/cpuinfo or relevant information using following template: CPU model: Dasharo version: Memory HCL email as attachments outputs of following command: decode-dimms > decode-dimms.log 2 > decode-dimms.err.log In email please include Dasharo version. Dasharo version: If you already have reported your results and you change some hardware configuration we would appreciate an update.","title":"Hardware Compatibility"},{"location":"variants/msi_z690/hcl/#hardware-compatibility-lists","text":"Following compatibility list is compiled thanks to community contribution and Dasharo Team work. Please note there are other good sources of information about compatibility like: OpenBenchmarking.org linux-hardware.org bsd-hardwre.info Feel free to refer to above sources or contact community , if you can't find your hardware. CPU HCL (20 Jul 2023) Memory HCL (20 Jul 2023) GPU HCL CPU Hardware Compatibility List presents the CPUs tested and verified to work with Dasharo by community. The following list does not include CPU which is tested and verfied in 3mdeb laboratory - this information might be found in Hardware Matrix documentation. Legend: CPU Model: CPU Model name. Dasharo version: Dasharo version on which report was created. - if version was not reported Source: Link to report if it is public. Dasharo HCL report if it was reported using DTS . CPU Model Dasharo version Source 12th Gen Intel(R) Core(TM) i5-12400F - Github PR 12th Gen Intel(R) Core(TM) i5-12400F v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12500T v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12500T v1.1.0 Dasharo HCL report 12th Gen Intel(R) Core(TM) i5-12600 v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12600 v1.1.0 Dasharo HCL report 12th Gen Intel(R) Core(TM) i5-12600K v1.0.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12600K v1.0.0 Dasharo HCL report 12th Gen Intel(R) Core(TM) i5-12600K v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12600K v1.1.0 Dasharo HCL report 12th Gen Intel(R) Core(TM) i5-12600K v1.1.1 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i5-12600K v1.1.1-rc4 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i7-12700K v1.0.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i7-12700K v1.0.0 Dasharo HCL report 12th Gen Intel(R) Core(TM) i7-12700K v1.0.0 Qubes HCL reports 12th Gen Intel(R) Core(TM) i7-12700K v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i7-12700K v1.1.1 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i9-12900K v0.4.0 Qubes HCL reports 12th Gen Intel(R) Core(TM) i9-12900K v1.1.0 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i9-12900K v1.1.1 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i9-12900KS v1.1.1 Dasharo HCL Report 12th Gen Intel(R) Core(TM) i9-12900T v1.1.0 Dasharo HCL Report Memory hardware Compatibility List presents the DIMM modules tested and verified to work with Dasharo in 3mdeb laboratory. Memory Modules are tested in 1, 2 and 4 modules configurations. These follow the DIMM population procedures as stated in the Board Manual: 1 module in DIMMA2 Slot (Single Channel), 2 by adding another module in DIMMB2 (Dual Channel), and 4 by populating all 4 slots. Testing is defined as passing firmware POST and booting an OS, since what is being tested is that the Intel FSP (Firmware Support Package) component is initializing the Memory Modules. We don't stress test them for stability. Each SPD Profile is tested, so each Memory Module can have from 1 to 4 entries. You may also check out Intel memory validation results page and see the results for DDR4 UDIMM testing. Maximum ratings for Alder Lake S CPUs is also available in the CPU datasheet . Legend: Configuration 1/2/4 - means given memory module was tested in 1, 2 and 4 DIMMs populated configuration, \u2714 means successfully tested, \u2716 means platform did not boot with Dasharo, e.g. \u2714/\u2714/\u2714 means all configurations work, - means not tested Size: DIMM capacity in MB SPD profile: can be one of JEDEC(Standard) / XMP Profile #1 / XMP Profile #2. Profile data: Type/speed: for example DDR4-2400 means DDR4 module clocked at max 2400MHz for given profile Timings: for example CL17-17-17 means CAS Latency 17, tRCD 17, tRP 17 (numbers expressed in clock cycles) for given memory profile Voltage: memory voltage in Volts for given memory profile NOTE: some XMP profiles may have lower speeds than other ones, but also have smaller CAS latency. Also the memory frequency configured in the memory controller and reported by DMI/SMBIOS may be slightly lower than advertised in the module specifications. This can vary based on the board design, CPU and many other factors.","title":"Hardware Compatibility Lists"},{"location":"variants/msi_z690/hcl/#contributing","text":"Use Dasharo Tools Suite HCL report to upload report automatically. Create new issue in Dasharo issues repository . Create PR directly to Dasharo documentation repository . CPU HCL email your /proc/cpuinfo or relevant information using following template: CPU model: Dasharo version: Memory HCL email as attachments outputs of following command: decode-dimms > decode-dimms.log 2 > decode-dimms.err.log In email please include Dasharo version. Dasharo version: If you already have reported your results and you change some hardware configuration we would appreciate an update.","title":"Contributing"},{"location":"variants/msi_z690/initial-deployment/","text":"Initial Deployment Initial deployment of Dasharo firmware on MSI PRO Z690-A can be done: using DTS, manually. Initial deployment using DTS To ensure a smooth deployment process, it is recommended to use the latest version of DTS available from the releases page . Once you have obtained it, you can then proceed with following the Dasharo zero-touch initial deployment section procedure. This will help you set up Dasharo effectively and without manual intervention. Initial deployment manually Flashing coreboot can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 22.04. Build flashrom Currently, the latest flashrom release lacks support for Alder Lake S internal flashing. Because of this, we need to build flashrom from 3mdeb fork . The procedure is based on Ubuntu 22.04 desktop amd64 ISO burned on the USB stick. Ubuntu 22.04 or newer if preferred, as it contains the network drivers for Ethernet and WiFi. Older versions of Ubuntu would require a USB to Ethernet adapter or equivalent to get a network connection and install required software packages. Boot the Ubuntu live image and select the Try Ubuntu option. Open a terminal and proceed with the commands below. Install build dependencies: sudo apt-get update sudo apt-get install git build-essential pkg-config libpci-dev udev Obtain source code: git clone https://github.com/Dasharo/flashrom.git -b dasharo-release cd flashrom Build and install flashrom: sudo make install Flashing All flash operations require UEFI Secure Boot to be disabled. You may download the binary using scp (need to install openssh-server package) or wget command. The binaries can be found on the release page . Reading flash contents Always prepare a backup of the current firmware image. To read the original firmware from the flash and save it to a file ( dump.rom ), execute the following command: sudo flashrom -p internal -r dump.rom IMPORTANT! You will need a second USB storage to keep the dumped firmware backup or alternatively upload it to some cloud or network drive (Ubuntu live has a Firefox browser installed). Ubuntu live image is volatile and has no persistent storage. All changes made in the live image will be lost after reboot. Migrating SMBIOS unique data To migrate the SMBIOS system UUID and board serial number follow the Linux instructions below before attempting to flash the binary. The procedure is supported on Dasharo version v1.0.0 and later and requires cbfstool built from coreboot tree. Follow the Building Manual using the v1.0.0 version or newer and then: echo -n ` sudo dmidecode -s system-uuid ` > system_uuid.txt echo -n ` sudo dmidecode -s baseboard-serial-number ` > serial_number.txt # assuming in coreboot root directory ./build/cbfstool build/coreboot.rom expand -r FW_MAIN_A ./build/cbfstool build/coreboot.rom expand -r FW_MAIN_B ./build/cbfstool build/coreboot.rom add \\ -f serial_number.txt -n serial_number -t raw -r FW_MAIN_A ./build/cbfstool build/coreboot.rom add \\ -f serial_number.txt -n serial_number -t raw -r FW_MAIN_B ./build/cbfstool build/coreboot.rom add \\ -f serial_number.txt -n serial_number -t raw -r COREBOOT ./build/cbfstool build/coreboot.rom add \\ -f system_uuid.txt -n system_uuid -t raw -r FW_MAIN_A ./build/cbfstool build/coreboot.rom add \\ -f system_uuid.txt -n system_uuid -t raw -r FW_MAIN_B ./build/cbfstool build/coreboot.rom add \\ -f system_uuid.txt -n system_uuid -t raw -r COREBOOT ./build/cbfstool build/coreboot.rom truncate -r FW_MAIN_A ./build/cbfstool build/coreboot.rom truncate -r FW_MAIN_B One may use msi_ms7d25_v1.0.0.rom (or newer) binary directly and simply build the cbfstool only from coreboot repository: git clone https://github.com/Dasharo/coreboot -b msi_ms7d25/release cd coreboot make -C util/cbfstool echo -n ` sudo dmidecode -s system-uuid ` > system_uuid.txt echo -n ` sudo dmidecode -s baseboard-serial-number ` > serial_number.txt # assuming in coreboot root directory ./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom expand -r FW_MAIN_A ./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom expand -r FW_MAIN_B ./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \\ -f serial_number.txt -n serial_number -t raw -r FW_MAIN_A ./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \\ -f serial_number.txt -n serial_number -t raw -r FW_MAIN_B ./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \\ -f serial_number.txt -n serial_number -t raw -r COREBOOT ./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \\ -f system_uuid.txt -n system_uuid -t raw -r FW_MAIN_A ./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \\ -f system_uuid.txt -n system_uuid -t raw -r FW_MAIN_B ./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \\ -f system_uuid.txt -n system_uuid -t raw -r COREBOOT ./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom truncate -r FW_MAIN_A ./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom truncate -r FW_MAIN_B Note you will need to resign the binary after adding the SMBIOS data. Please check Vboot documentation how to resign the data. It is the machine owner's responsibility to generate and use own keys during updates. Flashing Dasharo WARNING : If you use an external/discrete GPU and migrate to Dasharo, be sure to unplug the dGPU first (when the machine is powered off before proceeding with flashing), as Dasharo firmware does not support all GPU cards properly yet (as of version v1.0.0). There is a high risk for the graphical output to break in the firmware when dGPU is connected. Effectively it leaves the only option to boot in blind into a previously installed OS (if the platform does not brick and if an OS is present on a disk). The first boot may take up to 2 minutes to fully train the memory, so be patient and wait for the Dasharo logo to appear, subsequent boots will take only seconds. MSI EZ debug leds are not supported by Dasharo and you may notice a red led to be lit. If the platform boots with an integrated GPU, you may try to plug the external GPU back and boot again. To flash Dasharo on the platform, execute the following command: Replace the VERSION in firmware file name with the version you want to flash. For example: msi_ms7d25_v1.1.0_ddr4.rom . sudo flashrom -p internal -w msi_ms7d25_vVERSION { _ddr4,_ddr5 } .rom --ifd -i bios IMPORTANT! After the command succeeds, invoke sudo reboot or click the reboot/restart in the GUI to reboot the board. Press ENTER when prompted on the screen to remove the installation media (if Ubuntu live is used). DO NOT POWEROFF THE BOARD as SMI handlers of original MSI firmware may overwrite flash contents and cause a brick. After migration from MSI firmware to Dasharo and reboot, the firmware will fail the memory training. After reboot wait approximately 30 seconds and then power the board off by holding the power button pushed for 5 seconds. Dasharo v1.1.0 or newer will signal the memory training failure with PC speaker beeps and blinking SATA LED. When it happens use the power button to power the board off (no need to wait 30 seconds in such case). Power on the board back. Now the memory training should not fail and after approximately 1 minute (can be nearly 2 minutes for DDR5 memory), you should get a Dasharo splash screen on the monitor. Subsequent boots will take only a few seconds. Flashing back vendor firmware sudo flashrom -p internal -w dump.rom --ifd -i bios NOTE: Dasharo version v0.1.0 will not have a network connection. Use a different USB storage or a USB to Ethernet/USB WiFi adapter to move the binary to the live system.","title":"Initial deployment"},{"location":"variants/msi_z690/initial-deployment/#initial-deployment","text":"Initial deployment of Dasharo firmware on MSI PRO Z690-A can be done: using DTS, manually.","title":"Initial Deployment"},{"location":"variants/msi_z690/initial-deployment/#initial-deployment-using-dts","text":"To ensure a smooth deployment process, it is recommended to use the latest version of DTS available from the releases page . Once you have obtained it, you can then proceed with following the Dasharo zero-touch initial deployment section procedure. This will help you set up Dasharo effectively and without manual intervention.","title":"Initial deployment using DTS"},{"location":"variants/msi_z690/initial-deployment/#initial-deployment-manually","text":"Flashing coreboot can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 22.04.","title":"Initial deployment manually"},{"location":"variants/msi_z690/memory-hcl/","text":"Memory HCL Contributing Feel free to test different modules and report your results via email or submit a Pull Request to Dasharo documentation repository . Be sure to include information about the memory: If using Linux use sudo dmidecode -t memory . If using Windows attach screenshots from CPU-Z for example. Part Number of the Memory Modules: If you have physical access to the modules, the Part Number is printed on a sticker. You may send a photo where the sticker is legible if you can't identify it. The Part Number is also usually available as data on the SPD and retrievable via Software (see point 2 below), but sometimes it is possible than it doesn't match the Part Number on the sticker, or that it wasn't programmed onto the SPD at all. Dump of SPD Profiles: If using Linux use sudo dmidecode -t memory . Additionally you may provide SPD data binaries (example for Ubuntu for all 4 DIMMs): sudo apt-get install i2c-tools decode-dimms > dimms.log cat /sys/bus/i2c/drivers/ee1004/0-0050/eeprom > dimm0_spd.bin cat /sys/bus/i2c/drivers/ee1004/0-0051/eeprom > dimm1_spd.bin cat /sys/bus/i2c/drivers/ee1004/0-0052/eeprom > dimm2_spd.bin cat /sys/bus/i2c/drivers/ee1004/0-0053/eeprom > dimm3_spd.bin If using Windows attach screenshots from CPU-Z SPD Tab. If multiple modules are installed, make sure to open multiple CPU-Z instances and have each one cover a different Slot via the Memory Slot Selection drop down list. DDR4 DIMMs include a SPD ROM which can have up to 4 SPD Profiles. Each SPD Profile contains data for a combination of Speed (MHz), Timings and Voltage that the module is factory rated to run at. These SPD Profiles can be considered either JEDEC standard or XMP (Overclocking). Currently, Dasharo only loads the JEDEC standard profile and ignores the XMP ones. Currently memory profile is not selectable via BIOS setup. This feature is planned for future releases. HCL list The Memory Hardware Compatibility List presents the DIMM modules tested and verified to work with Dasharo in 3mdeb laboratory. Memory Modules are tested in 1, 2 and 4 modules configurations. These follow the DIMM population procedures as stated in the Board Manual: 1 module in DIMMA2 Slot (Single Channel), 2 by adding another module in DIMMB2 (Dual Channel), and 4 by populating all 4 slots. Testing is defined as passing firmware POST and booting an OS, since what is being tested is that the Intel FSP (Firmware Support Package) component is initializing the Memory Modules. We don't stress test them for stability. Each SPD Profile is tested, so each Memory Module can have from 1 to 4 entries. You may also check out Intel memory validation results page and see the results for DDR4 UDIMM testing. Maximum ratings for Alder Lake S CPUs is also available in the CPU datasheet . Legend: Configuration 1/2/4 - means given memory module was tested in 1, 2 and 4 DIMMs populated configuration, \u2714 means successfully tested, \u2716 means platform did not boot with Dasharo, e.g. \u2714/\u2714/\u2714 means all configurations work, - means not tested Size: DIMM capacity in GB SPD profile: can be one of JEDEC(Standard) / XMP Profile #1 / XMP Profile #2. Profile data: Type/speed: for example DDR4-2400 means DDR4 module clocked at max 2400MHz for given profile Timings: for example CL17-17-17 means CAS Latency 17, tRCD 17, tRP 17 (numbers expressed in clock cycles) for given memory profile Voltage: memory voltage in Volts for given memory profile NOTE: some XMP profiles may have lower speeds than other ones, but also have smaller CAS latency. Also the memory frequency configured in the memory controller and reported by DMI/SMBIOS may be slightly lower than advertised in the module specifications. This can vary based on the board design, CPU and many other factors. HCL list - MSI PRO Z690-A DDR4 DIMM vendor Part Number Size SPD profile Configuration 1/2/4 Kingston KF436C17BBK4/32 8GB JEDEC: DDR4-2400 CL17-17-17 1.2V \u2714/\u2714/\u2714 Kingston KF436C17BBK4/32 8GB XMP profile #1: DDR4-3600 CL17-21-21 1.35V -/-/\u2714 Kingston KF436C17BBK4/32 8GB XMP profile #2: DDR4-3000 CL15-17-17 1.35V -/-/\u2714 Corsair CMK16GX4M2B3200C16 8GB XMP 2.0: DDR4-3200 PC4-25600 CL16-18-18-36 1.35 V -/-/\u2714 Kingston KF432C16BB1/16 16GB JEDEC: DDR4-2400 CL17-17-17 1.2V -/\u2714\u00b9/\u2714 PNY 8GBF1X08QFHH38-135-K-HXR 8GB JEDEC: DDR4-2133 CL15-15-15 1.2V -/\u2714\u00b9/\u2714 Kingston KF436C18BBK2/64 32GB JEDEC: DDR4-2400 CL17-17-17-39 1.2V \u2714/\u2714/- Kingston KHX2666C16/16G 16GB JEDEC: DDR4-2133 CL16-18-18-39 1.2V \u2714/\u2714/\u2714 OLOy MD4U323216DJDA 32GB JEDEC: DDR4-2133 CL15-15-15-36 1.2V \u2714/\u2714/\u2714 Kingston KF3600C16D4/16GX 16GB JEDEC: DDR4-2400 CL17-17-17-39 1.2V \u2714/\u2714/\u2714 1) Tested in 2x2 mixed configuration HCL list - MSI PRO Z690-A DDR5 DIMM vendor Part Number Size SPD profile Configuration 1/2/4 Kingston KF556C40BB/8 8GB 5600MT/s 40-40-40 1.25V \u2714/\u2714/\u2714 Crucial CT8G48C40U5.M4A1/8 8GB 4800MT/s 40-39-39 1.1V \u2714/\u2714/\u2714 ADATA AD5U48008G-S 8GB 4800MT/s 40-40-40 1.1V \u2714/\u2714/\u2714","title":"Memory HCL"},{"location":"variants/msi_z690/memory-hcl/#memory-hcl","text":"","title":"Memory HCL"},{"location":"variants/msi_z690/memory-hcl/#contributing","text":"Feel free to test different modules and report your results via email or submit a Pull Request to Dasharo documentation repository . Be sure to include information about the memory: If using Linux use sudo dmidecode -t memory . If using Windows attach screenshots from CPU-Z for example. Part Number of the Memory Modules: If you have physical access to the modules, the Part Number is printed on a sticker. You may send a photo where the sticker is legible if you can't identify it. The Part Number is also usually available as data on the SPD and retrievable via Software (see point 2 below), but sometimes it is possible than it doesn't match the Part Number on the sticker, or that it wasn't programmed onto the SPD at all. Dump of SPD Profiles: If using Linux use sudo dmidecode -t memory . Additionally you may provide SPD data binaries (example for Ubuntu for all 4 DIMMs): sudo apt-get install i2c-tools decode-dimms > dimms.log cat /sys/bus/i2c/drivers/ee1004/0-0050/eeprom > dimm0_spd.bin cat /sys/bus/i2c/drivers/ee1004/0-0051/eeprom > dimm1_spd.bin cat /sys/bus/i2c/drivers/ee1004/0-0052/eeprom > dimm2_spd.bin cat /sys/bus/i2c/drivers/ee1004/0-0053/eeprom > dimm3_spd.bin If using Windows attach screenshots from CPU-Z SPD Tab. If multiple modules are installed, make sure to open multiple CPU-Z instances and have each one cover a different Slot via the Memory Slot Selection drop down list. DDR4 DIMMs include a SPD ROM which can have up to 4 SPD Profiles. Each SPD Profile contains data for a combination of Speed (MHz), Timings and Voltage that the module is factory rated to run at. These SPD Profiles can be considered either JEDEC standard or XMP (Overclocking). Currently, Dasharo only loads the JEDEC standard profile and ignores the XMP ones. Currently memory profile is not selectable via BIOS setup. This feature is planned for future releases.","title":"Contributing"},{"location":"variants/msi_z690/memory-hcl/#hcl-list","text":"The Memory Hardware Compatibility List presents the DIMM modules tested and verified to work with Dasharo in 3mdeb laboratory. Memory Modules are tested in 1, 2 and 4 modules configurations. These follow the DIMM population procedures as stated in the Board Manual: 1 module in DIMMA2 Slot (Single Channel), 2 by adding another module in DIMMB2 (Dual Channel), and 4 by populating all 4 slots. Testing is defined as passing firmware POST and booting an OS, since what is being tested is that the Intel FSP (Firmware Support Package) component is initializing the Memory Modules. We don't stress test them for stability. Each SPD Profile is tested, so each Memory Module can have from 1 to 4 entries. You may also check out Intel memory validation results page and see the results for DDR4 UDIMM testing. Maximum ratings for Alder Lake S CPUs is also available in the CPU datasheet . Legend: Configuration 1/2/4 - means given memory module was tested in 1, 2 and 4 DIMMs populated configuration, \u2714 means successfully tested, \u2716 means platform did not boot with Dasharo, e.g. \u2714/\u2714/\u2714 means all configurations work, - means not tested Size: DIMM capacity in GB SPD profile: can be one of JEDEC(Standard) / XMP Profile #1 / XMP Profile #2. Profile data: Type/speed: for example DDR4-2400 means DDR4 module clocked at max 2400MHz for given profile Timings: for example CL17-17-17 means CAS Latency 17, tRCD 17, tRP 17 (numbers expressed in clock cycles) for given memory profile Voltage: memory voltage in Volts for given memory profile NOTE: some XMP profiles may have lower speeds than other ones, but also have smaller CAS latency. Also the memory frequency configured in the memory controller and reported by DMI/SMBIOS may be slightly lower than advertised in the module specifications. This can vary based on the board design, CPU and many other factors.","title":"HCL list"},{"location":"variants/msi_z690/openness_analysis/","text":"Dasharo Openness Score This document aims to compare the openness of Dasharo firmware and AMI BIOS for MSI PRO Z690-A DDR4 WiFI. There is an ongoing discussion about the methodology of the openness metric. BIOS versions used in the analysis Dasharo v1.0.0 AMI BIOS v1.0 MSI original BIOS from AMI In the case of the AMI BIOS, the entire image should be considered proprietary. There are several parts of the image that have a well-known structure or make use of a public standard. However, to decode these structures, one needs to employ reverse-engineering tools and techniques to know what structures are present. For simplicity we treat UEFI variables as BIOS data. All empty padding regions between FFS and all volume free spaces are treated as unused space. Dasharo BIOS CBFS regions The below table shows only a single FMAP region COREBOOT. There are also two RW vboot partitions containing copies of the same components from COREBOOT region (except the verstage, bootblock and cbfs master header). Note that there are other regions to store non-volatile data like MRC cache, UEFI variables or vboot state backup. Region COREBOOT: File Size (bytes) Is it open-source? cbfs master header 32 \u2714 fallback/romstage 95152 \u2714 cpu_microcode_blob.bin 944144 \u2716 intel_fit 80 \u2714 fallback/ramstage 127231(LZMA) \u2714 config 1378 \u2714 revision 842 \u2714 build_info 142 \u2714 fallback/dsdt.aml 9973 \u2714 vbt.bin 1254 (LZMA) \u2714 (empty) 2596 N/A fspm.bin 720896 \u2716 fsps.bin 290481 (LZ4) \u2716 fallback/postcar 37504 \u2714 fallback/payload 1813047 (LZMA) \u2714 (with exceptions) fallback/verstage 77008 \u2714 (empty) 1055076 N/A bootblock 31808 \u2714 The payload used is Tianocore EDK2 UEFIPayload. In order to support network boot over i225 Ethernet, an i225 EFI driver is included in the payload. The driver is 154064 bytes in size uncompressed (63445 LZMA compressed). The 63445 bytes will be added to closed source pool and removed from the payload size in the calculations. Note that UEFIPayload has support for Option ROM loading, for example to support external graphics card output during POST. It is an additional closed-source code which depends on the hardware configuration and is not included in the calculations. Type Total size (bytes) Percent COREBOOT region 5208644 N/A empty 1057672 N/A code size (open + closed) 4150972 N/A open-source 2132006 51.36% closed-source 2018966 48.64% Region FW_MAIN_A/FW_MAIN_B: File Size (bytes) Is it open-source? fallback/romstage 95152 \u2714 cpu_microcode_blob.bin 944144 \u2716 fallback/ramstage 127231(LZMA) \u2714 config 1378 \u2714 revision 842 \u2714 build_info 142 \u2714 fallback/dsdt.aml 9973 \u2714 (empty) 100 N/A fspm.bin 720896 \u2716 fsps.bin 290481 (LZ4) \u2716 vbt.bin 1254 (LZMA) \u2714 fallback/postcar 37504 \u2714 fallback/payload 1813047 (LZMA) \u2714 (with exceptions) (empty) 1306724 N/A The FW_MAIN_A/FW_MAIN_B regions have been expanded first with CBFStool to show whole empty space for given region. Type Total size (bytes) Percent FW_MAIN_A/B region 5340928 N/A empty 1306824 N/A code size (open + closed) 4042044 N/A open-source 2023078 50.05% closed-source 2018966 49.95% COREBOOT has slightly higher open-source code percentage due to verstage and bootblock not being present in FW_MAIN_A/B regions. Summary for all 3 regions: Whole flash image To get the overall BIOS region and full image percentage of open source code we ignore unused space or FMAP regions which do not have CBFS and are merely data generated during build process or boot process. The BIOS region percentage is calculated as follows: (COREBOOT region open-source size + FW_MAIN_A/B open-source size * 2) * 100 divided by (COREBOOT region code size + FW_MAIN_A/B code size * 2) . Full image code only percentage is calculated as follows: (COREBOOT region open-source size + FW_MAIN_A/B open-source size * 2) * 100 divided by (ME + descriptor + COREBOOT region code size + FW_MAIN_A/B code size * 2) . Region Size (bytes) Open-source percent (bytes) descriptor 0x1000 0% ME 0x3D9000 0% unused hole 0xC26000 N/A BIOS 0x1000000 50.5% Summary 0x2000000 38% Comparison of pure code open-source vs closed-source. This was rather expected result. AMI BIOS region statistics: Type Total size (bytes) Percent BIOS data (UEFI var) 524288 N/A empty 7638472 N/A code size (open + closed) 8614456 N/A open-source 0 0% closed-source 8614456 100% Full BIOS region openness compared to AMI BIOS with data and free space: That mean Full image openness code only compared to AMI BIOS: Few conclusions from the above charts: Dasharo needs more space for BIOS data, it is mainly dictated by the usage of vboot which needs a significant amount of space for VBLOCKs, GBB and other stuff BIOS data is rather comparable between the firmware distributions, although it must be noted that vboot also generates BIOS data as explained above Dasharo has much less free space than AMI, however it must be noted that Dasharo contains 3! copies of functional firmware, but AMI only a single copy. Without vboot, BIOS region free space would reach over 70%! While BIOS region's Dasharo Openness Score is 50%, when compared with Intel ME and descriptor, the overall Dasharo Openness Score is 38% ME share is different because the size of BIOS code is different on both distributions Summary Image Open-source percent (bytes) AMI BIOS 0% Dasharo 38% Dasharo code takes approximately 4MB of space for a single region + some space for data which is less than 1MB. This reduces the single copy of firmware from 8MB to roughly 4MB compared to AMI BIOS. This is roughly 50% reduction of TCB! More over, given the 50% share in size of open-source code, Dasharo liberates BIOS in 75%! Few conclusions: Although the reduction of TCB is 50% it cannot be seen on the charts due to 3 copies of the firmware in Dasharo image. It also effectively increases the percentage of BIOS code both open and closed source in the full image. More significant differences would be seen with vboot disabled, there would be more free space and even less BIOS code both open and closed","title":"Openness score"},{"location":"variants/msi_z690/openness_analysis/#dasharo-openness-score","text":"This document aims to compare the openness of Dasharo firmware and AMI BIOS for MSI PRO Z690-A DDR4 WiFI. There is an ongoing discussion about the methodology of the openness metric.","title":"Dasharo Openness Score"},{"location":"variants/msi_z690/openness_analysis/#bios-versions-used-in-the-analysis","text":"Dasharo v1.0.0 AMI BIOS v1.0","title":"BIOS versions used in the analysis"},{"location":"variants/msi_z690/openness_analysis/#msi-original-bios-from-ami","text":"In the case of the AMI BIOS, the entire image should be considered proprietary. There are several parts of the image that have a well-known structure or make use of a public standard. However, to decode these structures, one needs to employ reverse-engineering tools and techniques to know what structures are present. For simplicity we treat UEFI variables as BIOS data. All empty padding regions between FFS and all volume free spaces are treated as unused space.","title":"MSI original BIOS from AMI"},{"location":"variants/msi_z690/openness_analysis/#dasharo-bios","text":"","title":"Dasharo BIOS"},{"location":"variants/msi_z690/openness_analysis/#summary","text":"Image Open-source percent (bytes) AMI BIOS 0% Dasharo 38% Dasharo code takes approximately 4MB of space for a single region + some space for data which is less than 1MB. This reduces the single copy of firmware from 8MB to roughly 4MB compared to AMI BIOS. This is roughly 50% reduction of TCB! More over, given the 50% share in size of open-source code, Dasharo liberates BIOS in 75%! Few conclusions: Although the reduction of TCB is 50% it cannot be seen on the charts due to 3 copies of the firmware in Dasharo image. It also effectively increases the percentage of BIOS code both open and closed source in the full image. More significant differences would be seen with vboot disabled, there would be more free space and even less BIOS code both open and closed","title":"Summary"},{"location":"variants/msi_z690/overview/","text":"Overview Releases - groups information about all releases. Building manual - describes how to build Dasharo for the MSI PRO Z690-A. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for the MSI PRO Z690-A. Firmware update - explains supported Dasharo open-source firmware update methods. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes the validation scope used during the Dasharo firmware validation procedure. Development - describes information for Dasharo developers. Memory Compatibility - describes compatible memory modules tested by the community. CPU Compatibility - describes compatible processors tested by the community. GPU Compatibility - describes compatible graphics cards tested by the community. Community test results - describes the test results performed by the community. FAQ - answers for frequently asked questions. Useful documents MSI Z690-A PRO DDR4 WiFI site Board manual Press releases PC Gamer Phoronix Tom's Hardware Root.cz GN24 ITBusiness Buy the MSI PRO Z690-A DDR4 with Dasharo firmware The Full PC Build with MSI PRO Z690-A DDR4 motherboard with Dasharo firmware is available at the official 3mdeb store . You can also buy the product by mailing us at: shopping@3mdeb.com . Device assembly and presale validation will be carried out in accordance with the following procedure .","title":"Overview"},{"location":"variants/msi_z690/overview/#overview","text":"Releases - groups information about all releases. Building manual - describes how to build Dasharo for the MSI PRO Z690-A. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for the MSI PRO Z690-A. Firmware update - explains supported Dasharo open-source firmware update methods. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes the validation scope used during the Dasharo firmware validation procedure. Development - describes information for Dasharo developers. Memory Compatibility - describes compatible memory modules tested by the community. CPU Compatibility - describes compatible processors tested by the community. GPU Compatibility - describes compatible graphics cards tested by the community. Community test results - describes the test results performed by the community. FAQ - answers for frequently asked questions.","title":"Overview"},{"location":"variants/msi_z690/overview/#useful-documents","text":"MSI Z690-A PRO DDR4 WiFI site Board manual","title":"Useful documents"},{"location":"variants/msi_z690/overview/#press-releases","text":"PC Gamer Phoronix Tom's Hardware Root.cz GN24 ITBusiness","title":"Press releases"},{"location":"variants/msi_z690/overview/#buy-the-msi-pro-z690-a-ddr4-with-dasharo-firmware","text":"The Full PC Build with MSI PRO Z690-A DDR4 motherboard with Dasharo firmware is available at the official 3mdeb store . You can also buy the product by mailing us at: shopping@3mdeb.com . Device assembly and presale validation will be carried out in accordance with the following procedure .","title":"Buy the MSI PRO Z690-A DDR4 with Dasharo firmware"},{"location":"variants/msi_z690/recovery/","text":"Recovery Intro This project is in early development phase. On certain hardware configurations, the Dasharo firmware may not boot correctly (i.e. we will have \"bricked\" the platform). In such a case, the recovery procedure can reinstall the original firmware from the board manufacturer. There are two documented recovery methods: using a CH341A programming kit or an RTE . External flashing with programmer RTE In this case, using external programmer is necessary. We are using RTE here. Connect programmer to the flash chip as shown in the Hardware connection / SPI section of the Development documentation. Download official BIOS from vendor's website (this is the newest version, you may choose an older one too or in the best case use your firmware backup): wget https://download.msi.com/bos_exe/mb/7D25v13.zip unzip 7D25v13.zip Flash via external programmer: The command line will be different, depending on the programmer you use flashrom -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 -w 7D25v13/E7D25IMS.130 First boot after the recovery process is significantly longer CH341A Prerequisites The full set is now available at our online shop . CH341A kit with 1.8V level-shifter. Can be bought on e.g. Amazon WSON8 probe. Can be bought from China on Aliexpress or eBay. USB2.0 Female-Male extension cord 0.5m or longer (optional) Machine with Linux and flashrom. Connection First start with assembling the CH341A and the 1.8V adapter. Pay attention to which holes you attach the adapter. You should use the holes marked as 25XX (closer to the USB plug): Place the 1.8V adapter in the holes and lock it with the lever. Be sure that the arrow on the adapter is facing the black lever (opposite side of USB plug): Now take the breakout board with pin headers: and plug it into the other 1.8V adapter, be sure that numbers 1-4 on the breakout match the numbers 1 and 4 on the adapter: Numbers should be visible on the upper side after assembling: Next, take the WSON8 probe and locate the white dot on the needles side (it will indicate the first reference pin, although you may use any other corner pin): Check which wire is connecting to this pin (the connection should be 1 to 1). In my case it is white wire and it will be used as reference to connect the wires to the breakout board: The wires should follow the same order of colors as on the probe (keep them straight, and do not cross). Repeat with the other 4 wires on the other side of the probe: Now the connection is ready. Time to locate the flash chip of the board. Flashing Connect the CH341A USB plug to the host machine which will be doing the flashing process (optionally use the USB extension cord for convenience). Locate the flash chip on the MSI PRO Z690-A DDR4 board: Locate the first pin on the flash chip (marked with a circle on the flash chip package and indicated by number 1 printed on the board - red circle): Attach the WSON8 probe matching the first pin of the probe (white wire) and first pin of the flash chip: Now on the Linux machine check if the flash is detected using a sample command sudo flashrom -p ch341a_spi -r firmware.bin You should see something like this: flashrom v1.2-567-gf4eb405 on Linux 5 .19.9-200.fc36.x86_64 ( x86_64 ) flashrom is free software, get the source code at https://flashrom.org Using clock_gettime for delay loops ( clk_id: 1 , resolution: 1ns ) . Found Winbond flash chip \"W25Q256.W\" ( 32768 kB, SPI ) on ch341a_spi. Reading flash... done . You don't need to wait for the command completion and interrupt it with Ctrl+C shortcut, it just serves as a confirmation of good connection. If you decide to interrupt it, reset the CH341A programmer by unpluging and repluging it to USB port. Now stabilize your hand holding the WSON8 probe on the flash chip and invoke the real flashing command (e.g. if your original/working firmware backup is saved as firmware_backup.bin ): sudo flashrom -p ch341a_spi -w firmware_backup.bin Note that USB programmers are pretty slow, the whole operation make take several minutes (can be 10-15 minutes in worst case). At the end of operation you should see: flashrom v1.2-567-gf4eb405 on Linux 5 .19.9-200.fc36.x86_64 ( x86_64 ) flashrom is free software, get the source code at https://flashrom.org Using clock_gettime for delay loops ( clk_id: 1 , resolution: 1ns ) . Found Winbond flash chip \"W25Q256.W\" ( 32768 kB, SPI ) on ch341a_spi. Reading old flash chip contents... done . Erasing and writing flash chip... Erase/write done . Verifying flash... VERIFIED. MSI Flash BIOS Button The MSI Flash BIOS Button would give us easy-to-use recovery method. We have tried that one to switch from Dasharo firmware to the original one, but it did not work, unfortunately. The details of how this process exactly works are unknown due to the closed nature of it's implementation. We can research this topic more in the future, so maybe it can be utilized later for deployment and/or recovery of the platform. SMBIOS unique data recovery Serial number format and recovery SMBIOS specification sections 7.2 and 7.3 defines two spaces for serial number: the system serial number and baseboard serial number. The original MSI PRO Z690-A firmware provides only the baseboard serial number. In case you have lost your serial number in the process of flashing Dasharo or newer MSI firmware, there is a way to retrieve it. The board has a QR code printed on the mainboard between the chipset heatsink and dPGU PCIe slot: If you read the QR code with your smartphone you will get the full serial number. The serial number has the format 07D25xx_LyzEaaaaaa where: 07D25 - is the board model, i.e. MS-7D25 for this particular board xx is the mainboard revision which should match the revision imprinted between the M2_1 slot and dGPU slot. E.g. xx=11 means VER:1.1 yz is the manufacturing date in hex, i.e. y is the month, z is the year, for example A1 means October 202 1 , 12 means January 202 2 aaaaaa is the unique 6-digit number which is imprinted under the serial number QR code System UUID format and recovery SMBIOS specification section 7.2 defines a field for unique system identification with a special number called UUID (Universally Unique IDentifier). UUID is specified by RFC 4122 . MSI firmware provides the system UUID in the SMBIOS system information structure. The problem with UUID is that it cannot be recovered if the backup binary or SMBIOS logs are lost. You can backup the SMBIOS information with our Dasharo Tools Suite bootable stick . The dmidecode.log will have all the necessary information. Things we know about MSI system UUID: UUID format is as follows: 33221100-5544-7766-8899-AABBCCDDEEFF , the hex numbers represent the order of bytes in memory for the little-endian format as required by SMBIOS MSI UUIDs do not conform to any of the RFC 4122 UUID variants/versions (the bits responsible for UUID version and variant identification are not constant across multiple boards) the last octet group AABBCCDDEEFF is equal to the MAC address of the on-board Intel i225 Ethernet, so be sure to NOT share the UUID with anybody as it contains system sensitive information the first four groups are either random numbers or some cryptographically acquired value from e.g. combination of some board data, unfortunately it is not known by us The MAC address is printed on a sticker placed on the 2x2 SATA connector: SMBIOS data migration For Dasharo simply follow the Initial Deployment how to migrate the data. For MSI firmware you will probably need an AMI DMI/SMBIOS editor to save those values back if you do not have a backup binary.","title":"Recovery"},{"location":"variants/msi_z690/recovery/#recovery","text":"","title":"Recovery"},{"location":"variants/msi_z690/recovery/#intro","text":"This project is in early development phase. On certain hardware configurations, the Dasharo firmware may not boot correctly (i.e. we will have \"bricked\" the platform). In such a case, the recovery procedure can reinstall the original firmware from the board manufacturer. There are two documented recovery methods: using a CH341A programming kit or an RTE .","title":"Intro"},{"location":"variants/msi_z690/recovery/#smbios-unique-data-recovery","text":"","title":"SMBIOS unique data recovery"},{"location":"variants/msi_z690/releases/","text":"Release Notes Following Release Notes describe status of Open Source Firmware development for MSI PRO Z690-A (WIFI) DDR4 and MSI PRO Z690-A (WIFI). For details about our release process please read Dasharo Standard Release Process . Subscribe to Dasharo compatible with MSI PRO Z690-A Newsletter Test results for this platform can be found here . v1.1.1 - 2023-02-23 Test results for this release can be found here . To get more details about the changes one may read the Dasharo v1.1.1 release blog post Added Early boot DMA protection menu option ACPI PCI interrupt routing for CPU PCIe Root Ports OC Watchdog ACPI device as in MSI firmware Changed Updated SMMSTORE driver to upstream version in UEFI Payload Improved visual comfort in the boot manager Fixed MSI PRO Z690-A WIFI DDR4 doesn't initialize IGP on certain Processors models MSI PRO Z690-A WIFI DDR4 with two Video Cards (2x Radeon 5600XT) has issues related to MMIO resource allocation Suspend doesn't work in Qubes OS with v1.1.0 Intel XTU on Windows reports \"The platform does not support overclocking\" on the MSI PRO Z690-A WIFI DDR4 with a K-series Processor SATA ports malfunction or Hot-Plug function disabled Platform sometimes automatically powers on after power off GPIO controller ACPI device yellow bang in Windows device manager Resource conflicts with chipset internal P2SB PCI device being incorrectly defined and initialized in coreboot Reset button hanging the platform for up to 2 minutes due to watchdog bug Known issues MSI FLASHBIOS feature is not working Reset to defaults with F9 causes the wrong settings to be restored Binaries msi_ms7d25_v1.1.1_ddr4.rom sha256 sha256.sig msi_ms7d25_v1.1.1_ddr5.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) Dasharo coreboot fork based on 912a262b7bf revision aa4701cd Dasharo EDKII fork based on dd7523b5b1 revision a913e338 v1.1.0 - 2022-11-22 Added Vboot recovery popup informing that platform has booted in recovery mode TCG2 TPM Physical Presence Interface support Support for DDR5 board variant PS/2 Controller enable/disable option Chipset watchdog support during boot and watchdog configuration menu Early boot DMA protection Option to reset Secure Boot keys to defaults Intel ME disable support and menu options Dasharo setup password SED/OPAL disk password support SATA disk password Firmware performance reporting USB stack and mass storage enable/disable option Network Boot enable/disable option SMM BIOS Write Protection support and enable/disable option AcpiView command to UEFI Shell Platform will beep 12 times and blink HDD led on critical firmware errors, e.g. if memory training failed PCIe 5.0 firmware caching in flash which allows to disable ME without losing PCIe 5.0 port functionality cbmem logging from UEFI Payload is now supported and one can check complete firmware logs from OS using coreboot's cbmem utility Added Intel default settings for missing Alder Lake S CPUs Changed Added new ACPI Platform driver that installs coreboot exposed ACPI tables and all allows native EDK2 ACPI table protocol to install new tables, e.g. Firmware Performance Data Table, BGRT (Boot Logo) of VFCT (AMD GPU ACPI table) Secure Boot is now disabled by default with all keys erased iPXE is now built from source using coreboot-sdk and included externally into UEFI Payload Dasharo setup menu full screen mode support Disabled PCIe ASPM and Clock PM for better PCIe device compatibility Disabled GPIO programming by FSP, coreboot handles the GPIO completely. This additionally fixes a bug in FSP which did not enable SATA DEVSLP properly. Changed Super I/O pin for PECI mode to reflect vendor firmware setting Switched from IOT FSP to public ADL Client FSP Switched to include microcode from public Intel microcode repository Disabled PCIe hotplug Network boot disabled by default, now configurable via menu option Fixed Vboot recovery popup is displayed before logo, so that logo do not disappear after popup is displayed Wrong Tau values from Turbo Boost PCI Express OptionROM loading causing certain dGPU cards to not work during POST PS/2 keyboard detection and inclusion to platform Console Input causing long delays in Ventoy or lockups in USB enumeration Incorrect USB2 PHY tuning values for USB-C ports causing hard USB controller lockups during USB enumeration and resulting in firmware hangs as long as USB Type-C devices were plugged or devices being unable to detect and enumerate in OS Broken PCI resource parsing above 4G Incorrect SMBIOS product name for non-WiFi variants USB storage devices disappear after reboot/power failure Known issues MSI FLASHBIOS feature is not working MMIO resource allocation issues with two Video Cards Slow video performance with Radeon 5600XT Reset to defaults with F9 causes the wrong settings to be restored Binaries msi_ms7d25_v1.1.0_ddr4.rom sha256 sha256.sig msi_ms7d25_v1.1.0_ddr5.rom sha256 sha256.sig See how to verify signatures on this video Commands snippet: gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-1.x-compatible-with-msi-ms-7d25-signing-key.asc gpg --list-sigs \"3mdeb Master Key\" \"3mdeb Dasharo Master Key\" \"Dasharo release 1.x compatible with MSI MS-7D25 signing key\" # DDR4 wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr4.rom wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr4.rom.sha256 wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr4.rom.sha256.sig sha256sum -c msi_ms7d25_v1.1.0_ddr4.rom.sha256 gpg --verify msi_ms7d25_v1.1.0_ddr4.rom.sha256.sig msi_ms7d25_v1.1.0_ddr4.rom.sha256 # DDR5 wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr5.rom wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr5.rom.sha256 wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr5.rom.sha256.sig sha256sum -c msi_ms7d25_v1.1.0_ddr5.rom.sha256 gpg --verify msi_ms7d25_v1.1.0_ddr5.rom.sha256.sig msi_ms7d25_v1.1.0_ddr5.rom.sha256 SBOM (Software Bill of Materials) Dasharo coreboot fork based on 912a262b7bf revision b76a1467 Dasharo EDKII fork based on dd7523b5b1 revision 5738f9e8 v1.0.0 - 2022-05-27 Added Serial number and UUID in CBFS support TPM Physical Presence Interface support Changed Updated i225 EFI driver to version 0.10.04 to reduce the POST time Vboot submodule revision to fix recovery mode loop Fixed fTPM is not working Known issues USB storage devices disappear after reboot/power failure Binaries MSI PRO Z690-A WIFI DDR4 v1.0.0 sha256 sha256.sig See how to verify signatures on this video Commands snippet: gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-1.x-compatible-with-msi-ms-7d25-signing-key.asc gpg --list-sigs \"3mdeb Master Key\" \"3mdeb Dasharo Master Key\" \"Dasharo release 1.x compatible with MSI MS-7D25 signing key\" wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.0.0/msi_ms7d25_v1.0.0.rom wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.0.0/msi_ms7d25_v1.0.0.rom.sha256 wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.0.0/msi_ms7d25_v1.0.0.rom.sha256.sig sha256sum -c msi_ms7d25_v1.0.0.rom.sha256 gpg --verify msi_ms7d25_v1.0.0.rom.sha256.sig msi_ms7d25_v1.0.0.rom.sha256 SBOM (Software Bill of Materials) coreboot based on a552cfc9 revision d22caaa0a edk2 based on 4d2846ba revision 0c94299b v0.4.0 - 2022-05-13 Added Verified boot support Fixed Some PCIe ports are not working Known issues USB storage devices disappear after reboot/power failure fTPM is not working Binaries MSI PRO Z690-A WIFI DDR4 v0.4.0 sha256 sha256.sig See how to verify signatures on this video Commands snippet: gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-0.x-compatible-with-msi-ms-7d25-signing-key.asc gpg --list-sigs \"3mdeb Master Key\" \"3mdeb Dasharo Master Key\" \"Dasharo release 0.x compatible with MSI MS-7D25 signing key\" wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.4.0/msi_ms7d25_v0.4.0.rom wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.4.0/msi_ms7d25_v0.4.0.rom.sha256 wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.4.0/msi_ms7d25_v0.4.0.rom.sha256.sig sha256sum -c msi_ms7d25_v0.4.0.rom.sha256 gpg --verify msi_ms7d25_v0.4.0.rom.sha256.sig msi_ms7d25_v0.4.0.rom.sha256 SBOM (Software Bill of Materials) coreboot based on a552cfc9 revision 31c1da6b edk2 based on 4d2846ba revision 5494c8e2 v0.3.0 - 2022-05-05 Added Mainboard-specific SMBIOS data for slots and ports PCI Subsystem ID configuration CPU VR and PCH FIVR configuration Memory HCL UEFI Secure Boot TPM Support Measured Boot Custom boot menu keys Known issues USB storage devices disappear after reboot/power failure Some PCIe ports are not working fTPM is not working Binaries MSI PRO Z690-A WIFI DDR4 v0.3.0 sha256 sha256.sig See how to verify signatures on this video Commands snippet: gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-0.x-compatible-with-msi-ms-7d25-signing-key.asc gpg --list-sigs \"3mdeb Master Key\" \"3mdeb Dasharo Master Key\" \"Dasharo release 0.x compatible with MSI MS-7D25 signing key\" wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.3.0/msi_ms7d25_v0.3.0.rom wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.3.0/msi_ms7d25_v0.3.0.rom.sha256 wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.3.0/msi_ms7d25_v0.3.0.rom.sha256.sig sha256sum -c msi_ms7d25_v0.3.0.rom.sha256 gpg --verify msi_ms7d25_v0.3.0.rom.sha256.sig msi_ms7d25_v0.3.0.rom.sha256 SBOM (Software Bill of Materials) coreboot based on a552cfc9 revision b45173e9 edk2 based on 4d2846ba revision 5494c8e2 v0.2.0 - 2022-04-22 Added Configurable boot order Configurable boot options NVMe support Integrated WiFi and BT support PCIe support Network boot with integrated Ethernet Audio support Known issues USB storage devices disappear after reboot/power failure Some PCIe ports are not working Binaries MSI PRO Z690-A WIFI DDR4 v0.2.0 sha256 sha256.sig See how to verify signatures on this video Commands snippet: gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-0.x-compatible-with-msi-ms-7d25-signing-key.asc gpg --list-sigs \"3mdeb Master Key\" \"3mdeb Dasharo Master Key\" \"Dasharo release 0.x compatible with MSI MS-7D25 signing key\" wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.2.0/msi_ms7d25_v0.2.0.rom wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.2.0/msi_ms7d25_v0.2.0.rom.sha256 wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.2.0/msi_ms7d25_v0.2.0.rom.sha256.sig sha256sum -c msi_ms7d25_v0.2.0.rom.sha256 gpg --verify msi_ms7d25_v0.2.0.rom.sha256.sig msi_ms7d25_v0.2.0.rom.sha256 SBOM (Software Bill of Materials) coreboot based on a552cfc9 revision 83fbdcf1 edk2 based on 4d2846ba revision 0a188758 v0.1.0 - 2022-04-13 Added Initial support for the MSI PRO Z690-A WIFI DDR4 platform Dasharo boot logo Dasharo SMBIOS compatibility UEFI compatibility UEFI shell One-time boot feature External HDMI and Display Port rear panel display support USB support Known issues USB storage devices disappear after reboot/power failure Binaries MSI PRO Z690-A WIFI DDR4 v0.1.0 sha256 sha256.sig See how to verify signatures on this video Commands snippet: gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-0.x-compatible-with-msi-ms-7d25-signing-key.asc gpg --list-sigs \"3mdeb Master Key\" \"3mdeb Dasharo Master Key\" \"Dasharo release 0.x compatible with MSI MS-7D25 signing key\" wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/msi_ms7d25_v0.1.0.rom wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/msi_ms7d25_v0.1.0.rom.sha256 wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/msi_ms7d25_v0.1.0.rom.sha256.sig sha256sum -c msi_ms7d25_v0.1.0.rom.sha256 gpg --verify msi_ms7d25_v0.1.0.rom.sha256.sig msi_ms7d25_v0.1.0.rom.sha256 SBOM (Software Bill of Materials) coreboot based on a552cfc9 revision 53948cd8 edk2 based on 4d2846ba revision 4d2846ba","title":"Releases"},{"location":"variants/msi_z690/releases/#release-notes","text":"Following Release Notes describe status of Open Source Firmware development for MSI PRO Z690-A (WIFI) DDR4 and MSI PRO Z690-A (WIFI). For details about our release process please read Dasharo Standard Release Process . Subscribe to Dasharo compatible with MSI PRO Z690-A Newsletter Test results for this platform can be found here .","title":"Release Notes"},{"location":"variants/msi_z690/releases/#v111-2023-02-23","text":"Test results for this release can be found here . To get more details about the changes one may read the Dasharo v1.1.1 release blog post","title":"v1.1.1 - 2023-02-23"},{"location":"variants/msi_z690/releases/#v110-2022-11-22","text":"","title":"v1.1.0 - 2022-11-22"},{"location":"variants/msi_z690/releases/#v100-2022-05-27","text":"","title":"v1.0.0 - 2022-05-27"},{"location":"variants/msi_z690/releases/#v040-2022-05-13","text":"","title":"v0.4.0 - 2022-05-13"},{"location":"variants/msi_z690/releases/#v030-2022-05-05","text":"","title":"v0.3.0 - 2022-05-05"},{"location":"variants/msi_z690/releases/#v020-2022-04-22","text":"","title":"v0.2.0 - 2022-04-22"},{"location":"variants/msi_z690/releases/#v010-2022-04-13","text":"","title":"v0.1.0 - 2022-04-13"},{"location":"variants/msi_z690/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Note, that the below-described test scope is used during Dasharo Certification Procedure for both tested platforms: MSI PRO Z690-A WiFi DDR4 and MSI PRO Z690-A DDR5 . Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. UEFI Shell USH All 4. Display ports and LCD support DSP DSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003 5. USB HID and MSC Support USB All 6. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001, DMI008.001 7. Custom boot logo CLG All 8. M.2 WiFi/Bluetooth WLE All 9. Audio subsystem AUD AUD001.001, AUD001.002, AUD004.001, AUD004.002 AUD005.001, AUD005.002 AUD006.001, AUD006.002 10. NVMe support NVM All 11. Network boot PXE Without PXE007.001 12. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 13. Windows booting WBT All 14. SD card support SDC All 15. Custom Boot Keys CBK All 16. Dasharo Tools Suite DTS DTS001.001, DTS002.001, DTS003.001, DTS004.001, DTS005.001, DTS006.001 17. CPU status CPU All 18. Platform suspend and resume SUSP Without SUSP004.001 19. Super I/O initialization - QubesOS PPS All 20. Device power control operations DPC All 21. Display resolution - QubesOS DSR All 22. SATA hot-plug detection SHT All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001, VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO All 5. ME disable/neuter support MNE All 6. BIOS lock support BLS All 7. SMM BIOS write protection SMM All 8. Early boot DMA protection EDP All 9. UEFI Setup password PSW All 10. Network stack enable/disable NBA All 11. USB stack enable/disable USS All Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All","title":"Test matrix"},{"location":"variants/msi_z690/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/msi_z690/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Note, that the below-described test scope is used during Dasharo Certification Procedure for both tested platforms: MSI PRO Z690-A WiFi DDR4 and MSI PRO Z690-A DDR5 .","title":"About"},{"location":"variants/msi_z690/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. UEFI Shell USH All 4. Display ports and LCD support DSP DSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003 5. USB HID and MSC Support USB All 6. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001, DMI008.001 7. Custom boot logo CLG All 8. M.2 WiFi/Bluetooth WLE All 9. Audio subsystem AUD AUD001.001, AUD001.002, AUD004.001, AUD004.002 AUD005.001, AUD005.002 AUD006.001, AUD006.002 10. NVMe support NVM All 11. Network boot PXE Without PXE007.001 12. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 13. Windows booting WBT All 14. SD card support SDC All 15. Custom Boot Keys CBK All 16. Dasharo Tools Suite DTS DTS001.001, DTS002.001, DTS003.001, DTS004.001, DTS005.001, DTS006.001 17. CPU status CPU All 18. Platform suspend and resume SUSP Without SUSP004.001 19. Super I/O initialization - QubesOS PPS All 20. Device power control operations DPC All 21. Display resolution - QubesOS DSR All 22. SATA hot-plug detection SHT All","title":"Module: Dasharo compatibility"},{"location":"variants/msi_z690/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001, VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO All 5. ME disable/neuter support MNE All 6. BIOS lock support BLS All 7. SMM BIOS write protection SMM All 8. Early boot DMA protection EDP All 9. UEFI Setup password PSW All 10. Network stack enable/disable NBA All 11. USB stack enable/disable USS All","title":"Module: Dasharo security"},{"location":"variants/msi_z790/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configuration used for validation of the coreboot port on the MSI PRO Z790-P workstation. For additional information, please check the FAQ section . MSI PRO Z790-P, SN: 601-7E06-030B2210001398 Component Description CPU Intel Core i5-13600K 3.5 GHz CPU cooler Noctua NH-U12S CPU Cooler RAM Slot 1: Kingston KF556C40BB-8 Slot 1: Kingston KF556C40BB-8 Slot 1: Kingston KF556C40BB-8 Slot 1: Kingston KF556C40BB-8 Flash memory Macronix MX25U25635F SSD Intel 670p 512 GB M26472-201 NVME USB pendrives 1. Adata C008 USB 2.0 16 GB 2. Kingston DataTraveler USB 3.2 16 GB SD cards SanDisk Ultra microSD HC I 16 GB Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p 3. 1-port USB Type-C Network Local network wired connection Power Supply SeaSonic FOCUS Plus Platinum Power Control Sonoff S20 EU type E Remote Testing Environment RTE v1.1.0 KVM PiKVM based on Raspberry Pi 4","title":"Hardware Configuration Matrix"},{"location":"variants/msi_z790/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/msi_z790/hardware-matrix/#introduction","text":"This document describes the hardware configuration used for validation of the coreboot port on the MSI PRO Z790-P workstation. For additional information, please check the FAQ section .","title":"Introduction"},{"location":"variants/msi_z790/hardware-matrix/#msi-pro-z790-p-sn-601-7e06-030b2210001398","text":"Component Description CPU Intel Core i5-13600K 3.5 GHz CPU cooler Noctua NH-U12S CPU Cooler RAM Slot 1: Kingston KF556C40BB-8 Slot 1: Kingston KF556C40BB-8 Slot 1: Kingston KF556C40BB-8 Slot 1: Kingston KF556C40BB-8 Flash memory Macronix MX25U25635F SSD Intel 670p 512 GB M26472-201 NVME USB pendrives 1. Adata C008 USB 2.0 16 GB 2. Kingston DataTraveler USB 3.2 16 GB SD cards SanDisk Ultra microSD HC I 16 GB Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p 3. 1-port USB Type-C Network Local network wired connection Power Supply SeaSonic FOCUS Plus Platinum Power Control Sonoff S20 EU type E Remote Testing Environment RTE v1.1.0 KVM PiKVM based on Raspberry Pi 4","title":"MSI PRO Z790-P, SN: 601-7E06-030B2210001398"},{"location":"variants/msi_z790/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Note, that the below-described test scope is used during Dasharo Certification Procedure for MSI PRO Z790-P platform. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. UEFI Shell USH All 4. Display ports and LCD support DSP DSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003 5. USB HID and MSC Support USB All 6. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001, DMI008.001 7. Custom boot logo CLG All 8. M.2 WiFi/Bluetooth WLE All 9. Audio subsystem AUD AUD001.001, AUD001.002, AUD004.001, AUD004.002 AUD005.001, AUD005.002 AUD006.001, AUD006.002 10. NVMe support NVM All 11. Network boot PXE Without PXE007.001 12. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 13. Windows booting WBT All 14. SD card support SDC All 15. Custom Boot Keys CBK All 16. Dasharo Tools Suite DTS DTS001.001, DTS002.001, DTS003.001, DTS004.001, DTS005.001, DTS006.001 17. CPU status CPU All 18. Platform suspend and resume SUSP Without SUSP004.001 19. Super I/O initialization - QubesOS PPS All 20. Device power control operations DPC All 21. Display resolution - QubesOS DSR All 22. SATA hot-plug detection SHT All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001, VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO All 5. ME disable/neuter support MNE All 6. BIOS lock support BLS All 7. SMM BIOS write protection SMM All 8. Early boot DMA protection EDP All 9. UEFI Setup password PSW All 10. Network stack enable/disable NBA All 11. USB stack enable/disable USS All Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All","title":"Test matrix"},{"location":"variants/msi_z790/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/msi_z790/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Note, that the below-described test scope is used during Dasharo Certification Procedure for MSI PRO Z790-P platform.","title":"About"},{"location":"variants/msi_z790/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. UEFI Shell USH All 4. Display ports and LCD support DSP DSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003 5. USB HID and MSC Support USB All 6. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001, DMI008.001 7. Custom boot logo CLG All 8. M.2 WiFi/Bluetooth WLE All 9. Audio subsystem AUD AUD001.001, AUD001.002, AUD004.001, AUD004.002 AUD005.001, AUD005.002 AUD006.001, AUD006.002 10. NVMe support NVM All 11. Network boot PXE Without PXE007.001 12. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 13. Windows booting WBT All 14. SD card support SDC All 15. Custom Boot Keys CBK All 16. Dasharo Tools Suite DTS DTS001.001, DTS002.001, DTS003.001, DTS004.001, DTS005.001, DTS006.001 17. CPU status CPU All 18. Platform suspend and resume SUSP Without SUSP004.001 19. Super I/O initialization - QubesOS PPS All 20. Device power control operations DPC All 21. Display resolution - QubesOS DSR All 22. SATA hot-plug detection SHT All","title":"Module: Dasharo compatibility"},{"location":"variants/msi_z790/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001, VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO All 5. ME disable/neuter support MNE All 6. BIOS lock support BLS All 7. SMM BIOS write protection SMM All 8. Early boot DMA protection EDP All 9. UEFI Setup password PSW All 10. Network stack enable/disable NBA All 11. USB stack enable/disable USS All","title":"Module: Dasharo security"},{"location":"variants/novacustom_ns5x_adl/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configurations used for validation of the coreboot port on the NovaCustom NS5x/7x laptops. Ports specification Right side view No. Description 1. Speaker 2. 2-In-1 Audio Jack (Headphone / Microphone) 3. MicroSD Card Reader 4. USB 2.0 Port 5. LED Indicator 6. Power Button 7. RJ-45 LAN Jack 8. Security Lock Slot Left side view No. Description 1. DC-In Jack 2. HDMI-Out Port 3. USB 3.2 Gen 2 Type-A Port 4. USB 3.2 Gen 2 Type-C Port 5. Thunderbolt 4 Port with Power Delivery (DC-IN) 6. Speaker The graphics used are from pages 17-18 of the official service manual for the NS51/70 platforms. NS5xPU Component Description CPU Intel(R) Core(TM) i5-1240P Internal Cooling RAM Slot 1: KVR32S22S8/8 Slot 2: KVR32S22S8/8 SSD Samsung SSD 990 PRO 1 TB Flash memory GigaDevice 25B1256EYIG 32 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 4.74A, 90 W NS7xPU Component Description CPU Intel(R) Core(TM) i7-1260P Internal Cooling RAM Slot 1: KVR32S22S8/8 Slot 2: KVR32S22S8/8 SSD Samsung SSD 980 PRO 250 GB Flash memory GigaDevice 25B1256EYIG 32 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 4.74A, 90 W","title":"Hardware Configuration Matrix"},{"location":"variants/novacustom_ns5x_adl/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/novacustom_ns5x_adl/hardware-matrix/#introduction","text":"This document describes the hardware configurations used for validation of the coreboot port on the NovaCustom NS5x/7x laptops.","title":"Introduction"},{"location":"variants/novacustom_ns5x_adl/hardware-matrix/#ports-specification","text":"","title":"Ports specification"},{"location":"variants/novacustom_ns5x_adl/hardware-matrix/#ns5xpu","text":"Component Description CPU Intel(R) Core(TM) i5-1240P Internal Cooling RAM Slot 1: KVR32S22S8/8 Slot 2: KVR32S22S8/8 SSD Samsung SSD 990 PRO 1 TB Flash memory GigaDevice 25B1256EYIG 32 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 4.74A, 90 W","title":"NS5xPU"},{"location":"variants/novacustom_ns5x_adl/hardware-matrix/#ns7xpu","text":"Component Description CPU Intel(R) Core(TM) i7-1260P Internal Cooling RAM Slot 1: KVR32S22S8/8 Slot 2: KVR32S22S8/8 SSD Samsung SSD 980 PRO 250 GB Flash memory GigaDevice 25B1256EYIG 32 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 4.74A, 90 W","title":"NS7xPU"},{"location":"variants/novacustom_ns5x_adl/post_install/","text":"Post-installation setup This document contains extra steps to perform after installing Dasharo in order to enable full functionality. Touchpad hotkey enablement (Linux) The touchpad hotkey needs extra setup to function correctly under Linux. To enable the touchpad hotkey to work under Linux, follow the steps below: Create a file /etc/udev/hwdb.d/60-keyboard.hwdb with the following contents: evdev:atkbd:dmi:bvn*:bvr*:svnNotebook:pnNS5x_NS7xPU:* KEYBOARD_KEY_f7 = 191 KEYBOARD_KEY_f8 = 191 Execute the following commands: sudo systemd-hwdb update sudo udevadm trigger After executing these steps, it should be possible to enable and disable the touchpad using the touchpad hotkey (Fn+F1) on the keyboard when using GNOME. Touchpad multi-touch support (NS7x / 17-inch model, Linux) On NS7x an additional fix is necessary to enable multi-touch on Linux. Create a file /etc/modprobe.d/blacklist-psmouse.conf with the following contents: blacklist psmouse and then run the following commands: sudo depmod -a sudo update-initramfs -u Now reboot your computer to apply the changes. Installing updates and drivers (Windows 11) Several features on Windows 11 (i. e. suspending the device) may not work or work unexpectedly without installing all of the updates and drivers. To install all of them, log into system, connect the device to the mains and Internet, then follow the steps below: Press the Windows button on the keypad. Type Windows Update Settings in the search and press Enter . Select the Check for updates bar to start installing available updates and drivers. During this process previously selected bar might be changed to Restart now or Retry , so click them if something hasn't been installed yet, something has gone wrong or restart is just required. The entire process may take up to 30 minutes. Select the Advanced options option in the Windows Update Settings window. Locate the Optional updates option and click on it. Select all displayed updates and drivers. Select the Download & Install bar to start installing additional updates and drivers. During this process previously selected bar might be changed to Restart now or Retry , so click them if something hasn't been installed yet, something has gone wrong or restart is just required. The entire process may take up to 30 minutes. Repeat all steps until all updates have been installed. Suspend fix for SATA disks (Windows and Linux) Only affects laptops with M.2 SATA disks experiencing sleep issues (the power LED not blinking while the laptop is suspended). Windows and certain Linux distros such as Ubuntu do not enable the necessary power saving tweaks to enable sleep mode while a SATA disk is installed. To apply the fix, run the following scripts Windows Download the script: link Double click on the script to install the tweak Linux Download the script: link Execute as root: chmod +x install_dipm_service.sh sudo ./install_dipm_service.sh","title":"Post-installation setup"},{"location":"variants/novacustom_ns5x_adl/post_install/#post-installation-setup","text":"This document contains extra steps to perform after installing Dasharo in order to enable full functionality.","title":"Post-installation setup"},{"location":"variants/novacustom_ns5x_adl/post_install/#touchpad-hotkey-enablement-linux","text":"The touchpad hotkey needs extra setup to function correctly under Linux. To enable the touchpad hotkey to work under Linux, follow the steps below: Create a file /etc/udev/hwdb.d/60-keyboard.hwdb with the following contents: evdev:atkbd:dmi:bvn*:bvr*:svnNotebook:pnNS5x_NS7xPU:* KEYBOARD_KEY_f7 = 191 KEYBOARD_KEY_f8 = 191 Execute the following commands: sudo systemd-hwdb update sudo udevadm trigger After executing these steps, it should be possible to enable and disable the touchpad using the touchpad hotkey (Fn+F1) on the keyboard when using GNOME.","title":"Touchpad hotkey enablement (Linux)"},{"location":"variants/novacustom_ns5x_adl/post_install/#touchpad-multi-touch-support-ns7x-17-inch-model-linux","text":"On NS7x an additional fix is necessary to enable multi-touch on Linux. Create a file /etc/modprobe.d/blacklist-psmouse.conf with the following contents: blacklist psmouse and then run the following commands: sudo depmod -a sudo update-initramfs -u Now reboot your computer to apply the changes.","title":"Touchpad multi-touch support (NS7x / 17-inch model, Linux)"},{"location":"variants/novacustom_ns5x_adl/post_install/#installing-updates-and-drivers-windows-11","text":"Several features on Windows 11 (i. e. suspending the device) may not work or work unexpectedly without installing all of the updates and drivers. To install all of them, log into system, connect the device to the mains and Internet, then follow the steps below: Press the Windows button on the keypad. Type Windows Update Settings in the search and press Enter . Select the Check for updates bar to start installing available updates and drivers. During this process previously selected bar might be changed to Restart now or Retry , so click them if something hasn't been installed yet, something has gone wrong or restart is just required. The entire process may take up to 30 minutes. Select the Advanced options option in the Windows Update Settings window. Locate the Optional updates option and click on it. Select all displayed updates and drivers. Select the Download & Install bar to start installing additional updates and drivers. During this process previously selected bar might be changed to Restart now or Retry , so click them if something hasn't been installed yet, something has gone wrong or restart is just required. The entire process may take up to 30 minutes. Repeat all steps until all updates have been installed.","title":"Installing updates and drivers (Windows 11)"},{"location":"variants/novacustom_ns5x_adl/post_install/#suspend-fix-for-sata-disks-windows-and-linux","text":"Only affects laptops with M.2 SATA disks experiencing sleep issues (the power LED not blinking while the laptop is suspended). Windows and certain Linux distros such as Ubuntu do not enable the necessary power saving tweaks to enable sleep mode while a SATA disk is installed. To apply the fix, run the following scripts","title":"Suspend fix for SATA disks (Windows and Linux)"},{"location":"variants/novacustom_ns5x_adl/releases/","text":"NovaCustom NS5x/NS7x ADL (12th Gen) Dasharo Release Notes Following Release Notes describe status of open-source firmware development for NovaCustom NS5x/NS7x ADL (12th Gen) For details about our release process please read Dasharo Standard Release Process . Subscribe to NovaCustom NS5x/NS7x ADL (12th Gen) Dasharo Release Newsletter v1.6.0 - 2023-04-07 Test results for this release can be found here . Added Intel Management Engine Disable The same keyboard illumination setting is restored after suspend or poweroff One of the two fan profiles can now be selected in Setup Menu Fn lock hotkey feature Setup menu option for switching between S0ix and S3 suspend mode Changed Keys must be provisioned prior enabling Secure Boot The function keys responsible for entering the setup and boot menu in BIOS have been changed from ESC/F12 to F2/F7 Fixed Waking up from sleep on Ubuntu 22.04 is not 100% reliable (Dasharo issue #205) The connected RJ45 cable to the Ethernet socket causes a hardware error on Windows 11 (Dasharo issue #264) Laptop not starting after fully discharging (NS70PU) (Dasharo issue #287) The Auto Boot time-out value is not respected (Dasharo issue #292) ACPI boot errors during booting Ubuntu 22.04 (Dasharo issue #293) Windows update KB5012170 cannot be installed (Dasharo issue #294) Internal keyboard sometimes does not work in firmware (Dasharo issue #295) SMMStore sometimes gets wiped out by UEFI payload on NovaCustom ADL laptops (Dasharo issue #298) Known issues The power LED is not always blinking while in sleep mode on Windows 11 (Dasharo issue #182) Suspend does not work correctly while a SATA disk is installed (Dasharo issue #230) Touchpad isn't work on Debian 11.3 (Dasharo issue #240) Sleep sometimes not working (Dasharo issue #261) Popup with information about recovery mode is displayed after flashing with a valid binary (Dasharo issue #269) Missing information about cache (Dasharo issue #343) Keyboard backlight not working after restart (Dasharo issue #349) Connecting and immediately disconnecting the charger, sets the battery status in OS to charging for about 2 minutes (Dasharo issue #350) Reset to defaults with F9 causes the wrong settings to be restored (Dasharo issue #355) Laptop not suspending while connected to a USB-C docking station (Dasharo issue #368) Keyboard backlight brightness is not properly restored after cold-boot (Dasharo issue #402) After changing the Intel ME mode the Reset option in the setup menu turns off the device (Dasharo issue #403) The docking station is not detected after cold-boot and warm-boot (Dasharo issue #404) Binaries novacustom_ns5x_adl_ec_v1.6.0.rom sha256 sha256.sig novacustom_ns5x_adl_v1.6.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) Dasharo coreboot fork based on 1a8eb6c02103727431ac1ea23f4f507e49f3cde7 revision ae10b20f Dasharo EDKII fork based on e0334c228ce4ba51f47ff79a118f214031d4650f revision bd421b40 Intel ME version 16.1.25.1865 v1.5.0 - Non-public engineering release v1.4.0 - 2022-11-06 Test results for this release can be found here . Added Support for NovaCustom NS5x/NS7x 12th Gen UEFI Boot Support Configurable boot order Configurable boot options UEFI Secure Boot support NovaCustom boot logo Vboot Verified Boot Vboot recovery mode information popup Dasharo setup menu full screen mode support Support for RGB backlit keyboard Support for open-source EC firmware Known issues The power LED is not always blinking while in sleep mode on Windows 11 (Dasharo issue #182) Suspend does not work correctly while a SATA disk is installed (Dasharo issue #230) Binaries novacustom_ns5x_adl_ec_v1.4.0.rom sha256 sha256.sig novacustom_ns5x_adl_v1.4.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) Dasharo coreboot fork based on 1a8eb6c02103 revision cf81af26 Dasharo EDKII fork based on dd7523b5b123 revision abfdef40","title":"Releases"},{"location":"variants/novacustom_ns5x_adl/releases/#novacustom-ns5xns7x-adl-12th-gen-dasharo-release-notes","text":"Following Release Notes describe status of open-source firmware development for NovaCustom NS5x/NS7x ADL (12th Gen) For details about our release process please read Dasharo Standard Release Process . Subscribe to NovaCustom NS5x/NS7x ADL (12th Gen) Dasharo Release Newsletter","title":"NovaCustom NS5x/NS7x ADL (12th Gen) Dasharo Release Notes"},{"location":"variants/novacustom_ns5x_adl/releases/#v160-2023-04-07","text":"Test results for this release can be found here .","title":"v1.6.0 - 2023-04-07"},{"location":"variants/novacustom_ns5x_adl/releases/#v150-non-public-engineering-release","text":"","title":"v1.5.0 - Non-public engineering release"},{"location":"variants/novacustom_ns5x_adl/releases/#v140-2022-11-06","text":"Test results for this release can be found here .","title":"v1.4.0 - 2022-11-06"},{"location":"variants/novacustom_ns5x_adl/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests to which the DUT is subjected before the release of the new binary. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports and LCD support DSP DSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002 4. Embedded Controller and Super I/O initialization ECR Without ECR010.001, ECR010.002, ECR25.001, ECR26.001, ECR27.001, ECR28.001 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot keys CBK All 8. USB HID and MSC Support USB All 9. Debian Stable and Ubuntu LTS support LBT LBT004.001, LBT004.002 10. UEFI Shell USH All 11. Windows booting WBT WBT001.001 12. Audio subsystem AUD All 13. USB-C support UTC All 14. Network boot PXE Without PXE007.001 15. M.2 WiFi/Bluetooth WLE All 16. SD card support SDC All 17. USB Camera verification CAM All 18. Fan speed measure FAN FAN001.001 19. SMBIOS DMI Without DMI001.001 20. Firmware update using fwupd FFW All 21. Dasharo Tools Suite DTS DTS006.001, DTS007.001 22. CPU status CPU All 23. Embedded controller flashing ECF All 24. Logo customization functionality LCM LCM001.001 25. Firmware locally building and flashing FLB All 26. Custom Boot Order CBO CBO001.002 27. QubesOS support QBS All 28. Fedora support FED All 29. Platform suspend and resume SUSP Without SUSP004.001 and SUSP006.001 30. BIOS menu function keys BMF All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO Without SBO006.001, SBO007.001 and SBO008.001 5. ME disable/neuter support MNE Without MNE006.001 Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot boot measure CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All 4. Custom fan curve CFC All 5. Platform stability STB All Module: Dasharo stability No. Supported test suite Test suite ID Supported test cases 1. USB Type-A devices detection SUD All 2. M.2 Wi-fi SMW All 3. NVMe detection SNV All 4. NET interface after coldboot/warmboot/reboot/suspend NET All","title":"Test matrix"},{"location":"variants/novacustom_ns5x_adl/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/novacustom_ns5x_adl/test-matrix/#about","text":"The test matrix is used to determine the scope of tests to which the DUT is subjected before the release of the new binary.","title":"About"},{"location":"variants/novacustom_ns5x_adl/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports and LCD support DSP DSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002 4. Embedded Controller and Super I/O initialization ECR Without ECR010.001, ECR010.002, ECR25.001, ECR26.001, ECR27.001, ECR28.001 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot keys CBK All 8. USB HID and MSC Support USB All 9. Debian Stable and Ubuntu LTS support LBT LBT004.001, LBT004.002 10. UEFI Shell USH All 11. Windows booting WBT WBT001.001 12. Audio subsystem AUD All 13. USB-C support UTC All 14. Network boot PXE Without PXE007.001 15. M.2 WiFi/Bluetooth WLE All 16. SD card support SDC All 17. USB Camera verification CAM All 18. Fan speed measure FAN FAN001.001 19. SMBIOS DMI Without DMI001.001 20. Firmware update using fwupd FFW All 21. Dasharo Tools Suite DTS DTS006.001, DTS007.001 22. CPU status CPU All 23. Embedded controller flashing ECF All 24. Logo customization functionality LCM LCM001.001 25. Firmware locally building and flashing FLB All 26. Custom Boot Order CBO CBO001.002 27. QubesOS support QBS All 28. Fedora support FED All 29. Platform suspend and resume SUSP Without SUSP004.001 and SUSP006.001 30. BIOS menu function keys BMF All","title":"Module: Dasharo compatibility"},{"location":"variants/novacustom_ns5x_adl/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO Without SBO006.001, SBO007.001 and SBO008.001 5. ME disable/neuter support MNE Without MNE006.001","title":"Module: Dasharo security"},{"location":"variants/novacustom_ns5x_adl/test-matrix/#module-dasharo-performance","text":"No. Supported test suite Test suite ID Supported test cases 1. coreboot boot measure CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All 4. Custom fan curve CFC All 5. Platform stability STB All","title":"Module: Dasharo performance"},{"location":"variants/novacustom_ns5x_adl/test-matrix/#module-dasharo-stability","text":"No. Supported test suite Test suite ID Supported test cases 1. USB Type-A devices detection SUD All 2. M.2 Wi-fi SMW All 3. NVMe detection SNV All 4. NET interface after coldboot/warmboot/reboot/suspend NET All","title":"Module: Dasharo stability"},{"location":"variants/novacustom_ns5x_tgl/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configurations used for validation of the coreboot port on the NovaCustom NS51/NS70 laptops. Ports specification Right side view No. Description 1. Speaker 2. 2-In-1 Audio Jack (Headphone / Microphone) 3. MicroSD Card Reader 4. USB 2.0 Port 5. LED Indicator 6. Power Button 7. RJ-45 LAN Jack 8. Security Lock Slot Left side view No. Description 1. DC-In Jack 2. HDMI-Out Port 3. USB 3.2 Gen 2 Type-A Port 4. USB 3.2 Gen 2 Type-C Port 5. Thunderbolt 4 Port with Power Delivery (DC-IN) 6. Speaker The graphics used are from pages 17-18 of the official service manual for the NS51/70 platforms. NS51 Component Description CPU Intel(R) Core(TM) i5-1135G7 Internal Cooling RAM Slot 1: KVR32S22D8/16 Slot 2: KVR32S22D8/16 SSD 1. Samsung SSD 980 PRO 250 GB 2. Samsung SSD 980 PRO 500 GB Flash memory Winbond 25Q128JVSQ 2118 16 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 3.42A, 65 W NS70 Component Description CPU Intel(R) Core(TM) i5-1135G7 Internal Cooling RAM Slot 1: KVR32S22S8/8 Slot 2: KVR32S22S8/8 SSD Samsung SSD 980 1 TB Flash memory GigaDevice 25B127DSIG 16 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 3.42A, 65 W","title":"Hardware Configuration Matrix"},{"location":"variants/novacustom_ns5x_tgl/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/novacustom_ns5x_tgl/hardware-matrix/#introduction","text":"This document describes the hardware configurations used for validation of the coreboot port on the NovaCustom NS51/NS70 laptops.","title":"Introduction"},{"location":"variants/novacustom_ns5x_tgl/hardware-matrix/#ports-specification","text":"","title":"Ports specification"},{"location":"variants/novacustom_ns5x_tgl/hardware-matrix/#ns51","text":"Component Description CPU Intel(R) Core(TM) i5-1135G7 Internal Cooling RAM Slot 1: KVR32S22D8/16 Slot 2: KVR32S22D8/16 SSD 1. Samsung SSD 980 PRO 250 GB 2. Samsung SSD 980 PRO 500 GB Flash memory Winbond 25Q128JVSQ 2118 16 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 3.42A, 65 W","title":"NS51"},{"location":"variants/novacustom_ns5x_tgl/hardware-matrix/#ns70","text":"Component Description CPU Intel(R) Core(TM) i5-1135G7 Internal Cooling RAM Slot 1: KVR32S22S8/8 Slot 2: KVR32S22S8/8 SSD Samsung SSD 980 1 TB Flash memory GigaDevice 25B127DSIG 16 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 3.42A, 65 W","title":"NS70"},{"location":"variants/novacustom_ns5x_tgl/releases/","text":"NovaCustom NS5x/NS7x TGL (11th Gen) Dasharo Release Notes Following Release Notes describe the status of Open Source Firmware development for NovaCustom NS5x/7x. For details about our release process please read Dasharo Standard Release Process . Subscribe to NovaCustom NS5x/7x Dasharo Release Newsletter Test results for this platform can be found here . v1.4.0 - 2023-03-02 Added The same keyboard illumination setting is restored after suspend or poweroff One of the two fan profiles can now be selected in Setup Menu Fn lock hotkey feature Changed Keys must be provisioned prior enabling Secure Boot Trackpad no longer working after 1.3.0 upgrade from 1.1.0 (Dasharo issue #313) Known issues Low level interfering crackling/popping of the speakers while playing no sound (Dasharo issue #224) The power LED is not always blinking while in sleep mode on Windows 11 (Dasharo issue #182) Keyboard backlight turns on after resuming from sleep mode (Dasharo issue #332) The screen brightness level gets stuck when key are held or pressed too fast (Dasharo issue #341) Connecting and immediately disconnecting the charger, sets the battery status in OS to 'charging' for about 2 minutes (Dasharo issue #350) Reset to defaults with F9 causes the wrong settings to be restored (Dasharo issue #355) Connecting the RJ45 cable to the Gigabit Ethernet port on the docking station does not result in obtaining an Internet connection (Dasharo issue #356) Unable to login to Windows 11 with the docking station connected (Dasharo issue #357) Binaries novacustom_ns5x_tgl_ec_v1.4.0.rom sha256 sha256.sig novacustom_ns5x_tgl_v1.4.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 1a8eb6c02103727431ac1ea23f4f507e49f3cde7 revision 636f432a EDK2 based on e0334c228ce4ba51f47ff79a118f214031d4650f revision 2c61576a Intel ME version 15.0.30.1776 v1.3.0 - 2022-09-01 EC firmware transition Please note, that version 1.3.0 of Dasharo BIOS firmware works correctly only with the Dasharo EC firmware . This is the first release when this open-source EC firmware is used, so additional steps need to be taken when upgrading. Please refer to the Firmware update section for more details on upgrading your firmware. Added Enabled Vboot Verified Boot Vboot Recovery Popup Fullscreen setup menu Changed Rebased on upstream coreboot revision 1a8eb6c0 Support for Open EC Firmware Disabled UEFI Secure Boot by default Fixed The touchpad ON/OFF switch Fn key is not functional Binaries novacustom_ns5x_v1.3.0.rom sha256 sha256.sig novacustom_ns5x_v1.3.0_ec.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 1a8eb6c02103727431ac1ea23f4f507e49f3cde7 revision 1153a18d EDK2 based on e0334c228ce4ba51f47ff79a118f214031d4650f revision abfdef40 v1.2.0 - 2022-05-26 Added Persistent RGB keyboard settings Increased power limits to CPU defaults (28W PL1 / 35W PL2) Fixed CVE-2022-29264 SMM loader vulnerability Incorrect vendor name in SMBIOS Known issues CPU not running on expected frequency and usage NS50MU UCM-UCSI ACPI device displays an error in Windows Device Manager Headsets connected to the docking station are not recognizable on NS70/50 v1.2.0 General problem with charging the DUT via the docking station using USB Type-C slot NS70/50 v1.2.0 Binaries novacustom_ns5x_v1.2.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 4.16 revision b087dcbd tianocore based on e0334c228ce4ba51f47ff79a118f214031d4650f revision 90364638 v1.1.0 - 2022-04-22 Added Support for NovaCustom NS7x Support for RGB Keyboard Persistent boot logo implementation Changed Temporarily disable vboot due to the risk of bricinkg certain units when flashing via internal programmer Known issues CPU not running on expected frequency and usage NS50MU UCM-UCSI ACPI device displays an error in Windows Device Manager The touchpad ON/OFF switch Fn key is not functional Incorrect vendor name in SMBIOS Binaries novacustom_ns5x_v1.1.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 4.16 revision c2f031af tianocore based on e0334c228ce4ba51f47ff79a118f214031d4650f revision 4d2846ba v1.0.0 - 2022-03-23 Added Support for NovaCustom NS5x Support for EC firmware 1.07.07 UEFI Boot Support Configurable boot order Configurable boot options UEFI Secure Boot support NovaCustom boot logo Known issues The touchpad ON/OFF switch Fn key is not functional Binaries novacustom_ns5x_v1.0.0.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on 4.16 revision ecf1e9b8 tianocore based on e0334c228ce4ba51f47ff79a118f214031d4650f revision ec6805c2","title":"Releases"},{"location":"variants/novacustom_ns5x_tgl/releases/#novacustom-ns5xns7x-tgl-11th-gen-dasharo-release-notes","text":"Following Release Notes describe the status of Open Source Firmware development for NovaCustom NS5x/7x. For details about our release process please read Dasharo Standard Release Process . Subscribe to NovaCustom NS5x/7x Dasharo Release Newsletter Test results for this platform can be found here .","title":"NovaCustom NS5x/NS7x TGL (11th Gen) Dasharo Release Notes"},{"location":"variants/novacustom_ns5x_tgl/releases/#v140-2023-03-02","text":"","title":"v1.4.0 - 2023-03-02"},{"location":"variants/novacustom_ns5x_tgl/releases/#v130-2022-09-01","text":"","title":"v1.3.0 - 2022-09-01"},{"location":"variants/novacustom_ns5x_tgl/releases/#v120-2022-05-26","text":"","title":"v1.2.0 - 2022-05-26"},{"location":"variants/novacustom_ns5x_tgl/releases/#v110-2022-04-22","text":"","title":"v1.1.0 - 2022-04-22"},{"location":"variants/novacustom_ns5x_tgl/releases/#v100-2022-03-23","text":"","title":"v1.0.0 - 2022-03-23"},{"location":"variants/novacustom_ns5x_tgl/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests to which the DUT is subjected before the release of the new binary. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports and LCD support DSP DSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002 4. Embedded Controller and Super I/O initialization ECR Without ECR010.001, ECR010.002, ECR25.001, ECR26.001, ECR27.001, ECR28.001 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB All 9. Debian Stable and Ubuntu LTS support LBT LBT004.001, LBT004.002 10. UEFI Shell USH All 11. Windows booting WBT WBT001.001 12. Audio subsystem AUD All 13. USB-C support UTC All 14. Network boot PXE Without PXE007.001 15. M.2 WiFi/Bluetooth WLE All 16. SD card support SDC All 17. USB Camera verification CAM All 18. Fan speed measure FAN FAN001.001 19. SMBIOS DMI Without DMI001.001 20. Firmware update using fwupd FFW All 21. Dasharo Tools Suite DTS DTS006.001, DTS007.001 22. CPU status CPU All 23. Embedded controller flashing ECF All 24. Logo customization functionality LCM LCM001.001 25. Firmware locally building and flashing FLB All 26. Custom Boot Order CBO CBO001.002 27. QubesOS support QBS All 28. Fedora support FED All 29. Platform suspend and resume SUSP SUSP001.001, SUSP002.001, SUSP003.001 30. Sign of life SOL All 31. BIOS menu function keys BMF All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO Without SBO006.001, SBO007.001 and SBO008.001 5. ME disable/neuter support MNE Without MNE006.001 Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot boot measure CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All 4. Custom fan curve CFC All 5. Platform stability STB All Module: Dasharo stability No. Supported test suite Test suite ID Supported test cases 1. USB Type-A devices detection SUD All 2. M.2 Wi-fi SMW All 3. NVMe detection SNV All 4. NET interface after coldboot/warmboot/reboot/suspend NET All","title":"Test matrix"},{"location":"variants/novacustom_ns5x_tgl/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/novacustom_ns5x_tgl/test-matrix/#about","text":"The test matrix is used to determine the scope of tests to which the DUT is subjected before the release of the new binary.","title":"About"},{"location":"variants/novacustom_ns5x_tgl/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports and LCD support DSP DSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002 4. Embedded Controller and Super I/O initialization ECR Without ECR010.001, ECR010.002, ECR25.001, ECR26.001, ECR27.001, ECR28.001 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB All 9. Debian Stable and Ubuntu LTS support LBT LBT004.001, LBT004.002 10. UEFI Shell USH All 11. Windows booting WBT WBT001.001 12. Audio subsystem AUD All 13. USB-C support UTC All 14. Network boot PXE Without PXE007.001 15. M.2 WiFi/Bluetooth WLE All 16. SD card support SDC All 17. USB Camera verification CAM All 18. Fan speed measure FAN FAN001.001 19. SMBIOS DMI Without DMI001.001 20. Firmware update using fwupd FFW All 21. Dasharo Tools Suite DTS DTS006.001, DTS007.001 22. CPU status CPU All 23. Embedded controller flashing ECF All 24. Logo customization functionality LCM LCM001.001 25. Firmware locally building and flashing FLB All 26. Custom Boot Order CBO CBO001.002 27. QubesOS support QBS All 28. Fedora support FED All 29. Platform suspend and resume SUSP SUSP001.001, SUSP002.001, SUSP003.001 30. Sign of life SOL All 31. BIOS menu function keys BMF All","title":"Module: Dasharo compatibility"},{"location":"variants/novacustom_ns5x_tgl/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO Without SBO006.001, SBO007.001 and SBO008.001 5. ME disable/neuter support MNE Without MNE006.001","title":"Module: Dasharo security"},{"location":"variants/novacustom_ns5x_tgl/test-matrix/#module-dasharo-performance","text":"No. Supported test suite Test suite ID Supported test cases 1. coreboot boot measure CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All 4. Custom fan curve CFC All 5. Platform stability STB All","title":"Module: Dasharo performance"},{"location":"variants/novacustom_ns5x_tgl/test-matrix/#module-dasharo-stability","text":"No. Supported test suite Test suite ID Supported test cases 1. USB Type-A devices detection SUD All 2. M.2 Wi-fi SMW All 3. NVMe detection SNV All 4. NET interface after coldboot/warmboot/reboot/suspend NET All","title":"Module: Dasharo stability"},{"location":"variants/novacustom_nv4x_adl/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configurations used for validation of the coreboot port on the NovaCustom NV4X laptop. Ports specification Right side view No. Description 1. Speaker 2. 2-In-1 Audio Jack (Headphone / Microphone) 3. USB 3.2 Gen 2 Type-C Port 4. USB 3.2 Gen 2 Type-A Port 5. HDMI-Out Port 6. Power Button 7. DC-In Jack 8. Led Indicator Left side view No. Description 1. Security Lock Slot 2. RJ-45 LAN Jack 3. USB 3.2 Gen 2 Type-A Port 4. SD Card Reader 5. Thunderbolt 4 Port with Power Delivery (DC-IN) 6. Speaker The graphics used are from pages 17-18 of the official service manual for the NV41 platforms. NV41PZ Component Description CPU Intel(R) Core(TM) i5-1240P Internal Cooling RAM Slot 1: KVR32S22S8/8 Slot 2: KVR32S22S8/8 SSD Samsung SSD 980 PRO 250 GB Flash memory Macronix MX25L25673GZ4I-08G USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 4.74A, 90 W","title":"Hardware Configuration Matrix"},{"location":"variants/novacustom_nv4x_adl/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/novacustom_nv4x_adl/hardware-matrix/#introduction","text":"This document describes the hardware configurations used for validation of the coreboot port on the NovaCustom NV4X laptop.","title":"Introduction"},{"location":"variants/novacustom_nv4x_adl/hardware-matrix/#ports-specification","text":"","title":"Ports specification"},{"location":"variants/novacustom_nv4x_adl/hardware-matrix/#nv41pz","text":"Component Description CPU Intel(R) Core(TM) i5-1240P Internal Cooling RAM Slot 1: KVR32S22S8/8 Slot 2: KVR32S22S8/8 SSD Samsung SSD 980 PRO 250 GB Flash memory Macronix MX25L25673GZ4I-08G USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 4.74A, 90 W","title":"NV41PZ"},{"location":"variants/novacustom_nv4x_adl/releases/","text":"NovaCustom NV4x ADL (12th Gen) Dasharo Release Notes Following Release Notes describe status of open-source firmware development for NovaCustom NV4x ADL (12th Gen) For details about our release process please read Dasharo Standard Release Process . Subscribe to NovaCustom NV4x ADL (12th Gen) Dasharo Release Newsletter Test results for this platform can be found here . v1.6.0 - 2023-04-19 Added Intel Management Engine Disable The same keyboard illumination setting is restored after suspend or poweroff One of the two fan profiles can now be selected in Setup Menu Fn lock hotkey feature Setup menu option for switching between S0ix and S3 suspend mode Changed Keys must be provisioned prior enabling Secure Boot The function keys responsible for entering the setup and boot menu in BIOS have been changed from ESC/F12 to F2/F7 Fixed The power LED is not always blinking while in sleep mode on Ubuntu 22.04 (#260) Suspend mode not working under Qubes OS 4.1 (#266) Docking station under Qubes OS (#267) The Auto Boot time-out value is not respected (#292) ACPI boot errors during booting Ubuntu 22.04 (#293) Windows update KB5012170 cannot be installed (#294) Internal keyboard sometimes does not work in firmware (#295) Laptop hangs up after 20 cycles of the suspend procedure (#305) Keyboard backlight not working after restart (#349) Function key display on/off does not completely blank the screen (#354) Connecting the RJ45 cable to the Gigabit Ethernet port on the docking station does not result in obtaining an Internet connection (#356) Unable to wake up from suspend (#362) Known issues The power LED is not always blinking while in sleep mode on Windows 11 (#182) Popup with information about recovery mode is displayed after flashing with a valid binary (#269) Missing information about cache (#343) Connecting and immediately disconnecting the charger, sets the battery status in OS to charging for about 2 minutes (#350) Reset to defaults with F9 causes the wrong settings to be restored (#355) Unwanted reset of BIOS settings (#365) Laptop not suspending while connected to a USB-C docking station (#368) The docking station is not detected after cold-boot and warm-boot (#404) Binaries novacustom_nv4x_adl_ec_v1.6.0.rom sha256 sha256.sig novacustom_nv4x_adl_v1.6.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) Dasharo coreboot fork based on 1a8eb6c02103727431ac1ea23f4f507e49f3cde7 revision a3056ac5 Dasharo EDKII fork based on e0334c228ce4ba51f47ff79a118f214031d4650f revision bd421b40 Intel ME version 16.1.25.1865 v1.5.0 - Non-public engineering release v1.4.0 - 2022-12-13 Added Support for NovaCustom NV4x 12th Gen UEFI Boot Support Configurable boot order Configurable boot options UEFI Secure Boot support NovaCustom boot logo Vboot Verified Boot Vboot Recovery Popup Fullscreen setup menu Open-source Embedded Controller Firmware Fixed The external headset connected to the jack slot doesn't work ISO keyboard issue for non-US layouts NV4xMx Sleep sometimes not working The connected RJ45 cable to the Ethernet socket causes a hardware error on Windows 11 The touchpad ON/OFF switch Fn key is not functional Known issues Popup with information about recovery mode is displayed after flashing with a valid binary The power LED is not blinking during sleep mode when the docking station is connected on Windows 11 Binaries novacustom_nv4x_adl_ec_v1.4.0.rom sha256 sha256.sig novacustom_nv4x_adl_v1.4.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) Dasharo coreboot fork based on 1a8eb6c02103727431ac1ea23f4f507e49f3cde7 revision cd975d74 Dasharo EDKII fork based on e0334c228ce4ba51f47ff79a118f214031d4650f revision abfdef40","title":"Releases"},{"location":"variants/novacustom_nv4x_adl/releases/#novacustom-nv4x-adl-12th-gen-dasharo-release-notes","text":"Following Release Notes describe status of open-source firmware development for NovaCustom NV4x ADL (12th Gen) For details about our release process please read Dasharo Standard Release Process . Subscribe to NovaCustom NV4x ADL (12th Gen) Dasharo Release Newsletter Test results for this platform can be found here .","title":"NovaCustom NV4x ADL (12th Gen) Dasharo Release Notes"},{"location":"variants/novacustom_nv4x_adl/releases/#v160-2023-04-19","text":"","title":"v1.6.0 - 2023-04-19"},{"location":"variants/novacustom_nv4x_adl/releases/#v150-non-public-engineering-release","text":"","title":"v1.5.0 - Non-public engineering release"},{"location":"variants/novacustom_nv4x_adl/releases/#v140-2022-12-13","text":"","title":"v1.4.0 - 2022-12-13"},{"location":"variants/novacustom_nv4x_adl/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports and LCD support DSP DSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002 4. Embedded Controller and Super I/O initialization ECR Without ECR021.xxx - ECR024.xxx, ECR25.001, ECR26.001, ECR27.001, ECR28.001 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot keys CBK All 8. USB HID and MSC Support USB All 9. Debian Stable and Ubuntu LTS support LBT LBT004.001, LBT004.002 10. UEFI Shell USH All 11. Windows booting WBT WBT001.001 12. Audio subsystem AUD All 13. USB-C support UTC All 14. Network boot PXE Without PXE007.001 15. M.2 WiFi/Bluetooth WLE All 16. SD card support SDC All 17. USB Camera verification CAM All 18. Fan speed measure FAN FAN001.001 19. SMBIOS DMI Without DMI001.001 20. Firmware update using fwupd FFW All 21. Dasharo Tools Suite DTS DTS006.001, DTS007.001 22. CPU status CPU All 23. Embedded controller flashing ECF All 24. Logo customization functionality LCM LCM001.001 25. Firmware locally building and flashing FLB All 26. Custom Boot Order CBO CBO001.002 27. QubesOS support QBS All 28. Fedora support FED All 29. Platform suspend and resume SUSP Without SUSP004.001 30. BIOS menu function keys BMF All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO Without SBO006.001, SBO007.001 and SBO008.001 5. ME disable/neuter support MNE Without MNE006.001 Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot boot measure CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All 4. Custom fan curve CFC All 5. Platform stability STB All Module: Dasharo stability No. Supported test suite Test suite ID Supported test cases 1. USB Type-A devices detection SUD All 2. M.2 Wi-fi SMW All 3. NVMe detection SNV All 4. NET interface after coldboot/warmboot/reboot/suspend NET All","title":"Test matrix"},{"location":"variants/novacustom_nv4x_adl/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/novacustom_nv4x_adl/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"About"},{"location":"variants/novacustom_nv4x_adl/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports and LCD support DSP DSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002 4. Embedded Controller and Super I/O initialization ECR Without ECR021.xxx - ECR024.xxx, ECR25.001, ECR26.001, ECR27.001, ECR28.001 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot keys CBK All 8. USB HID and MSC Support USB All 9. Debian Stable and Ubuntu LTS support LBT LBT004.001, LBT004.002 10. UEFI Shell USH All 11. Windows booting WBT WBT001.001 12. Audio subsystem AUD All 13. USB-C support UTC All 14. Network boot PXE Without PXE007.001 15. M.2 WiFi/Bluetooth WLE All 16. SD card support SDC All 17. USB Camera verification CAM All 18. Fan speed measure FAN FAN001.001 19. SMBIOS DMI Without DMI001.001 20. Firmware update using fwupd FFW All 21. Dasharo Tools Suite DTS DTS006.001, DTS007.001 22. CPU status CPU All 23. Embedded controller flashing ECF All 24. Logo customization functionality LCM LCM001.001 25. Firmware locally building and flashing FLB All 26. Custom Boot Order CBO CBO001.002 27. QubesOS support QBS All 28. Fedora support FED All 29. Platform suspend and resume SUSP Without SUSP004.001 30. BIOS menu function keys BMF All","title":"Module: Dasharo compatibility"},{"location":"variants/novacustom_nv4x_adl/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO Without SBO006.001, SBO007.001 and SBO008.001 5. ME disable/neuter support MNE Without MNE006.001","title":"Module: Dasharo security"},{"location":"variants/novacustom_nv4x_adl/test-matrix/#module-dasharo-performance","text":"No. Supported test suite Test suite ID Supported test cases 1. coreboot boot measure CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All 4. Custom fan curve CFC All 5. Platform stability STB All","title":"Module: Dasharo performance"},{"location":"variants/novacustom_nv4x_adl/test-matrix/#module-dasharo-stability","text":"No. Supported test suite Test suite ID Supported test cases 1. USB Type-A devices detection SUD All 2. M.2 Wi-fi SMW All 3. NVMe detection SNV All 4. NET interface after coldboot/warmboot/reboot/suspend NET All","title":"Module: Dasharo stability"},{"location":"variants/novacustom_nv4x_tgl/compatibility-check-results-ubuntu/","text":"Checkbox logs comparison Introduction Checkbox is a flexible test automation software. It\u2019s the main tool used in Ubuntu Certification program. You can use this software without any modification to check if your system is behaving correctly or you can develop your own set of tests to check your needs. Checkbox optionally generates test reports in different formats (JSON, HTML, etc.) that can be used to easily share the results of a test session. Checkbox comparison - vendor firmware vs Dasharo Testing assumptions Tests have been conducted on the same OS version (Ubuntu 22.04 LTS). Tests have been conducted on the same device, firstly with vendor firmware and secondly with Dasharo firmware (version 1.2.1). Test results Test results - vendor firmware: PASSED: 74, FAILED: 80, NOT SUPPORTED: 25. Test results - Dasharo firmware: PASSED: 74, FAILED: 80, NOT SUPPORTED: 25. Fails comparison The following table collects information about all errors detected by the certification program. In the second column test case name is described and in the third and fourth columns, the information about bug appearance on vendor/Dasharo firmware is shown. No. Test case name Dasharo firmware Vendor firmware 1 graphics/1_driver_version_TigerLake-LP_GT2__Iris_Xe_Graphics_ YES YES 2 graphics/1_driver_version_TigerLake-LP_GT2__Iris_Xe_Graphics_ YES YES 3 bluetooth4/beacon_eddystone_url_hci0 YES YES 4 mediacard/storage-preinserted-disk/by-uuid/0868-01F6 YES YES 5 mediacard/storage-preinserted-disk/by-uuid/2adea2a3-f163-4d14-b6f3-b8d628611e23 YES YES 6 mediacard/storage-preinserted-disk/by-uuid/2d67f8a9-7f79-4419-b1d3-e096ca010512 YES YES 7 mediacard/storage-preinserted-disk/by-uuid/3bb6b676-1c4d-4ffb-8ede-e68f513fcdf1 YES YES 8 wireless/wireless_connection_open_ac_nm_wlp55s0 YES YES 9 wireless/wireless_connection_open_ax_nm_wlp55s0 YES YES 10 wireless/wireless_connection_open_bg_nm_wlp55s0 YES YES 11 wireless/wireless_connection_open_n_nm_wlp55s0 YES YES 12 wireless/wireless_connection_wpa_ac_nm_wlp55s0 YES YES 13 wireless/wireless_connection_wpa_ax_nm_wlp55s0 YES YES 14 wireless/wireless_connection_wpa_bg_nm_wlp55s0 YES YES 15 wireless/wireless_connection_wpa_n_nm_wlp55s0 YES YES 16 tpm2.0_4.1.1/tpm2_import YES YES 17 tpm2.0_4.1.1/tpm2_clockrateadjust YES YES 18 tpm2.0_4.1.1/tpm2_loadexternal YES YES 19 tpm2.0_4.1.1/tpm2_rsadecrypt YES YES 20 tpm2.0_4.1.1/tpm2_activecredential YES YES 21 tpm2.0_4.1.1/tpm2_attestation YES YES 22 tpm2.0_4.1.1/tpm2_certify YES YES 23 tpm2.0_4.1.1/tpm2_certifycreation YES YES 24 tpm2.0_4.1.1/tpm2_changeauth YES YES 25 tpm2.0_4.1.1/tpm2_checkquote YES YES 26 tpm2.0_4.1.1/tpm2_clear YES YES 27 tpm2.0_4.1.1/tpm2_create YES YES 28 tpm2.0_4.1.1/tpm2_createak YES YES 29 tpm2.0_4.1.1/tpm2_createek YES YES 30 tpm2.0_4.1.1/tpm2_createpolicy YES YES 31 tpm2.0_4.1.1/tpm2_createprimary YES YES 32 tpm2.0_4.1.1/tpm2_dictionarylockout YES YES 33 tpm2.0_4.1.1/tpm2_duplicate YES YES 34 tpm2.0_4.1.1/tpm2_evictcontrol YES YES 35 tpm2.0_4.1.1/tpm2_flushcontext YES YES 36 tpm2.0_4.1.1/tpm2_getcap YES YES 37 tpm2.0_4.1.1/tpm2_getekcertificate YES YES 38 tpm2.0_4.1.1/tpm2_getrandom YES YES 39 tpm2.0_4.1.1/tpm2_gettestresult YES YES 40 tpm2.0_4.1.1/tpm2_gettime YES YES 41 tpm2.0_4.1.1/tpm2_hash YES YES 42 tpm2.0_4.1.1/tpm2_hmac YES YES 43 tpm2.0_4.1.1/tpm2_import_tpm YES YES 44 tpm2.0_4.1.1/tpm2_incrementalselftest YES YES 45 tpm2.0_4.1.1/tpm2_load YES YES 46 tpm2.0_4.1.1/tpm2_makecredential YES YES 47 tpm2.0_4.1.1/tpm2_nv YES YES 48 tpm2.0_4.1.1/tpm2_nvcertify YES YES 49 tpm2.0_4.1.1/tpm2_nvinc YES YES 50 tpm2.0_4.1.1/tpm2_output_formats YES YES 51 tpm2.0_4.1.1/tpm2_pcrevent YES YES 52 tpm2.0_4.1.1/tpm2_pcrextend YES YES 53 tpm2.0_4.1.1/tpm2_pcrlist YES YES 54 tpm2.0_4.1.1/tpm2_pcrreset YES YES 55 tpm2.0_4.1.1/tpm2_print YES YES 56 tpm2.0_4.1.1/tpm2_quote YES YES 57 tpm2.0_4.1.1/tpm2_readclock YES YES 58 tpm2.0_4.1.1/tpm2_readpublic YES YES 59 tpm2.0_4.1.1/tpm2_rsaencrypt YES YES 60 tpm2.0_4.1.1/tpm2_selftest YES YES 61 tpm2.0_4.1.1/tpm2_send YES YES 62 tpm2.0_4.1.1/tpm2_setclock YES YES 63 tpm2.0_4.1.1/tpm2_setprimarypolicy YES YES 64 tpm2.0_4.1.1/tpm2_sign YES YES 65 tpm2.0_4.1.1/tpm2_startup YES YES 66 tpm2.0_4.1.1/tpm2_stirrandom YES YES 67 tpm2.0_4.1.1/tpm2_testparms YES YES 68 tpm2.0_4.1.1/tpm2_unseal YES YES 69 tpm2.0_4.1.1/tpm2_verifysignature YES YES 70 audio/detect_sinks_sources YES YES 71 suspend/1_driver_version_after_suspend_TigerLake-LP_GT2__Iris_Xe_Graphics__auto YES YES 72 suspend/2_driver_version_after_suspend_TU117M_auto YES YES 73 suspend/audio_before_suspend YES YES 74 suspend/bluetooth_obex_send_after_suspend_auto YES YES 75 suspend/bluetooth_obex_send_before_suspend YES YES 76 usb/storage-preinserted-disk/by-uuid/0868-01F6 YES YES 77 usb/storage-preinserted-disk/by-uuid/2adea2a3-f163-4d14-b6f3-b8d628611e23 YES YES 78 usb/storage-preinserted-disk/by-uuid/2d67f8a9-7f79-4419-b1d3-e096ca010512 YES YES 79 usb/storage-preinserted-disk/by-uuid/3bb6b676-1c4d-4ffb-8ede-e68f513fcdf1 YES YES 80 usb/storage-preinserted-disk/by-uuid/452E-652F YES YES Logs from tests Logs are available under this link . Summary Test results are the same for vendor and dasharo firmware, with no differences.","title":"Checbox results"},{"location":"variants/novacustom_nv4x_tgl/compatibility-check-results-ubuntu/#checkbox-logs-comparison","text":"","title":"Checkbox logs comparison"},{"location":"variants/novacustom_nv4x_tgl/compatibility-check-results-ubuntu/#introduction","text":"Checkbox is a flexible test automation software. It\u2019s the main tool used in Ubuntu Certification program. You can use this software without any modification to check if your system is behaving correctly or you can develop your own set of tests to check your needs. Checkbox optionally generates test reports in different formats (JSON, HTML, etc.) that can be used to easily share the results of a test session.","title":"Introduction"},{"location":"variants/novacustom_nv4x_tgl/compatibility-check-results-ubuntu/#checkbox-comparison-vendor-firmware-vs-dasharo","text":"","title":"Checkbox comparison - vendor firmware vs Dasharo"},{"location":"variants/novacustom_nv4x_tgl/compatibility-check-results-ubuntu/#summary","text":"Test results are the same for vendor and dasharo firmware, with no differences.","title":"Summary"},{"location":"variants/novacustom_nv4x_tgl/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configurations used for validation of the coreboot port on the NovaCustom NV4X laptop. Ports specification Right side view No. Description 1. Speaker 2. 2-In-1 Audio Jack (Headphone / Microphone) 3. USB 3.2 Gen 2 Type-C Port 4. USB 3.2 Gen 2 Type-A Port 5. HDMI-Out Port 6. Power Button 7. DC-In Jack 8. Led Indicator Left side view No. Description 1. Security Lock Slot 2. RJ-45 LAN Jack 3. USB 3.2 Gen 2 Type-A Port 4. SD Card Reader 5. Thunderbolt 4 Port with Power Delivery (DC-IN) 6. Speaker The graphics used are from pages 17-18 of the official service manual for the NV41 platforms. NV41MZ Component Description CPU Intel(R) Core(TM) i7-1165G7 Internal Cooling RAM Slot 1: KVR29S21S6/8 Slot 2: KVR29S21S6/8 SSD Samsung 980 PRO NVMe 500 GB Flash memory GigaDevice 25B127DSIG 16 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 3.42A, 65 W NV41MB Component Description CPU Intel(R) Core(TM) i7-1165G7 Internal Cooling GPU NVIDIA GeForce GTX1650 4 GB RAM Slot 1: KVR29S21D8/32 Slot 2: KVR29S21D8/32 SSD Samsung 980 PRO NVMe 250 GB Flash memory GigaDevice 25B127DSIG 16 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 4.74A, 90 W","title":"Hardware Configuration Matrix"},{"location":"variants/novacustom_nv4x_tgl/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/novacustom_nv4x_tgl/hardware-matrix/#introduction","text":"This document describes the hardware configurations used for validation of the coreboot port on the NovaCustom NV4X laptop.","title":"Introduction"},{"location":"variants/novacustom_nv4x_tgl/hardware-matrix/#ports-specification","text":"","title":"Ports specification"},{"location":"variants/novacustom_nv4x_tgl/hardware-matrix/#nv41mz","text":"Component Description CPU Intel(R) Core(TM) i7-1165G7 Internal Cooling RAM Slot 1: KVR29S21S6/8 Slot 2: KVR29S21S6/8 SSD Samsung 980 PRO NVMe 500 GB Flash memory GigaDevice 25B127DSIG 16 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 3.42A, 65 W","title":"NV41MZ"},{"location":"variants/novacustom_nv4x_tgl/hardware-matrix/#nv41mb","text":"Component Description CPU Intel(R) Core(TM) i7-1165G7 Internal Cooling GPU NVIDIA GeForce GTX1650 4 GB RAM Slot 1: KVR29S21D8/32 Slot 2: KVR29S21D8/32 SSD Samsung 980 PRO NVMe 250 GB Flash memory GigaDevice 25B127DSIG 16 MB USB pendrives SanDisk Ultra USB 3.0 32 GB USB Keyboard Logitech, Inc. Keyboard K120 Wireless card Intel Wi-Fi 6 AX201 Display Display 1: HDMI 1920x1080p Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Camera 5. Audio subsystem Attached devices Thunderbolt 4 Port: Wavlink 100W PD Pro docking station USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable Power Supply Chicony 19V, 4.74A, 90 W","title":"NV41MB"},{"location":"variants/novacustom_nv4x_tgl/lvfs_report/","text":"NovaCustom fwupd/LVFS support service Introduction This document contains the report of the discovery of the most appropriate fwupd/LVFS firmware update method, including potential risks and roadblocks. Device specification NovaCustom NV4x system firmware Intel i7-1165G7 (Tiger Lake ULV platform) Samsung 980PRO NVMe SSD 2x SO-DIMM DDR4 system memory Optional NVIDIA discrete graphics Dasharo coreboot-based firmware Firmware stored on a SPI flash chip, flashable internally via flashrom Update protocol The device is flashable internally via flashrom No special unlocks necessary for flashing the required BIOS flash portions (only requirement is that UEFI Secure Boot is disabled while updating) Feasibility analysis Tiger Lake-U is supported in flashrom Present since this commit , not yet released to stable as of 14.01.2022 flashrom is supported in fwupd flashrom plugin is enabled by default in many common desktop Linux distributions, including Ubuntu (starting with 21.10) and Arch Linux enabling a device in the flashrom plugin is a matter of adding device-specific entries to the plugin quirk list Potential risk: vboot support in fwupd flashrom supports flashing vboot rw slots, which are coreboot images located within the BIOS partition of the flash however, fwupd only implements flashing the entire BIOS region of the SPI flash, which includes other firmware components such as vboot keys, vboot recovery partition and user settings the device currently has vboot partially implemented - the BIOS flash is not protected and the binaries are signed with (public) developer keys this means we can currently update the BIOS using the traditional fwupd update path once we decide to change the vboot keys and lock down the rest of the, flash, proper vboot support will need to be implemented in fwupd until then, it will not be possible to enable vboot fully Further steps: Vboot support In case full vboot support in fwupd is desired, the following are currently missing and need to be implemented: Support reading and processing VBNV (Vboot non-volatile store) data in fwupd: this store contains information about the current vboot state, e.g. currently booted slot (A/B/Recovery), recovery reason, firmware signature verification status. This information is stored in CMOS, but the exact offset varies by device - so a method for determining the offset is also required. For Google Chromebooks, this offset is exposed in a Chromebook-specific ACPI device which we cannot use in non-Chromebook device. An alternative interface or possibly a quirk in fwupd's flashrom plugin will need to be added (though this approach is not preferred by fwupd maintainers). Support for flashing fmap regions in fwupd's flashrom plugin: currently, fwupd only attempts to read flash layout from the Intel Flash Descriptor located in the flash. This only allows fwupd to flash the entire BIOS region, while vboot requires only a portion of the BIOS partition to be updated at a given time, with some of the BIOS partition being read-only. This means that with vboot fully enabled, updating will fail by attempting to write to a read-only portion of the flash. Vboot partitions (slots) are a subset of the bios partition and are defined in FMAP (flashmap). Support for it will need to be implemented in fwupd (possible by utilizing libflashrom). Additionally, some user settings like boot order and setup options are stored in a separate FMAP region, so implementing FMAP support in fwupd will allow us to preserve them across firmware updates. Vboot A/B slot support In Google Chromebooks, the firmware updater only updates one slot at a time and if it succeeds (the device reboots into it successfully and works stably), then it will also update the other slot to the same (now confirmed good) firmware. fwupd does not currently support anything like this, so support for it will also need to be implemented. Prior work: fwupd #1370 fwupd #1481 LKML thread","title":"LVFS report"},{"location":"variants/novacustom_nv4x_tgl/lvfs_report/#novacustom-fwupdlvfs-support-service","text":"","title":"NovaCustom fwupd/LVFS support service"},{"location":"variants/novacustom_nv4x_tgl/lvfs_report/#introduction","text":"This document contains the report of the discovery of the most appropriate fwupd/LVFS firmware update method, including potential risks and roadblocks.","title":"Introduction"},{"location":"variants/novacustom_nv4x_tgl/openness_analysis/","text":"Intro This document aims to compare the openness of Dasharo Firmware and Insyde BIOS. There is an ongoing discussion about the methodology of the openness metric. BIOS versions used in the analysis Dasharo coreboot v0.5.0 Insyde BIOS Insyde BIOS In the case of the Insyde bios, the entire image should be considered proprietary. There are several parts of the image that have a well-known structure or make use of a public standard. However, to decode these structures, one needs to employ reverse-engineering tools and techniques to know what structures are present. Dasharo BIOS CBFS image size (bytes) Is it open-source? cbfs master header 20h Yes fallback/romstage 14770h Yes cpu_microcode_blob.bin 31C00h No intel_fit 50h Yes fallback/ramstage 1E626h Yes config 579h Yes revision 351h Yes build_info 5Dh Yes fallback/dsdt.aml 6233h Yes vbt.bin 51Ch Yes (empty) 1E4h N/A fspm.bin 9F000h No cmos_layout.bin 22Ch Yes (empty) D24h N/A fsps.bin 43676h No fallback/postcar 8F24h Yes fallback/payload 1771C5h Yes fallback/verstage 12C80h Yes (empty) 10E5E4h N/A bootblock 74C0h Yes Summary 3F7A33h In 62.9% Open and closed source images are in the table below. type summarised size Percent open-source 1D42D1h 62.9% closed-source 114276h 37.1% empty (not included) 10F4ECh Whole flash image region size open-source percent (bytes) descriptor 1000h 0% ME 4FF000h 0% BIOS B00000h 62.9% Summary 1000000h 43.2% Summary image open-source percent (bytes) Insyde 0% Dasharo 43.2%","title":"Openness score"},{"location":"variants/novacustom_nv4x_tgl/openness_analysis/#intro","text":"This document aims to compare the openness of Dasharo Firmware and Insyde BIOS. There is an ongoing discussion about the methodology of the openness metric.","title":"Intro"},{"location":"variants/novacustom_nv4x_tgl/openness_analysis/#bios-versions-used-in-the-analysis","text":"Dasharo coreboot v0.5.0 Insyde BIOS","title":"BIOS versions used in the analysis"},{"location":"variants/novacustom_nv4x_tgl/openness_analysis/#insyde-bios","text":"In the case of the Insyde bios, the entire image should be considered proprietary. There are several parts of the image that have a well-known structure or make use of a public standard. However, to decode these structures, one needs to employ reverse-engineering tools and techniques to know what structures are present.","title":"Insyde BIOS"},{"location":"variants/novacustom_nv4x_tgl/openness_analysis/#dasharo-bios","text":"","title":"Dasharo BIOS"},{"location":"variants/novacustom_nv4x_tgl/openness_analysis/#summary","text":"image open-source percent (bytes) Insyde 0% Dasharo 43.2%","title":"Summary"},{"location":"variants/novacustom_nv4x_tgl/releases/","text":"NovaCustom NV4X Dasharo Release Notes Following Release Notes describe status of Open Source Firmware development for NovaCustom NV4X For details about our release process please read Dasharo Standard Release Process . Subscribe to NovaCustom NV4X Dasharo Release Newsletter Test results for this platform can be found here . v1.4.0 - 2023-02-24 Test results for this release can be found here . Added The same keyboard illumination setting is restored after suspend or poweroff One of the two fan profiles can now be selected in Setup Menu Fn lock hotkey feature Changed Keys must be provisioned prior enabling Secure Boot Fixed ISO keyboard issue for non-US layouts (Dasharo issue #259) The NVIDIA graphics power management isn't properly functional (Dasharo issue #145) Known issues Low level interfering crackling/popping of the speakers while playing no sound (Dasharo issue #224) Waking up from sleep on Ubuntu 22.04 is not 100% reliable (Dasharo issue #205) The power LED is not always blinking while in sleep mode on Windows 11 (Dasharo issue #182) No video output via USB-C after shutdown if PowerDelivery (PD) is active NV40MZ (Dasharo issue #237) Buggy touchpad when charging via USB-C (NV40MZ) (Dasharo issue #265) Keyboard backlight turns on after resuming from sleep mode (Dasharo issue #332) The screen brightness level gets stuck when key are held or pressed too fast (Dasharo issue #341) Connecting and immediately disconnecting the charger, sets the battery status in OS to 'charging' for about 2 minutes (Dasharo issue #350) Binaries novacustom_nv4x_tgl_ec_v1.4.0.rom sha256 sha256.sig novacustom_nv4x_tgl_v1.4.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) Dasharo coreboot fork based on 1a8eb6c02103727431ac1ea23f4f507e49f3cde7 revision 636f432a Dasharo EDKII fork based on e0334c228ce4ba51f47ff79a118f214031d4650f revision 2c61576a Intel ME version 15.0.30.1776 v1.3.0 - 2022-10-18 Test results for this release can be found here . EC firmware transition Please note, that version 1.3.0 of Dasharo BIOS firmware works correctly only with the Dasharo EC firmware . This is the first release when this open-source EC firmware is used, so additional steps need to be taken when upgrading. Please refer to the Firmware update section for more details on upgrading your firmware. Added Vboot recovery mode information popup Dasharo setup menu full screen mode support Changed Rebased on upstream coreboot revision from 18 Aug 2022 Support for open-source EC firmware (transition procedure is required) Disabled UEFI Secure Boot by default Fixed Custom fan curve is not applied after suspend (Dasharo issue #45) The touchpad ON/OFF switch Fn key is not functional (Dasharo issue #38) UCM-UCSI ACPI device displays an error in Windows Device Manager Laptop cannot output video via the Tunderbolt 4 USB Type-C port Known issues Low level interfering crackling/popping of the speakers while playing no sound (Dasharo issue #224) Waking up from sleep on Ubuntu 22.04 is not 100% reliable (Dasharo issue #205) After emergency shutdown, keyboard doesn't work before OS (Dasharo issue #199) The power LED is not always blinking while in sleep mode on Windows 11 (Dasharo issue #182) The NVIDIA graphics power management isn't properly functional (Dasharo issue #145) Binaries novacustom_nv4x_ec_v1.3.0.rom sha256 sha256.sig novacustom_nv4x_v1.3.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) Dasharo coreboot fork based on bcc2fb719aaf2d466f9fb429b892f2d268bed5a7 revision a087c3e2 Dasharo EDKII fork based on e0334c228ce4ba51f47ff79a118f214031d4650f revision abfdef40 v1.2.1 - 2022-06-23 Fixed cbfstool logo replacement not working on NV4x v1.2.0 Known issues Custom fan curve is not applied after suspend (Dasharo issue #45) UCM-UCSI ACPI device displays an error in Windows Device Manager USB4 Root Device Router device displays an error in Windows 11 Device Manager Windows 10 SD card reader driver needs manual installation on NV41MB Low level interfering crackling/popping of the speakers while playing no sound Laptop cannot output video via the Tunderbolt 4 USB Type-C port Binaries novacustom_nv4x_v1.2.1.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on e3e965b1 revision baada726 edk2 based on 2020.03.17 revision cad23725 v1.2.0 - 2022-06-10 Added Renamed device to NovaCustom NV4x Fixed Wake from suspend doesn't work with certain SSDs CVE-2022-29264 SMM loader vulnerability Fix BIOS vendor name in SMBIOS Known issues Custom fan curve is not applied after suspend (Dasharo issue #45) UCM-UCSI ACPI device displays an error in Windows Device Manager USB4 Root Device Router device displays an error in Windows 11 Device Manager Windows 10 SD card reader driver needs manual installation on NV41MB Low level interfering crackling/popping of the speakers while playing no sound Laptop cannot output video via the Tunderbolt 4 USB Type-C port Binaries novacustom_nv4x_v1.2.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on e3e965b1 revision baada726 edk2 based on 2020.03.17 revision cad23725 v1.1.0 - 2022-03-23 Added Add Dasharo Tools Suite network boot integration Add a persistent bootlogo implementation Known issues UCM-UCSI ACPI device displays an error in Windows Device Manager USB4 Root Device Router device displays an error in Windows 11 Device Manager Windows 10 SD card reader driver needs manual installation on NV41MB Low level interfering crackling/popping of the speakers while playing no sound Laptop cannot output video via the Tunderbolt 4 USB Type-C port Binaries clevo_nv41mz_v1.1.0.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on ae9a8447 revision 0722fdf0 edk2 based on 2020.03.17 revision ec6805c2 v1.0.1 - 2022-03-01 Added Change DMI fields to match previous Insyde firmware Hide unknown ACPI devices Set correct Realtek HD Audio subsystem ID Set correct ACPI path for the TPM Set TPM IRQ in a manner understood by Windows Removed Removed proprietary blobs from built coreboot images Fixed Updating firmware using fwupd MIC-in phone jack not working This PC can't run Windows 11 error while installing Windows 11 from a USB pen drive Known issues Custom fan curve is not functional after suspend UCM-UCSI ACPI device displays an error in Windows Device Manager USB4 Root Device Router device displays an error in Windows 11 Device Manager Windows 10 SD card reader driver needs manual installation on NV41MB Low level interfering crackling/popping of the speakers while playing no sound Laptop cannot output video via the Tunderbolt 4 USB Type-C port Binaries clevo_nv41mz_v1.0.1.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on ae9a8447 revision 3a3808f9 edk2 based on 2020.03.17 revision e0334c22 v1.0.0 - 2022-01-19 Added Documentation for touchpad hotkey enablement on Linux Removed Removed proprietary blobs from built coreboot images Fixed The touchpad ON/OFF switch Fn key is not functional Charging indicator displays wrong state if power adapter was unplugged while in sleep mode Bluetooth does not work under Windows Known issues Unable to download the system by using iPXE Laptop cannot output video via the Tunderbolt 4 USB Type-C port Windows 10 SD card reader driver needs manual installation on NV41MB Binaries clevo_nv41mz_v1.0.0.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on ae9a8447 revision e995fc1c edk2 based on 2020.03.17 revision 59ae285f v0.5.0 - 2021-11-19 Added vboot Verified Boot TPM Measured Boot Custom fan curve Microcode for Tiger Lake stepping 0x2 Documentation for EC firmware update Changed Disabled unused DPTF device Fixed Performance drop when the power adaptor is disconnected High Nvidia GPU energy draw at idle in Windows Known issues Unable to download the system by using iPXE Laptop cannot output video via the Tunderbolt 4 USB Type-C port The touchpad ON/OFF switch Fn key is not functional Binaries dasharo_clevo_nv41mz_v0.5.0.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on ae9a8447 revision 7d439573 EDK2 based on 2020.03.17 revision bfd3d1a2 v0.4.0 - 2021-10-26 Added Added full support for sleep mode (s0ix / Modern Standby) Added support for NV41MB model Added support for nvidia discrete graphics (doesn't power off in Windows yet) Changed Fixed regression with non-funtional airplane mode hotkey on Windows Disabled legacy 8254 timer for lower power draw Fixed Sleep mode is not functional The camera ON/OFF switch Fn key is not functional Known issues Unable to download the system by using iPXE Laptop cannot output video via the Tunderbolt 4 USB Type-C port High Nvidia GPU energy draw at idle in Windows Performance drop when the power adaptor is disconnected The touchpad ON/OFF switch Fn key is not functional Binaries dasharo_clevo_nv41mz_v0.4.0.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on ae9a8447 revision 03972293 EDK2 based on 2020.03.17 revision bfd3d1a2 v0.3.0 - 2021-10-11 Added Support for discrete TPM USB Type-C ACPI support (UCSI) Improved runtime power management for SSD (reduces power usage while in sleep) Added partial sleep support (system saves power, but fans still spin) Changed Rebased on coreboot revision ae9a8447 Known issues Sleep mode is not functional The camera ON/OFF switch Fn key is not functional The touchpad ON/OFF switch Fn key is not functional Binaries dasharo_clevo_nv41mz_v0.3.0.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on ae9a8447 revision v0.3.0 EDK2 based on 2020.03.17 revision bfd3d1a2 v0.2.1 - 2021-9-29 Added Integrated graphics backlight configuration for Windows Changed Updated the Video Bios Table Fixed Screen brightness is stuck at 0% in the Windows Installer Known issues Sleep mode is not functional The camera ON/OFF switch Fn key is not functional The touchpad ON/OFF switch Fn key is not functional Binaries dasharo_clevo_nv41mz_v0.2.1.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on 4.14 revision 43c9604b EDK2 based on 2020.03.17 revision bfd3d1a2 v0.2.0 - 2021-9-24 Added UEFI Secure Boot support UEFI Shell selectable in boot menu iPXE selectable in boot menu NovaCustom boot logo Customized boot menu keys Customized setup menu keys Support for backlight hotkey in Windows Preserve boot order settings after Dasharo update Changed Replaced CorebootPayloadPkg with Dasharo UEFIPayloadPkg Changed the behavior of airplane mode to match stock firmware (now it can be disabled in software) Known issues Screen brightness is stuck at 0% in the Windows Installer Sleep mode is not functional The camera ON/OFF switch Fn key is not functional The touchpad ON/OFF switch Fn key is not functional Binaries dasharo_clevo_nv41mz_v0.2.0.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on 4.14 revision ff1c6572 EDK2 based on 2020.03.17 revision bfd3d1a2 v0.1.2 - 2021-08-31 Added Clevo NV41MZ platform support Clevo IT5570 EC support UEFI boot support configurable boot order configurable boot options Integrated graphics initialization for internal LCD (eDP) and external HDMI port Binaries clevo_nv41mz_v0.1.2.rom sha256 sha256.sig All in one zip SBOM (Software Bill of Materials) coreboot 4.14 (with additional commits for Clevo NV41MZ board support) EDK2","title":"Releases"},{"location":"variants/novacustom_nv4x_tgl/releases/#novacustom-nv4x-dasharo-release-notes","text":"Following Release Notes describe status of Open Source Firmware development for NovaCustom NV4X For details about our release process please read Dasharo Standard Release Process . Subscribe to NovaCustom NV4X Dasharo Release Newsletter Test results for this platform can be found here .","title":"NovaCustom NV4X Dasharo Release Notes"},{"location":"variants/novacustom_nv4x_tgl/releases/#v140-2023-02-24","text":"Test results for this release can be found here .","title":"v1.4.0 - 2023-02-24"},{"location":"variants/novacustom_nv4x_tgl/releases/#v130-2022-10-18","text":"Test results for this release can be found here .","title":"v1.3.0 - 2022-10-18"},{"location":"variants/novacustom_nv4x_tgl/releases/#v121-2022-06-23","text":"","title":"v1.2.1 - 2022-06-23"},{"location":"variants/novacustom_nv4x_tgl/releases/#v120-2022-06-10","text":"","title":"v1.2.0 - 2022-06-10"},{"location":"variants/novacustom_nv4x_tgl/releases/#v110-2022-03-23","text":"","title":"v1.1.0 - 2022-03-23"},{"location":"variants/novacustom_nv4x_tgl/releases/#v101-2022-03-01","text":"","title":"v1.0.1 - 2022-03-01"},{"location":"variants/novacustom_nv4x_tgl/releases/#v100-2022-01-19","text":"","title":"v1.0.0 - 2022-01-19"},{"location":"variants/novacustom_nv4x_tgl/releases/#v050-2021-11-19","text":"","title":"v0.5.0 - 2021-11-19"},{"location":"variants/novacustom_nv4x_tgl/releases/#v040-2021-10-26","text":"","title":"v0.4.0 - 2021-10-26"},{"location":"variants/novacustom_nv4x_tgl/releases/#v030-2021-10-11","text":"","title":"v0.3.0 - 2021-10-11"},{"location":"variants/novacustom_nv4x_tgl/releases/#v021-2021-9-29","text":"","title":"v0.2.1 - 2021-9-29"},{"location":"variants/novacustom_nv4x_tgl/releases/#v020-2021-9-24","text":"","title":"v0.2.0 - 2021-9-24"},{"location":"variants/novacustom_nv4x_tgl/releases/#v012-2021-08-31","text":"","title":"v0.1.2 - 2021-08-31"},{"location":"variants/novacustom_nv4x_tgl/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. NV41MB test matrix Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports and LCD support DSP DSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002 4. Embedded Controller and Super I/O initialization ECR Without ECR021.xxx - ECR024.xxx, ECR25.001, ECR26.001, ECR27.001, ECR28.001 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB All 9. Debian Stable and Ubuntu LTS support LBT LBT004.001, LBT004.002 10. UEFI Shell USH All 11. Windows booting WBT WBT001.001 12. Audio subsystem AUD All 13. USB-C support UTC All 14. Network boot PXE Without PXE007.001 15. M.2 WiFi/Bluetooth WLE All 16. SD card support SDC All 17. USB Camera verification CAM All 18. Fan speed measure FAN FAN001.001 19. SMBIOS DMI Without DMI001.001 20. Firmware update using fwupd FFW All 21. Dasharo Tools Suite DTS DTS006.001, DTS007.001 22. CPU status CPU All 23. Embedded controller flashing ECF All 24. Logo customization functionality LCM LCM001.001 25. Firmware locally building and flashing FLB All 26. Custom Boot Order CBO CBO001.002 27. QubesOS support QBS All 28. Fedora support FED All 29. Platform suspend and resume SUSP SUSP001.001, SUSP002.001, SUSP003.001 30. Sign of life SOL All 31. NVIDIA Graphics support NVI All 32. BIOS menu function keys BMF All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO Without SBO006.001, SBO007.001 and SBO008.001 5. ME disable/neuter support MNE Without MNE006.001 Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot boot measure CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All 4. Custom fan curve CFC All 5. Platform stability STB All Module: Dasharo stability No. Supported test suite Test suite ID Supported test cases 1. USB Type-A devices detection SUD All 2. M.2 Wi-fi SMW All 3. NVMe detection SNV All NV41MZ test matrix Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports and LCD support DSP DSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002 4. Embedded Controller and Super I/O initialization ECR Without ECR021.xxx - ECR024.xxx, ECR25.001, ECR26.001, ECR27.001, ECR28.001 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB All 9. Debian Stable and Ubuntu LTS support LBT LBT004.001, LBT004.002 10. UEFI Shell USH All 11. Windows booting WBT WBT001.001 12. Audio subsystem AUD All 13. USB-C support UTC All 14. Network boot PXE Without PXE007.001 15. M.2 WiFi/Bluetooth WLE All 16. SD card support SDC All 17. USB Camera verification CAM All 18. Fan speed measure FAN FAN001.001 19. SMBIOS DMI Without DMI001.001 20. [USB-C docking station detect][DUD] DUD All 21. [USB-C docking station USB devices][DUB] DUB All 22. [USB-C docking station Audio][DAU] DAU All 23. [USB-C docking station Display ports][DDP] DDP All 24. [USB-C docking station NET interface][DET] DET All 25. Firmware update using fwupd FFW All 26. Dasharo Tools Suite DTS DTS006.001, DTS007.001 27. CPU status CPU All 28. Embedded controller flashing ECF All 29. Logo customization functionality LCM LCM001.001 30. Firmware locally building and flashing FLB All 31. Custom Boot Order CBO CBO001.002 32. QubesOS support QBS All 33. Fedora support FED All 34. Platform suspend and resume SUSP SUSP001.001, SUSP002.001, SUSP003.001, SUSP005.001 35. [Thunderbolt docking station detect][TDD] TDD All 36. [Thunderbolt docking station USB devices][TDU] TDU All 37. [Thunderbolt docking station Audio][TDA] TDA All 38. [Thunderbolt docking station][TDS] TDS All 39. [Thunderbolt docking station Display ports][TDP] TDP All 40. [Thunderbolt docking station NET interface][TDN] TDN All 41. Sign of life SOL All 42. [USB-C docking station SD card reader][DSD] DSD All 43. BIOS menu function keys BMF All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO Without SBO006.001, SBO007.001 and SBO008.001 5. ME disable/neuter support MNE Without MNE006.001 Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot boot measure CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All 4. Custom fan curve CFC All 5. Platform stability STB All Module: Dasharo stability No. Supported test suite Test suite ID Supported test cases 1. USB Type-A devices detection SUD All 2. M.2 Wi-fi SMW All 3. NVMe detection SNV All 4. NET interface after coldboot/warmboot/reboot/suspend NET All","title":"Test matrix"},{"location":"variants/novacustom_nv4x_tgl/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/novacustom_nv4x_tgl/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"About"},{"location":"variants/novacustom_nv4x_tgl/test-matrix/#nv41mb-test-matrix","text":"","title":"NV41MB test matrix"},{"location":"variants/novacustom_nv4x_tgl/test-matrix/#module-dasharo-stability","text":"No. Supported test suite Test suite ID Supported test cases 1. USB Type-A devices detection SUD All 2. M.2 Wi-fi SMW All 3. NVMe detection SNV All","title":"Module: Dasharo stability"},{"location":"variants/novacustom_nv4x_tgl/test-matrix/#nv41mz-test-matrix","text":"","title":"NV41MZ test matrix"},{"location":"variants/novacustom_nv4x_tgl/test-matrix/#module-dasharo-stability_1","text":"No. Supported test suite Test suite ID Supported test cases 1. USB Type-A devices detection SUD All 2. M.2 Wi-fi SMW All 3. NVMe detection SNV All 4. NET interface after coldboot/warmboot/reboot/suspend NET All","title":"Module: Dasharo stability"},{"location":"variants/pc_engines/overview/","text":"Overview PC Engines is a Swiss-based company that specializes in the design and manufacture of small form factor computer hardware, including single-board computers (SBCs), network appliances, and embedded systems. Their products are often used in networking, telecommunications, security applications, in-home automation, and other industrial applications. PC Engines is particularly well-known for its low-power, high-performance SBCs, including the APU (Accelerated Processing Unit) series, which feature AMD G-series embedded processors, and the ALIX series, based on the AMD Geode processor. These SBCs are commonly used as firewalls, routers, and other network appliances. PC Engines is a well-recognized brand in the open-source community mostly because of full schematics availability (apu2d example) and use of open-source firmware . PC Engines products are top-rated among pfSense and OPNsense users. What you can see based on the number of forum topics regarding apu platforms. Status In 2016 PC Engines contracted 3mdeb to take over the maintenance of open-source firmware for PC Engines products. Development happened in PC Engines Github organization until September 2022, when PC Engines decided to discontinue its sponsorship for open-source firmware. Dasharo Team working on creating a sustainable path forward for PC Engines' open-source firmware through a subscription and donation model. For more details please check Post EOL firmware announcement , contact us directly or through community chat . References Post-EOL firmware announcement","title":"Overview"},{"location":"variants/pc_engines/overview/#overview","text":"PC Engines is a Swiss-based company that specializes in the design and manufacture of small form factor computer hardware, including single-board computers (SBCs), network appliances, and embedded systems. Their products are often used in networking, telecommunications, security applications, in-home automation, and other industrial applications. PC Engines is particularly well-known for its low-power, high-performance SBCs, including the APU (Accelerated Processing Unit) series, which feature AMD G-series embedded processors, and the ALIX series, based on the AMD Geode processor. These SBCs are commonly used as firewalls, routers, and other network appliances. PC Engines is a well-recognized brand in the open-source community mostly because of full schematics availability (apu2d example) and use of open-source firmware . PC Engines products are top-rated among pfSense and OPNsense users. What you can see based on the number of forum topics regarding apu platforms.","title":"Overview"},{"location":"variants/pc_engines/overview/#status","text":"In 2016 PC Engines contracted 3mdeb to take over the maintenance of open-source firmware for PC Engines products. Development happened in PC Engines Github organization until September 2022, when PC Engines decided to discontinue its sponsorship for open-source firmware. Dasharo Team working on creating a sustainable path forward for PC Engines' open-source firmware through a subscription and donation model. For more details please check Post EOL firmware announcement , contact us directly or through community chat .","title":"Status"},{"location":"variants/pc_engines/overview/#references","text":"Post-EOL firmware announcement","title":"References"},{"location":"variants/pc_engines/post-eol-fw-announcement/","text":"Post EOL firmware announcement Dear valued PC Engines hardware owners, We apologize for the delay in our announcement. We understand that many of you have eagerly awaited the next PC Engines firmware release. Rest assured that our commitment to supporting the PC Engines firmware remains strong, and we are working hard to bring you new features through the upcoming Dasharo firmware distribution. We appreciate your patience and continued support. We regret to inform the community that v4.17.0.3 was the last version of the firmware sponsored by PC Engines. However, 3mdeb has since released v4.19.0.1 , the final version delivered to the community using the existing model. As some may know, 3mdeb is a small open-source firmware consulting company based in Poland. Our team consists of passionate engineers and developers from open-source software, firmware, and hardware communities, frequent conference speakers, and people who love to tinker with bits. Every day we develop bleeding-edge low-level security solutions using top open-source frameworks. We are committed to continuing support and PC Engines hardware in the open-source firmware community but can't afford that on our dime. Since February 2016, we have made 87 binary releases for all PC Engines hardware platforms from apu1 through famous apu2 up to apu7. We published over 30k test results from our automated testing framework. Thanks to community feedback, we created extensive documentation . Our firmware development effort extended the lifetime value of PC Engines hardware. Most notable examples were: CPU Core Performance Boost feature enabling - blog DRAM Error Correction Code enabling - blog AMD Cryptographic Coprocessor enabling - issue tracker and many small things like a watchdog or SPI flash lockdown. According to PC Engines EOL statement apu2 / apu3 series availability will be: \"Based on an AMD embedded CPU, this platform should have good long term availability. This CPU should be available until 2024 according to AMD.\" We would like to continue support for PC Engines firmware through our Dasharo open-source firmware distribution. Further releases could include regular maintenance updates and new features such as UEFI compatibility, fwupd, Verified Boot, UEFI Setup password, DMA protection, and more. For a complete list of planned enhancements, please visit the dasharo-issues repository on GitHub. Your support will play a crucial role in determining the roadmap and the speed of its implementation. We hope you will support our efforts to bring these new features and improvements to the PC Engines firmware. We are exploring the possibility of implementing a subscription model for firmware updates. We would like to hear from you to ensure that the pricing option is fair and reasonable for our community. We have created a survey to gather your thoughts and preferences on pricing. Your feedback is important to us and will help us make informed decisions about the future of our offerings. Please take about two minutes to participate in the survey . Your input will be greatly appreciated. In case of any questions feel free to contact us .","title":"Announcement"},{"location":"variants/pc_engines/post-eol-fw-announcement/#post-eol-firmware-announcement","text":"Dear valued PC Engines hardware owners, We apologize for the delay in our announcement. We understand that many of you have eagerly awaited the next PC Engines firmware release. Rest assured that our commitment to supporting the PC Engines firmware remains strong, and we are working hard to bring you new features through the upcoming Dasharo firmware distribution. We appreciate your patience and continued support. We regret to inform the community that v4.17.0.3 was the last version of the firmware sponsored by PC Engines. However, 3mdeb has since released v4.19.0.1 , the final version delivered to the community using the existing model. As some may know, 3mdeb is a small open-source firmware consulting company based in Poland. Our team consists of passionate engineers and developers from open-source software, firmware, and hardware communities, frequent conference speakers, and people who love to tinker with bits. Every day we develop bleeding-edge low-level security solutions using top open-source frameworks. We are committed to continuing support and PC Engines hardware in the open-source firmware community but can't afford that on our dime. Since February 2016, we have made 87 binary releases for all PC Engines hardware platforms from apu1 through famous apu2 up to apu7. We published over 30k test results from our automated testing framework. Thanks to community feedback, we created extensive documentation . Our firmware development effort extended the lifetime value of PC Engines hardware. Most notable examples were: CPU Core Performance Boost feature enabling - blog DRAM Error Correction Code enabling - blog AMD Cryptographic Coprocessor enabling - issue tracker and many small things like a watchdog or SPI flash lockdown. According to PC Engines EOL statement apu2 / apu3 series availability will be: \"Based on an AMD embedded CPU, this platform should have good long term availability. This CPU should be available until 2024 according to AMD.\" We would like to continue support for PC Engines firmware through our Dasharo open-source firmware distribution. Further releases could include regular maintenance updates and new features such as UEFI compatibility, fwupd, Verified Boot, UEFI Setup password, DMA protection, and more. For a complete list of planned enhancements, please visit the dasharo-issues repository on GitHub. Your support will play a crucial role in determining the roadmap and the speed of its implementation. We hope you will support our efforts to bring these new features and improvements to the PC Engines firmware. We are exploring the possibility of implementing a subscription model for firmware updates. We would like to hear from you to ensure that the pricing option is fair and reasonable for our community. We have created a survey to gather your thoughts and preferences on pricing. Your feedback is important to us and will help us make informed decisions about the future of our offerings. Please take about two minutes to participate in the survey . Your input will be greatly appreciated. In case of any questions feel free to contact us .","title":"Post EOL firmware announcement"},{"location":"variants/protectli_fw6/building-manual/","text":"Building manual Requirements Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git sudo apt-get install git Building To build Dasharo firmware image, follow the steps below: Clone the coreboot repository: git clone https://github.com/Dasharo/coreboot.git -b protectli_vault_kbl/release To build a specific version replace protectli_vault_kbl/release to protectli_vault_kbl_v1.0.x where x is the version number. Start build process (note it requires certain blobs to proceed): cd coreboot git submodule update --init --checkout # you will need to obtain the ZIP with blobs at this point unzip protectli_blobs.zip -d 3rdparty/blobs/mainboard ./build.sh fw6","title":"Building manual"},{"location":"variants/protectli_fw6/building-manual/#building-manual","text":"","title":"Building manual"},{"location":"variants/protectli_fw6/building-manual/#requirements","text":"Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git sudo apt-get install git","title":"Requirements"},{"location":"variants/protectli_fw6/building-manual/#building","text":"To build Dasharo firmware image, follow the steps below: Clone the coreboot repository: git clone https://github.com/Dasharo/coreboot.git -b protectli_vault_kbl/release To build a specific version replace protectli_vault_kbl/release to protectli_vault_kbl_v1.0.x where x is the version number. Start build process (note it requires certain blobs to proceed): cd coreboot git submodule update --init --checkout # you will need to obtain the ZIP with blobs at this point unzip protectli_blobs.zip -d 3rdparty/blobs/mainboard ./build.sh fw6","title":"Building"},{"location":"variants/protectli_fw6/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configuration used for validation of the coreboot port on the Protectli FW6 firewall. Protectli FW6E Dasharo Component Description CPU IIntel(R) Celeron(TM) 3865U SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB RAM CRUCIAL CT4G4SFS824A CRUCIAL CT4G4SFS824A Wireless card Qualcomm Atheros QCA9377 LTE miniPCIe card Quectel EC-20 Display HDMI 1920x1080p Ethernet 6x Intel i211 (on-board) Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. SanDisk USB 3.2Gen1 16 GB 4. USB Type-C Hub Pro UCN3286 USB Keyboard DELL KB216 Power supply Channel Well Technology 12V, 7.5A 90W Protectli FW6B Dasharo Component Description CPU Intel(R) Core(TM) i3-7100U SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB RAM CRUCIAL CT4G4SFS824A CRUCIAL CT4G4SFS824A Wireless card Qualcomm Atheros QCA9377 LTE miniPCIe card Quectel EC-20 Display HDMI 1920x1080p Ethernet 6x Intel i211 (on-board) Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. SanDisk USB 3.2Gen1 16 GB 4. USB Type-C Hub Pro UCN3286 USB Keyboard DELL KB216 Power supply Channel Well Technology 12V, 7.5A 90W Protectli FW6C Dasharo Component Description CPU Intel(R) Core(TM) i5-7200U SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB RAM CRUCIAL CT4G4SFS824A CRUCIAL CT4G4SFS824A Wireless card Qualcomm Atheros QCA9377 LTE miniPCIe card Quectel EC-20 Display HDMI 1920x1080p Ethernet 6x Intel i210 (on-board) Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. SanDisk USB 3.2Gen1 16 GB 4. USB Type-C Hub Pro UCN3286 USB Keyboard DELL KB216 Power supply Channel Well Technology 12V, 7.5A 90W Protectli FW6D Dasharo Component Description CPU Intel(R) Core(TM) i5-8250U SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB RAM CRUCIAL CT4G4SFS824A CRUCIAL CT4G4SFS824A Wireless card Qualcomm Atheros QCA9377 LTE miniPCIe card Quectel EC-20 Display HDMI 1920x1080p Ethernet 6x Intel i210 (on-board) Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. SanDisk USB 3.2Gen1 16 GB 4. USB Type-C Hub Pro UCN3286 USB Keyboard DELL KB216 Power supply Channel Well Technology 12V, 7.5A 90W Protectli FW6E Dasharo Component Description CPU Intel(R) Core(TM) i5-8250U SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB RAM CRUCIAL CT4G4SFS824A CRUCIAL CT4G4SFS824A Wireless card Qualcomm Atheros QCA9377 LTE miniPCIe card Quectel EC-20 Display HDMI 1920x1080p Ethernet 6x Intel i210 (on-board) Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. SanDisk USB 3.2Gen1 16 GB 4. USB Type-C Hub Pro UCN3286 USB Keyboard DELL KB216 Power supply Channel Well Technology 12V, 7.5A 90W","title":"Hardware Configuration Matrix"},{"location":"variants/protectli_fw6/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/protectli_fw6/hardware-matrix/#introduction","text":"This document describes the hardware configuration used for validation of the coreboot port on the Protectli FW6 firewall.","title":"Introduction"},{"location":"variants/protectli_fw6/hardware-matrix/#protectli-fw6e-dasharo","text":"Component Description CPU IIntel(R) Celeron(TM) 3865U SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB RAM CRUCIAL CT4G4SFS824A CRUCIAL CT4G4SFS824A Wireless card Qualcomm Atheros QCA9377 LTE miniPCIe card Quectel EC-20 Display HDMI 1920x1080p Ethernet 6x Intel i211 (on-board) Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. SanDisk USB 3.2Gen1 16 GB 4. USB Type-C Hub Pro UCN3286 USB Keyboard DELL KB216 Power supply Channel Well Technology 12V, 7.5A 90W","title":"Protectli FW6E Dasharo"},{"location":"variants/protectli_fw6/hardware-matrix/#protectli-fw6b-dasharo","text":"Component Description CPU Intel(R) Core(TM) i3-7100U SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB RAM CRUCIAL CT4G4SFS824A CRUCIAL CT4G4SFS824A Wireless card Qualcomm Atheros QCA9377 LTE miniPCIe card Quectel EC-20 Display HDMI 1920x1080p Ethernet 6x Intel i211 (on-board) Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. SanDisk USB 3.2Gen1 16 GB 4. USB Type-C Hub Pro UCN3286 USB Keyboard DELL KB216 Power supply Channel Well Technology 12V, 7.5A 90W","title":"Protectli FW6B Dasharo"},{"location":"variants/protectli_fw6/hardware-matrix/#protectli-fw6c-dasharo","text":"Component Description CPU Intel(R) Core(TM) i5-7200U SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB RAM CRUCIAL CT4G4SFS824A CRUCIAL CT4G4SFS824A Wireless card Qualcomm Atheros QCA9377 LTE miniPCIe card Quectel EC-20 Display HDMI 1920x1080p Ethernet 6x Intel i210 (on-board) Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. SanDisk USB 3.2Gen1 16 GB 4. USB Type-C Hub Pro UCN3286 USB Keyboard DELL KB216 Power supply Channel Well Technology 12V, 7.5A 90W","title":"Protectli FW6C Dasharo"},{"location":"variants/protectli_fw6/hardware-matrix/#protectli-fw6d-dasharo","text":"Component Description CPU Intel(R) Core(TM) i5-8250U SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB RAM CRUCIAL CT4G4SFS824A CRUCIAL CT4G4SFS824A Wireless card Qualcomm Atheros QCA9377 LTE miniPCIe card Quectel EC-20 Display HDMI 1920x1080p Ethernet 6x Intel i210 (on-board) Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. SanDisk USB 3.2Gen1 16 GB 4. USB Type-C Hub Pro UCN3286 USB Keyboard DELL KB216 Power supply Channel Well Technology 12V, 7.5A 90W","title":"Protectli FW6D Dasharo"},{"location":"variants/protectli_fw6/hardware-matrix/#protectli-fw6e-dasharo_1","text":"Component Description CPU Intel(R) Core(TM) i5-8250U SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB RAM CRUCIAL CT4G4SFS824A CRUCIAL CT4G4SFS824A Wireless card Qualcomm Atheros QCA9377 LTE miniPCIe card Quectel EC-20 Display HDMI 1920x1080p Ethernet 6x Intel i210 (on-board) Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. SanDisk USB 3.2Gen1 16 GB 4. USB Type-C Hub Pro UCN3286 USB Keyboard DELL KB216 Power supply Channel Well Technology 12V, 7.5A 90W","title":"Protectli FW6E Dasharo"},{"location":"variants/protectli_fw6/installation-manual/","text":"Installation manual Flashing coreboot can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 22.04. Installing flashrom Your distribution will need at least flashrom v1.0. sudo apt install flashrom Reading flash contents Always prepare a backup of the current firmware image. To read from the flash and save them to a file ( dump.rom ), execute the following command: sudo flashrom -p internal -r dump.rom Flashing Dasharo flashrom -p internal -w [ path ] --ifd -i bios To flash Dasharo on the platform, execute the following command - replace [path] with the path to the Dasharo image you want to flash, e.g. protectli_fw6_DF_v1.0.14.rom . sudo flashrom -p internal -w protectli_fw6_DF_v1.0.14.rom --ifd -i bios After successful operation reboot the platform.","title":"Installation manual"},{"location":"variants/protectli_fw6/installation-manual/#installation-manual","text":"Flashing coreboot can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 22.04.","title":"Installation manual"},{"location":"variants/protectli_fw6/installation-manual/#installing-flashrom","text":"Your distribution will need at least flashrom v1.0. sudo apt install flashrom","title":"Installing flashrom"},{"location":"variants/protectli_fw6/installation-manual/#reading-flash-contents","text":"Always prepare a backup of the current firmware image. To read from the flash and save them to a file ( dump.rom ), execute the following command: sudo flashrom -p internal -r dump.rom","title":"Reading flash contents"},{"location":"variants/protectli_fw6/installation-manual/#flashing-dasharo","text":"flashrom -p internal -w [ path ] --ifd -i bios To flash Dasharo on the platform, execute the following command - replace [path] with the path to the Dasharo image you want to flash, e.g. protectli_fw6_DF_v1.0.14.rom . sudo flashrom -p internal -w protectli_fw6_DF_v1.0.14.rom --ifd -i bios After successful operation reboot the platform.","title":"Flashing Dasharo"},{"location":"variants/protectli_fw6/overview/","text":"Overview Releases - list of all releases Building manual - how to build Dasharo for Protectli FW6 Installation manual - how to install Dasharo for Protectli FW6 Hardware configuration matrix - definition of hardware configuration used during validation Test matrix - validation scope for the Protectli FW6","title":"Overview"},{"location":"variants/protectli_fw6/overview/#overview","text":"Releases - list of all releases Building manual - how to build Dasharo for Protectli FW6 Installation manual - how to install Dasharo for Protectli FW6 Hardware configuration matrix - definition of hardware configuration used during validation Test matrix - validation scope for the Protectli FW6","title":"Overview"},{"location":"variants/protectli_fw6/releases/","text":"Release Notes Following Release Notes describe status of Open Source Firmware development for Protectli FW6. For details about our release process please read Dasharo Standard Release Process . Subscribe to Protectli FW6 Dasharo Release Newsletter Test results for this platform can be found here . v1.0.14 - 2022-05-13 Changed Throttling temperature to 75 Celsius degrees Known issues Samsung memory modules do not work properly on older FW6A/B/C (SKU6LAV20) Binaries protectli_vault_kbl_v1.0.14.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 87f9fc85 revision e04b0ac8 seabios based on v1.0.6 revision 03bcdcaf ipxe based on 2019.3 stable revision ebf2eaf5 memtest based on v002 revision dd5b4ff2 Management Engine: ME 11.8.50.3399, SHA256: e1ce735139b6d9ebb81d7f6db288b0a896c39e4b1e606324b915bec949b6aca6 microcode: CPU signature: 0x0406E3, Date: 03.10.2019, Revision: 0xD6 CPU signature: 0x0806E9, Date: 27.04.2020, Revision: 0xD6 CPU signature: 0x0806E9, Date: 27.04.2020, Revision: 0xD6 CPU signature: 0x0806EA, Date: 27.04.2020, Revision: 0xD6 VBIOS: VBIOS blob for FW6A/B/C, SHA256: 470d3faefb09432bea00d637ec6b3ff51854e6cff0ee56627c0773acaffa4830 VBIOS blob for FW6D/E, SHA256: d1c746127e5288942efae65907739e18ff395fab70925b44dbafafd9e7b30cd7","title":"Releases"},{"location":"variants/protectli_fw6/releases/#release-notes","text":"Following Release Notes describe status of Open Source Firmware development for Protectli FW6. For details about our release process please read Dasharo Standard Release Process . Subscribe to Protectli FW6 Dasharo Release Newsletter Test results for this platform can be found here .","title":"Release Notes"},{"location":"variants/protectli_fw6/releases/#v1014-2022-05-13","text":"","title":"v1.0.14 - 2022-05-13"},{"location":"variants/protectli_fw6/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. Display ports and LCD support DSP DSP002.001, DSP002.003 3. USB HID and MSC Support USB USB001.001, USB001.002, USB002.001, USB002.002 4. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 5. Custom boot logo CLG DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 6. M.2 WiFi/Bluetooth WLE WLE001.001, WLE002.001, WLE003.001 7. Network boot PXE PXE007.001 8. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 9. Custom boot menu key CBK All 10. FreeBSD support BSD All 11. miniPCIe LTE/WiFi/Bluetooth MWL MWL004.001 12. Custom network boot entries CNB CNB001.002 Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. CPU temperature CPT All","title":"Test matrix"},{"location":"variants/protectli_fw6/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/protectli_fw6/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"About"},{"location":"variants/protectli_fw6/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. Display ports and LCD support DSP DSP002.001, DSP002.003 3. USB HID and MSC Support USB USB001.001, USB001.002, USB002.001, USB002.002 4. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 5. Custom boot logo CLG DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 6. M.2 WiFi/Bluetooth WLE WLE001.001, WLE002.001, WLE003.001 7. Network boot PXE PXE007.001 8. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 9. Custom boot menu key CBK All 10. FreeBSD support BSD All 11. miniPCIe LTE/WiFi/Bluetooth MWL MWL004.001 12. Custom network boot entries CNB CNB001.002","title":"Module: Dasharo compatibility"},{"location":"variants/protectli_fw6/test-matrix/#module-dasharo-performance","text":"No. Supported test suite Test suite ID Supported test cases 1. CPU temperature CPT All","title":"Module: Dasharo performance"},{"location":"variants/protectli_ptx01/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configuration used for validation of the coreboot port on the Protectli PT201/PT401/PT601 firewall. Protectli PT201 Component Description CPU Intel(R) Celeron(R) N5105 @ 2.00GHz RAM Micron MT53D512M64D4RQ-046 Flash memory Winbond 25Q16JVSSIQ USB Keyboard DELL KB216 USB Mouse DELL MS116p USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB Display HDMI 1920x1080p Ethernet controller 2x intel i225/i226 (on-board) Internal devices Audio subsystem 4G Modem AMIT MDG200-0T001 Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Power Adapter GA-0481204000V Protectli PT401 Component Description CPU Intel(R) Celeron(R) N5105 @ 2.00GHz RAM Micron MT53D512M64D4RQ-046 Flash memory Winbond 25Q128JVSIQ USB Keyboard DELL KB216 USB Mouse DELL MS116p USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB Display HDMI 1920x1080p Ethernet controller 4x intel i225/i226 (on-board) Internal devices Audio subsystem 4G Modem AMIT MDG200-0T001 Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Power Adapter GA-0481204000V Protectli PT601 Component Description CPU Intel(R) Pentium(R) Silver N6005 @ 2.00GHz RAM Micron MT53E512M32D4NQ-053 Flash memory Winbond 25Q128JVSIQ USB Keyboard DELL KB216 USB Mouse DELL MS116p USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB Display HDMI 1920x1080p Ethernet controller 6x intel i225/i226 (on-board) Internal devices Audio subsystem 4G Modem AMIT MDG200-0T001 Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Power Adapter GA-0481204000V","title":"Hardware configuration matrix"},{"location":"variants/protectli_ptx01/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/protectli_ptx01/hardware-matrix/#introduction","text":"This document describes the hardware configuration used for validation of the coreboot port on the Protectli PT201/PT401/PT601 firewall.","title":"Introduction"},{"location":"variants/protectli_ptx01/hardware-matrix/#protectli-pt201","text":"Component Description CPU Intel(R) Celeron(R) N5105 @ 2.00GHz RAM Micron MT53D512M64D4RQ-046 Flash memory Winbond 25Q16JVSSIQ USB Keyboard DELL KB216 USB Mouse DELL MS116p USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB Display HDMI 1920x1080p Ethernet controller 2x intel i225/i226 (on-board) Internal devices Audio subsystem 4G Modem AMIT MDG200-0T001 Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Power Adapter GA-0481204000V","title":"Protectli PT201"},{"location":"variants/protectli_ptx01/hardware-matrix/#protectli-pt401","text":"Component Description CPU Intel(R) Celeron(R) N5105 @ 2.00GHz RAM Micron MT53D512M64D4RQ-046 Flash memory Winbond 25Q128JVSIQ USB Keyboard DELL KB216 USB Mouse DELL MS116p USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB Display HDMI 1920x1080p Ethernet controller 4x intel i225/i226 (on-board) Internal devices Audio subsystem 4G Modem AMIT MDG200-0T001 Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Power Adapter GA-0481204000V","title":"Protectli PT401"},{"location":"variants/protectli_ptx01/hardware-matrix/#protectli-pt601","text":"Component Description CPU Intel(R) Pentium(R) Silver N6005 @ 2.00GHz RAM Micron MT53E512M32D4NQ-053 Flash memory Winbond 25Q128JVSIQ USB Keyboard DELL KB216 USB Mouse DELL MS116p USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB Display HDMI 1920x1080p Ethernet controller 6x intel i225/i226 (on-board) Internal devices Audio subsystem 4G Modem AMIT MDG200-0T001 Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Power Adapter GA-0481204000V","title":"Protectli PT601"},{"location":"variants/protectli_ptx01/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. The test scope is the same for all platforms of the PT family. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. UEFI compatible interface EFI All 2. Display ports DSP DSP002.001, DSP002.002, DSP002.003 3. Network boot utilities NBT All 4. NVMe support NVM All 5. Custom logo CLG All 6. Custom Boot Keys CBK All 7. USB HID and MSC Support USB USB001.xxx and USB002.xxx 8. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 9. miniPCIe LTE/WiFi/Bluetooth MWL MWL004.001 10. M.2 WiFi/Bluetooth WLE All 11. eMMC support MMC All 12. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 13. Custom network boot entries CNB CNB001.002 14. Audio subsystem AUD AUD007.xxx, AUD008.xxx 15. UEFI Shell USH All 16. USB detection UDT All 17. USB booting UBT All 18. Windows booting WBT WBT001.001 Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM TPM001.002, TPM001.003, TPM002.002, TPM002.003, TPM003.002, TPM003.003 2. Secure Boot support SBO All Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF Without CPU003.XXX and CPU005.XXX 4. Platform stability STB All","title":"Test matrix"},{"location":"variants/protectli_ptx01/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/protectli_ptx01/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. The test scope is the same for all platforms of the PT family.","title":"About"},{"location":"variants/protectli_ptx01/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. UEFI compatible interface EFI All 2. Display ports DSP DSP002.001, DSP002.002, DSP002.003 3. Network boot utilities NBT All 4. NVMe support NVM All 5. Custom logo CLG All 6. Custom Boot Keys CBK All 7. USB HID and MSC Support USB USB001.xxx and USB002.xxx 8. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 9. miniPCIe LTE/WiFi/Bluetooth MWL MWL004.001 10. M.2 WiFi/Bluetooth WLE All 11. eMMC support MMC All 12. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 13. Custom network boot entries CNB CNB001.002 14. Audio subsystem AUD AUD007.xxx, AUD008.xxx 15. UEFI Shell USH All 16. USB detection UDT All 17. USB booting UBT All 18. Windows booting WBT WBT001.001","title":"Module: Dasharo compatibility"},{"location":"variants/protectli_ptx01/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM TPM001.002, TPM001.003, TPM002.002, TPM002.003, TPM003.002, TPM003.003 2. Secure Boot support SBO All","title":"Module: Dasharo security"},{"location":"variants/protectli_ptx01/test-matrix/#module-dasharo-performance","text":"No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF Without CPU003.XXX and CPU005.XXX 4. Platform stability STB All","title":"Module: Dasharo performance"},{"location":"variants/protectli_vp2410/building-manual/","text":"Building manual Intro This document describes the procedure for compiling coreboot for Protectli VP2410. Requirements Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git Build Dasharo BIOS firmware This build procedure produces full firmware binary including blobs such as FSP, and ME. Currently, access to them is restricted to the OEM (Protectli) via a private repository. Clone the coreboot repository: git clone https://github.com/Dasharo/coreboot Checkout the desired version, e.g. v1.0.15 : cd coreboot git checkout protectli_vault_glk_v1.0.15 Checkout submodules: git submodule update --init --checkout Obtain the Protectli blobs package: Replace with a a proper path to the repository in a form of: git@repo-path.git . You should checkout to the same tag as in case aof the coreboot repository. cd 3rdparty/blobs/mainboard/ git init git remote add origin git fetch origin && git checkout protectli_vault_glk_v1.0.15 cd - ln -s ../blobs/mainboard/protectli/vault_glk/GeminilakeFspBinPkg/ 3rdparty/fsp/GeminilakeFspBinPkg Build the firmware v1.0.15 or newer: ./build.sh vp2410 The resulting coreboot image will be placed in the coreboot directory as protectli_vp2410_.rom .","title":"Building manual"},{"location":"variants/protectli_vp2410/building-manual/#building-manual","text":"","title":"Building manual"},{"location":"variants/protectli_vp2410/building-manual/#intro","text":"This document describes the procedure for compiling coreboot for Protectli VP2410.","title":"Intro"},{"location":"variants/protectli_vp2410/building-manual/#requirements","text":"Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git","title":"Requirements"},{"location":"variants/protectli_vp2410/building-manual/#build-dasharo-bios-firmware","text":"This build procedure produces full firmware binary including blobs such as FSP, and ME. Currently, access to them is restricted to the OEM (Protectli) via a private repository. Clone the coreboot repository: git clone https://github.com/Dasharo/coreboot Checkout the desired version, e.g. v1.0.15 : cd coreboot git checkout protectli_vault_glk_v1.0.15 Checkout submodules: git submodule update --init --checkout Obtain the Protectli blobs package: Replace with a a proper path to the repository in a form of: git@repo-path.git . You should checkout to the same tag as in case aof the coreboot repository. cd 3rdparty/blobs/mainboard/ git init git remote add origin git fetch origin && git checkout protectli_vault_glk_v1.0.15 cd - ln -s ../blobs/mainboard/protectli/vault_glk/GeminilakeFspBinPkg/ 3rdparty/fsp/GeminilakeFspBinPkg Build the firmware v1.0.15 or newer: ./build.sh vp2410 The resulting coreboot image will be placed in the coreboot directory as protectli_vp2410_.rom .","title":"Build Dasharo BIOS firmware"},{"location":"variants/protectli_vp2410/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configuration used for validation of the coreboot port on the Protectli VP2410 firewall. Protectli VP2410 Component Description CPU Intel Celeron J4125 @ 2.70GHz RAM CRUCIAL CT4G4SFS824A SAMSUNG M471A4G43MB1-CTD SAMSUNG M471A1K43CB1-CTD SAMSUNG M471A5244BB0-CRC KINGSTON KVR24S17S8/8 KINGSTON KVR26S19S8/16 Flash memory Macronix MX25U6473F SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB MMC drive SAMSUNG 8GTF4R (on-board) USB pendrives 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. USB Type-C Hub Pro UCN3286 Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p 3. USB Type-C Hub Pro UCN3286 LTE miniPCIe card Quectel EC-20 Wireless card Intel Wi-Fi 6 AX200 Display HDMI 1920x1080p, DP 1920x1080p Ethernet 4x intel i211 (on-board) TPM PC Engines TPM1A LPC TPM Power supply Channel Well Technology 12V, 5.0A 60W Note, that in RAM section all used during verification procedure modules have been listed. Device has only one RAM mounting slot.","title":"Hardware Configuration Matrix"},{"location":"variants/protectli_vp2410/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/protectli_vp2410/hardware-matrix/#introduction","text":"This document describes the hardware configuration used for validation of the coreboot port on the Protectli VP2410 firewall.","title":"Introduction"},{"location":"variants/protectli_vp2410/hardware-matrix/#protectli-vp2410","text":"Component Description CPU Intel Celeron J4125 @ 2.70GHz RAM CRUCIAL CT4G4SFS824A SAMSUNG M471A4G43MB1-CTD SAMSUNG M471A1K43CB1-CTD SAMSUNG M471A5244BB0-CRC KINGSTON KVR24S17S8/8 KINGSTON KVR26S19S8/16 Flash memory Macronix MX25U6473F SSD M.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB MMC drive SAMSUNG 8GTF4R (on-board) USB pendrives 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. USB Type-C Hub Pro UCN3286 Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p 3. USB Type-C Hub Pro UCN3286 LTE miniPCIe card Quectel EC-20 Wireless card Intel Wi-Fi 6 AX200 Display HDMI 1920x1080p, DP 1920x1080p Ethernet 4x intel i211 (on-board) TPM PC Engines TPM1A LPC TPM Power supply Channel Well Technology 12V, 5.0A 60W Note, that in RAM section all used during verification procedure modules have been listed. Device has only one RAM mounting slot.","title":"Protectli VP2410"},{"location":"variants/protectli_vp2410/initial-deployment/","text":"Initial deployment Initial flashing of Dasharo firmware can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 22.04. Deploy using Dasharo Tools Suite For simplicity we recommend using Dasharo Tools Suite to omit all compilation steps and deploy the Dasharo firmware seamlessly. Be sure to disable the BIOS lock in the AMI firmware setup utility: Go to Chipset tab Enter PCH IO Configuration Disable BIOS Lock . Save changes and reset. Now you are ready to use Dasharo Tools Suite (DTS): Boot Dasharo Tools Suite. Perform Dasharo installation. This will flash the full image, including the Intel ME. The operation requires a hard reset of the platform. To perform a hard reset: Power off the platform. Note, it may not power off completely due to flashed ME. Disconnect power supply from the board when OS finishes all tasks after power off (the screen goes dark or black). Disconnect the RTC/CMOS battery OR clear the CMOS using the pin header located near memory slots. Wait about 10 seconds and unshort the pins. Connect the power supply back. The platform should power on normally now. You can connect the battery back if it was disconnected. This concludes Dasharo deployment process using DTS. Build flashrom Currently, the latest flashrom release lacks support for Comet Lake U internal flashing. Because of this, we need to build flashrom from source. Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://github.com/Dasharo/flashrom -b dasharo-release cd flashrom Build flashrom: sudo make install Reading flash contents Always prepare a backup of the current firmware image. To read from the flash and save them to a file ( dump.rom ), execute the following command: flashrom -p internal -r dump.rom Keep the backup for later recovery if needed. Flashing Dasharo To flash Dasharo on the platform, execute the following command - replace [path] with the path to the Dasharo image you want to flash, e.g. protectli_vault_glk_v1.0.15.rom . If stock firmware is currently installed: flashrom -p internal -w [ path ] If Dasharo is currently installed, only the COREBOOT and IFWI partitions of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w protectli_vault_glk_v1.0.15.rom --fmap -i COREBOOT -i IFWI This command also preserves Dasharo UEFI settings and the boot order.","title":"Initial deployment"},{"location":"variants/protectli_vp2410/initial-deployment/#initial-deployment","text":"Initial flashing of Dasharo firmware can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 22.04.","title":"Initial deployment"},{"location":"variants/protectli_vp2410/initial-deployment/#deploy-using-dasharo-tools-suite","text":"For simplicity we recommend using Dasharo Tools Suite to omit all compilation steps and deploy the Dasharo firmware seamlessly. Be sure to disable the BIOS lock in the AMI firmware setup utility: Go to Chipset tab Enter PCH IO Configuration Disable BIOS Lock . Save changes and reset. Now you are ready to use Dasharo Tools Suite (DTS): Boot Dasharo Tools Suite. Perform Dasharo installation. This will flash the full image, including the Intel ME. The operation requires a hard reset of the platform. To perform a hard reset: Power off the platform. Note, it may not power off completely due to flashed ME. Disconnect power supply from the board when OS finishes all tasks after power off (the screen goes dark or black). Disconnect the RTC/CMOS battery OR clear the CMOS using the pin header located near memory slots. Wait about 10 seconds and unshort the pins. Connect the power supply back. The platform should power on normally now. You can connect the battery back if it was disconnected. This concludes Dasharo deployment process using DTS.","title":"Deploy using Dasharo Tools Suite"},{"location":"variants/protectli_vp2410/initial-deployment/#build-flashrom","text":"Currently, the latest flashrom release lacks support for Comet Lake U internal flashing. Because of this, we need to build flashrom from source. Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://github.com/Dasharo/flashrom -b dasharo-release cd flashrom Build flashrom: sudo make install","title":"Build flashrom"},{"location":"variants/protectli_vp2410/initial-deployment/#reading-flash-contents","text":"Always prepare a backup of the current firmware image. To read from the flash and save them to a file ( dump.rom ), execute the following command: flashrom -p internal -r dump.rom Keep the backup for later recovery if needed.","title":"Reading flash contents"},{"location":"variants/protectli_vp2410/initial-deployment/#flashing-dasharo","text":"To flash Dasharo on the platform, execute the following command - replace [path] with the path to the Dasharo image you want to flash, e.g. protectli_vault_glk_v1.0.15.rom . If stock firmware is currently installed: flashrom -p internal -w [ path ] If Dasharo is currently installed, only the COREBOOT and IFWI partitions of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w protectli_vault_glk_v1.0.15.rom --fmap -i COREBOOT -i IFWI This command also preserves Dasharo UEFI settings and the boot order.","title":"Flashing Dasharo"},{"location":"variants/protectli_vp2410/overview/","text":"Overview The Vault Pro is a small form network appliance built for use as a firewall / router, virtualization platform, a daily-driven personal computer, and more. The VP2410 is based on a 4 network port design that leverages a low power, but versatile Intel Celeron J4125 CPU. The VP2410 can accommodate up to 16GB DDR4 RAM and 2TB m.2 SATA SSD storage drive. The built-in 8GB eMMC module can be used for booting a light-weight OS for example, or for use as optional storage. VP2410 specification: Intel Celeron\u00ae J4125 Quad Core at 2 GHz (Burst up to 2.7 GHz) 4 Intel\u00ae Gigabit Ethernet NIC ports 8GB eMMC module on board Intel\u00ae AES-NI support Fanless and Silent Included 12v Power Supply, VESA mount kit, Serial Console Cable, SATA data and power cables for internal SSD, Quick Start Guide For more information please refer to the references below. References Protectli knowledge base Buy VP2410 in Protectli shop Documentation sections Releases - groups information about all releases. Building manual - describes how to build Dasharo for Protecli 2410. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for Protectli VP2410. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes validation scope used during Dasharo firmware validation procedure.","title":"Overview"},{"location":"variants/protectli_vp2410/overview/#overview","text":"The Vault Pro is a small form network appliance built for use as a firewall / router, virtualization platform, a daily-driven personal computer, and more. The VP2410 is based on a 4 network port design that leverages a low power, but versatile Intel Celeron J4125 CPU. The VP2410 can accommodate up to 16GB DDR4 RAM and 2TB m.2 SATA SSD storage drive. The built-in 8GB eMMC module can be used for booting a light-weight OS for example, or for use as optional storage. VP2410 specification: Intel Celeron\u00ae J4125 Quad Core at 2 GHz (Burst up to 2.7 GHz) 4 Intel\u00ae Gigabit Ethernet NIC ports 8GB eMMC module on board Intel\u00ae AES-NI support Fanless and Silent Included 12v Power Supply, VESA mount kit, Serial Console Cable, SATA data and power cables for internal SSD, Quick Start Guide For more information please refer to the references below.","title":"Overview"},{"location":"variants/protectli_vp2410/overview/#references","text":"Protectli knowledge base Buy VP2410 in Protectli shop","title":"References"},{"location":"variants/protectli_vp2410/overview/#documentation-sections","text":"Releases - groups information about all releases. Building manual - describes how to build Dasharo for Protecli 2410. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for Protectli VP2410. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes validation scope used during Dasharo firmware validation procedure.","title":"Documentation sections"},{"location":"variants/protectli_vp2410/recovery/","text":"Recovery Intro The following documentation describes the process of recovering hardware from the brick state with RTE and Dasharo open-source firmware. Prerequisites Prepared RTE SOIC-8 Pomona clip 6x female-female wire cables Connections To prepare the stand for flashing follow the steps described below: Connect the wire cables to the Pomona clip. Connect the Pomona clip to the SPI header on RTE. SPI header Pomona clip Vcc pin 5 (Vcc) GND pin 4 (GND) CS pin 1 (CS) SCLK pin 7 (CLK) MISO pin 2 (MISO) MOSI pin 8 (MOSI) Completely remove the motherboard from the platform cover. If there is little thermal paste on the CPU, apply it before reassembling the motherboard to the platform cover. Match pin 1(CS) on the Pomona clip with the first pin of the one of flash chip, marked with a small dot engraved on the chip. Firmware flashing To flash firmware follow the steps described below: Login to RTE via ssh or minicom . Turn on the platform by connecting the power supply. Wait at least 5 seconds. Turn off the platform by using the power button. Wait at least 3 seconds. Set the proper state of the SPI by using the following commands on RTE: # set SPI Vcc to 1.8V echo 0 > /sys/class/gpio/gpio405/value # SPI Vcc on echo 1 > /sys/class/gpio/gpio406/value # SPI lines ON echo 1 > /sys/class/gpio/gpio404/value Wait at least 2 seconds. Disconnect the power supply from the platform. Wait at least 2 seconds. Flash the platform by using the following command: flashrom -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 -c \"MX25U6435E/F\" -w [ path_to_binary ] Flashing with flashrom takes about 1 minute. Change back the state of the SPI by using the following commands: echo 0 > /sys/class/gpio/gpio404/value echo 0 > /sys/class/gpio/gpio406/value Reset CMOS, this can be done by two methods: Disconnect the CMOS battery, wait at least 10 seconds and connect again. Short the two pins from the CMOS header for at least 10 seconds. Turn on the platform by connecting the power supply. The first boot of the platform after proceeding with the above procedure can take much longer than standard.","title":"Recovery"},{"location":"variants/protectli_vp2410/recovery/#recovery","text":"","title":"Recovery"},{"location":"variants/protectli_vp2410/recovery/#intro","text":"The following documentation describes the process of recovering hardware from the brick state with RTE and Dasharo open-source firmware.","title":"Intro"},{"location":"variants/protectli_vp2410/recovery/#prerequisites","text":"Prepared RTE SOIC-8 Pomona clip 6x female-female wire cables","title":"Prerequisites"},{"location":"variants/protectli_vp2410/recovery/#connections","text":"To prepare the stand for flashing follow the steps described below: Connect the wire cables to the Pomona clip. Connect the Pomona clip to the SPI header on RTE. SPI header Pomona clip Vcc pin 5 (Vcc) GND pin 4 (GND) CS pin 1 (CS) SCLK pin 7 (CLK) MISO pin 2 (MISO) MOSI pin 8 (MOSI) Completely remove the motherboard from the platform cover. If there is little thermal paste on the CPU, apply it before reassembling the motherboard to the platform cover. Match pin 1(CS) on the Pomona clip with the first pin of the one of flash chip, marked with a small dot engraved on the chip.","title":"Connections"},{"location":"variants/protectli_vp2410/recovery/#firmware-flashing","text":"To flash firmware follow the steps described below: Login to RTE via ssh or minicom . Turn on the platform by connecting the power supply. Wait at least 5 seconds. Turn off the platform by using the power button. Wait at least 3 seconds. Set the proper state of the SPI by using the following commands on RTE: # set SPI Vcc to 1.8V echo 0 > /sys/class/gpio/gpio405/value # SPI Vcc on echo 1 > /sys/class/gpio/gpio406/value # SPI lines ON echo 1 > /sys/class/gpio/gpio404/value Wait at least 2 seconds. Disconnect the power supply from the platform. Wait at least 2 seconds. Flash the platform by using the following command: flashrom -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 -c \"MX25U6435E/F\" -w [ path_to_binary ] Flashing with flashrom takes about 1 minute. Change back the state of the SPI by using the following commands: echo 0 > /sys/class/gpio/gpio404/value echo 0 > /sys/class/gpio/gpio406/value Reset CMOS, this can be done by two methods: Disconnect the CMOS battery, wait at least 10 seconds and connect again. Short the two pins from the CMOS header for at least 10 seconds. Turn on the platform by connecting the power supply. The first boot of the platform after proceeding with the above procedure can take much longer than standard.","title":"Firmware flashing"},{"location":"variants/protectli_vp2410/releases/","text":"Release Notes Following Release Notes describe status of open-source firmware development for Protectli VP2410 family. For details about our release process please read Dasharo Standard Release Process . Subscribe to Protectli VP2410 Dasharo Release Newsletter Test results for this platform can be found here . v1.0.15 - 2022-05-31 Changed Customized Network boot menu and strings Fixed SMBIOS memory information showing 0 MB DRAM in setup Known issues USB 2.0 sticks not detected on VP2410 S3 resume does not work in Geminilake FSP Binaries protectli_VP2410_DF_v1.0.15.rom sha256 sha256.sig How to verify signatures: wget https://github.com/protectli-root/protectli-firmware-updater/raw/main/images/protectli_vp2410_DF_v1.0.15.rom -O protectli_vault_glk_v1.0.15.rom wget https://3mdeb.com/open-source-firmware/Dasharo/protectli_vault_glk/v1.0.15/protectli_vault_glk_v1.0.15.rom.sha256 wget https://3mdeb.com/open-source-firmware/Dasharo/protectli_vault_glk/v1.0.15/protectli_vault_glk_v1.0.15.rom.sha256.sig gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/customer-keys/protectli/release-keys/protectli-dasharo-firewall-release-1.0-key.asc gpg --list-sigs \"3mdeb Master Key\" \"3mdeb Dasharo Master Key\" \"Protectli Dasharo Firewall Release 1.0 Signing Key\" sha256sum -c protectli_vault_glk_v1.0.15.rom.sha256 gpg -v --verify protectli_vault_glk_v1.0.15.rom.sha256.sig protectli_vault_glk_v1.0.15.rom.sha256 SBOM (Software Bill of Materials) coreboot based on b77cf229 revision f59b1ec9 edk2 based on 7f90b9cd revision 90364638 iPXE for EFI revision 988d2 FSP: Custom version based on Intel GeminiLake FSP 2.2.1.3 Management Engine: Custom image based on CSE 4.0.30.1392 microcode: CPU signature: 0x0706A8, Date: 09.06.2020, Revision: 0x18 CPU signature: 0x0706A0, Date: 12.07.2017, Revision: 0x26 CPU signature: 0x0706A1, Date: 09.06.2020, Revision: 0x34","title":"Releases"},{"location":"variants/protectli_vp2410/releases/#release-notes","text":"Following Release Notes describe status of open-source firmware development for Protectli VP2410 family. For details about our release process please read Dasharo Standard Release Process . Subscribe to Protectli VP2410 Dasharo Release Newsletter Test results for this platform can be found here .","title":"Release Notes"},{"location":"variants/protectli_vp2410/releases/#v1015-2022-05-31","text":"","title":"v1.0.15 - 2022-05-31"},{"location":"variants/protectli_vp2410/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports DSP DSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003 4. Network boot utilities NBT All 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB All 9. FreeBSD support BSD All 10. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 11. USB-C support UTC UTC004.001, UTC004.001 12. M.2 WiFi/Bluetooth WLE ALL 13. eMMC support MMC MMC001.001 14. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 15. Custom network boot entries CNB CNB001.002 16. M.2 automatic SATA/NVMe switching support MSS MSS001.001 17. Windows booting WBT WBT001.001 18. Audio subsystem AUD AUD001.001, AUD001.002, AUD002.001, AUD002.002, AUD003.001, AUD003.002, AUD004.001, AUD004.002, AUD005.001, AUD005.002, AUD006.001, AUD006.002 19. UEFI Shell USH All 20. USB detection UDT All 21. USB booting UBT All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO VBO006.002, VBO007.002, VBO008.001 3. Measured Boot support MBO All 4. Secure Boot support SBO All 5. BIOS lock support BLS All Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All 4. Platform stability STB All","title":"Test matrix"},{"location":"variants/protectli_vp2410/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/protectli_vp2410/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"About"},{"location":"variants/protectli_vp2410/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports DSP DSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003 4. Network boot utilities NBT All 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB All 9. FreeBSD support BSD All 10. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 11. USB-C support UTC UTC004.001, UTC004.001 12. M.2 WiFi/Bluetooth WLE ALL 13. eMMC support MMC MMC001.001 14. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 15. Custom network boot entries CNB CNB001.002 16. M.2 automatic SATA/NVMe switching support MSS MSS001.001 17. Windows booting WBT WBT001.001 18. Audio subsystem AUD AUD001.001, AUD001.002, AUD002.001, AUD002.002, AUD003.001, AUD003.002, AUD004.001, AUD004.002, AUD005.001, AUD005.002, AUD006.001, AUD006.002 19. UEFI Shell USH All 20. USB detection UDT All 21. USB booting UBT All","title":"Module: Dasharo compatibility"},{"location":"variants/protectli_vp2410/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO VBO006.002, VBO007.002, VBO008.001 3. Measured Boot support MBO All 4. Secure Boot support SBO All 5. BIOS lock support BLS All","title":"Module: Dasharo security"},{"location":"variants/protectli_vp2410/test-matrix/#module-dasharo-performance","text":"No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF All 4. Platform stability STB All","title":"Module: Dasharo performance"},{"location":"variants/protectli_vp2420/building-manual/","text":"Building manual Intro This document describes the procedure for compiling coreboot for Protectli VP2420. Requirements Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git Build Dasharo BIOS firmware This build procedure produces full firmware binary including blobs such as FSP, and ME. Currently, access to them is restricted to the OEM (Protectli) via a private repository. Clone the coreboot repository: git clone https://github.com/Dasharo/coreboot Checkout the desired version, e.g. v1.1.0 : cd coreboot git checkout protectli_vault_ehl_v1.1.0 Checkout submodules: git submodule update --init --checkout Obtain the Protectli blobs package: Replace with a a proper path to the repository in a form of: git@repo-path.git . You should checkout to the same tag as in case aof the coreboot repository. cd 3rdparty/blobs/mainboard/ git init git remote add origin git fetch origin && git checkout protectli_vault_ehl_v1.1.0 cd - Build the firmware v1.1.0 or newer: ./build.sh vp2420 The resulting coreboot image will be placed in the coreboot directory as protectli_vp2420_.rom .","title":"Building manual"},{"location":"variants/protectli_vp2420/building-manual/#building-manual","text":"","title":"Building manual"},{"location":"variants/protectli_vp2420/building-manual/#intro","text":"This document describes the procedure for compiling coreboot for Protectli VP2420.","title":"Intro"},{"location":"variants/protectli_vp2420/building-manual/#requirements","text":"Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git","title":"Requirements"},{"location":"variants/protectli_vp2420/building-manual/#build-dasharo-bios-firmware","text":"This build procedure produces full firmware binary including blobs such as FSP, and ME. Currently, access to them is restricted to the OEM (Protectli) via a private repository. Clone the coreboot repository: git clone https://github.com/Dasharo/coreboot Checkout the desired version, e.g. v1.1.0 : cd coreboot git checkout protectli_vault_ehl_v1.1.0 Checkout submodules: git submodule update --init --checkout Obtain the Protectli blobs package: Replace with a a proper path to the repository in a form of: git@repo-path.git . You should checkout to the same tag as in case aof the coreboot repository. cd 3rdparty/blobs/mainboard/ git init git remote add origin git fetch origin && git checkout protectli_vault_ehl_v1.1.0 cd - Build the firmware v1.1.0 or newer: ./build.sh vp2420 The resulting coreboot image will be placed in the coreboot directory as protectli_vp2420_.rom .","title":"Build Dasharo BIOS firmware"},{"location":"variants/protectli_vp2420/firmware-update/","text":"Firmware update The following documentation describes the process of Dasharo open-source firmware update. If your device is currently flashed with the proprietary firmware please refer to the Initial deployment documentation. For simplicity of the update process, we recommend using Dasharo Tools Suite . Before starting the update procedure be sure to disable Dasharo BIOS Boot medium lock, SMM BIOS Write Protection and Secure boot: Power on the device. While the device is booting, hold the DELETE key to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify the state of the Lock the BIOS boot medium and Enable SMM BIOS write protection options - if any of those are set, press Space to unselect them and then F10 to save the changes. Go back to the main menu using the ESC key. Enter the Device Manager menu. Enter the Secure Boot Configuration submenu. Verify that the Current Secure Boot State field says Disabled - if not, unselect the Attempt Secure Boot option below then press F10 to save the changes. Reboot the device to properly apply the changes. The settings of all the above options can be restored after a firmware update. Updating minor versions v1.x.y Both WP_RO and RW_SECTION_A partitions of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w [ path ] --fmap -i RW_SECTION_A -i WP_RO This command also preserves current Dasharo UEFI settings and the boot order. Updating patch version v1.0.x Only the RW_SECTION_A partition of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w [ path ] --fmap -i RW_SECTION_A This command also preserves Dasharo UEFI settings and the boot order.","title":"Firmware update"},{"location":"variants/protectli_vp2420/firmware-update/#firmware-update","text":"The following documentation describes the process of Dasharo open-source firmware update. If your device is currently flashed with the proprietary firmware please refer to the Initial deployment documentation. For simplicity of the update process, we recommend using Dasharo Tools Suite . Before starting the update procedure be sure to disable Dasharo BIOS Boot medium lock, SMM BIOS Write Protection and Secure boot: Power on the device. While the device is booting, hold the DELETE key to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify the state of the Lock the BIOS boot medium and Enable SMM BIOS write protection options - if any of those are set, press Space to unselect them and then F10 to save the changes. Go back to the main menu using the ESC key. Enter the Device Manager menu. Enter the Secure Boot Configuration submenu. Verify that the Current Secure Boot State field says Disabled - if not, unselect the Attempt Secure Boot option below then press F10 to save the changes. Reboot the device to properly apply the changes. The settings of all the above options can be restored after a firmware update.","title":"Firmware update"},{"location":"variants/protectli_vp2420/firmware-update/#updating-minor-versions-v1xy","text":"Both WP_RO and RW_SECTION_A partitions of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w [ path ] --fmap -i RW_SECTION_A -i WP_RO This command also preserves current Dasharo UEFI settings and the boot order.","title":"Updating minor versions v1.x.y"},{"location":"variants/protectli_vp2420/firmware-update/#updating-patch-version-v10x","text":"Only the RW_SECTION_A partition of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w [ path ] --fmap -i RW_SECTION_A This command also preserves Dasharo UEFI settings and the boot order.","title":"Updating patch version v1.0.x"},{"location":"variants/protectli_vp2420/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configuration used for validation of the coreboot port on the Protectli VP2420 firewall. Protectli VP2420 Component Description CPU Intel(R) Celeron(R) J6412 @ 2.60GHz RAM KINGSTON KVR29S21S8/16 Flash memory Macronix KH25L12835F SSD 1. SSD Samsung 860 EVO M.2 NZ-N6E250 250GB 2. SSDPR-CL100-240-g2 MMC drive SAMSUNG 8GTF4R (on-board) USB pendrives 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. USB Type-C Hub Pro UCN3286 USB headers USB Expander Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p 3. USB Type-C Hub Pro UCN3286 Wireless card Intel Wi-Fi 6 AX200 Display HDMI 1920x1080p, DP 1920x1080p Ethernet 4x intel i225 (on-board) Power supply Channel Well Technology 12V, 5.0A 60W Note, that in RAM section all used during verification procedure modules have been listed. Device has only one RAM mounting slot.","title":"Hardware Configuration Matrix"},{"location":"variants/protectli_vp2420/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/protectli_vp2420/hardware-matrix/#introduction","text":"This document describes the hardware configuration used for validation of the coreboot port on the Protectli VP2420 firewall.","title":"Introduction"},{"location":"variants/protectli_vp2420/hardware-matrix/#protectli-vp2420","text":"Component Description CPU Intel(R) Celeron(R) J6412 @ 2.60GHz RAM KINGSTON KVR29S21S8/16 Flash memory Macronix KH25L12835F SSD 1. SSD Samsung 860 EVO M.2 NZ-N6E250 250GB 2. SSDPR-CL100-240-g2 MMC drive SAMSUNG 8GTF4R (on-board) USB pendrives 1. SanDisk USB 3.2Gen1 16 GB 2. SanDisk USB 3.2Gen1 16 GB 3. USB Type-C Hub Pro UCN3286 USB headers USB Expander Attached devices 1. Logitech, Inc. Keyboard K120 2. Dell Mouse MS116p 3. USB Type-C Hub Pro UCN3286 Wireless card Intel Wi-Fi 6 AX200 Display HDMI 1920x1080p, DP 1920x1080p Ethernet 4x intel i225 (on-board) Power supply Channel Well Technology 12V, 5.0A 60W Note, that in RAM section all used during verification procedure modules have been listed. Device has only one RAM mounting slot.","title":"Protectli VP2420"},{"location":"variants/protectli_vp2420/initial-deployment/","text":"Initial deployment Initial flashing of Dasharo firmware can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 22.04. Deploy using Dasharo Tools Suite For simplicity we recommend using Dasharo Tools Suite to omit all compilation steps and deploy the Dasharo firmware seamlessly. Be sure to disable the BIOS lock in the AMI firmware setup utility: Go to Chipset tab Enter PCH IO Configuration Disable BIOS Lock . Save changes and reset. Now you are ready to use Dasharo Tools Suite (DTS): Boot Dasharo Tools Suite. Perform Dasharo installation. Build flashrom Currently, the latest flashrom release lacks support for Comet Lake U internal flashing. Because of this, we need to build flashrom from source. Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://github.com/Dasharo/flashrom -b dasharo-release cd flashrom Build flashrom: sudo make install Reading flash contents Always prepare a backup of the current firmware image. To read from the flash and save them to a file ( backup.rom ), execute the following command: flashrom -p internal -r dump.rom Keep the backup for later recovery if needed. Flashing Dasharo To flash Dasharo on the platform, execute the following command - replace [path] with the path to the Dasharo image you want to flash, e.g. protectli_vault_ehl_v1.0.0.rom . If stock firmware is currently installed: flashrom -p internal -w [ path ] --ifd -i bios If Dasharo is currently installed, only the RW_SECTION_A partition of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w protectli_vault_ehl_v1.x.y.rom --fmap -i RW_SECTION_A This command also preserves Dasharo UEFI settings and the boot order.","title":"Initial deployment"},{"location":"variants/protectli_vp2420/initial-deployment/#initial-deployment","text":"Initial flashing of Dasharo firmware can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 22.04.","title":"Initial deployment"},{"location":"variants/protectli_vp2420/initial-deployment/#deploy-using-dasharo-tools-suite","text":"For simplicity we recommend using Dasharo Tools Suite to omit all compilation steps and deploy the Dasharo firmware seamlessly. Be sure to disable the BIOS lock in the AMI firmware setup utility: Go to Chipset tab Enter PCH IO Configuration Disable BIOS Lock . Save changes and reset. Now you are ready to use Dasharo Tools Suite (DTS): Boot Dasharo Tools Suite. Perform Dasharo installation.","title":"Deploy using Dasharo Tools Suite"},{"location":"variants/protectli_vp2420/initial-deployment/#build-flashrom","text":"Currently, the latest flashrom release lacks support for Comet Lake U internal flashing. Because of this, we need to build flashrom from source. Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://github.com/Dasharo/flashrom -b dasharo-release cd flashrom Build flashrom: sudo make install","title":"Build flashrom"},{"location":"variants/protectli_vp2420/initial-deployment/#reading-flash-contents","text":"Always prepare a backup of the current firmware image. To read from the flash and save them to a file ( backup.rom ), execute the following command: flashrom -p internal -r dump.rom Keep the backup for later recovery if needed.","title":"Reading flash contents"},{"location":"variants/protectli_vp2420/initial-deployment/#flashing-dasharo","text":"To flash Dasharo on the platform, execute the following command - replace [path] with the path to the Dasharo image you want to flash, e.g. protectli_vault_ehl_v1.0.0.rom . If stock firmware is currently installed: flashrom -p internal -w [ path ] --ifd -i bios If Dasharo is currently installed, only the RW_SECTION_A partition of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w protectli_vault_ehl_v1.x.y.rom --fmap -i RW_SECTION_A This command also preserves Dasharo UEFI settings and the boot order.","title":"Flashing Dasharo"},{"location":"variants/protectli_vp2420/overview/","text":"Overview The Vault Pro is a small form network appliance built for use as a firewall / router, virtualization platform, a daily-driven personal computer, and more. The VP2420 is based on a 4 x 2.5 G network port design that leverages a low power, but versatile Intel Celeron J6412 CPU. The VP2420 can accommodate up to 32 GB DDR4 RAM and 2 TB M.2 SATA SSD storage drive (Note: The VP2420 supports M.2 SATA drives, not NVMe drives). The built-in 8 GB eMMC module can be used for booting a light-weight OS for example, or for use as optional storage. VP2410 specification: Intel Celeron\u00ae J6412 Quad Core at 2 GHz (Burst up to 2.6 GHz) 4 Intel\u00ae 2.5 Gigabit Ethernet NIC ports M.2 SATA SSD Slot (Note: This device does not support NVMe drives) 8 GB eMMC module on board Intel\u00ae AES-NI support Fanless and Silent Included 12v Power Supply, VESA mount kit, Serial Console Cable, SATA data and power cables for internal SSD, Quick Start Guide For more information please refer to the references below. References Protectli knowledge base Buy VP2420 in Protectli shop Documentation sections Releases - groups information about all releases. Building manual - describes how to build Dasharo for Protecli 2420. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for Protectli VP2420. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes validation scope used during Dasharo firmware validation procedure.","title":"Overview"},{"location":"variants/protectli_vp2420/overview/#overview","text":"The Vault Pro is a small form network appliance built for use as a firewall / router, virtualization platform, a daily-driven personal computer, and more. The VP2420 is based on a 4 x 2.5 G network port design that leverages a low power, but versatile Intel Celeron J6412 CPU. The VP2420 can accommodate up to 32 GB DDR4 RAM and 2 TB M.2 SATA SSD storage drive (Note: The VP2420 supports M.2 SATA drives, not NVMe drives). The built-in 8 GB eMMC module can be used for booting a light-weight OS for example, or for use as optional storage. VP2410 specification: Intel Celeron\u00ae J6412 Quad Core at 2 GHz (Burst up to 2.6 GHz) 4 Intel\u00ae 2.5 Gigabit Ethernet NIC ports M.2 SATA SSD Slot (Note: This device does not support NVMe drives) 8 GB eMMC module on board Intel\u00ae AES-NI support Fanless and Silent Included 12v Power Supply, VESA mount kit, Serial Console Cable, SATA data and power cables for internal SSD, Quick Start Guide For more information please refer to the references below.","title":"Overview"},{"location":"variants/protectli_vp2420/overview/#references","text":"Protectli knowledge base Buy VP2420 in Protectli shop","title":"References"},{"location":"variants/protectli_vp2420/overview/#documentation-sections","text":"Releases - groups information about all releases. Building manual - describes how to build Dasharo for Protecli 2420. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for Protectli VP2420. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes validation scope used during Dasharo firmware validation procedure.","title":"Documentation sections"},{"location":"variants/protectli_vp2420/recovery/","text":"Recovery Intro The following documentation describes the process of recovering hardware from the brick state with RTE and Dasharo open-source firmware. Prerequisites Prepared RTE SOIC-8 Pomona clip 6x female-female wire cables Connections To prepare the stand for flashing follow the steps described below: Connect the wire cables to the Pomona clip. Connect the Pomona clip to the SPI header on RTE. SPI header Pomona clip Vcc pin 5 (Vcc) GND pin 4 (GND) CS pin 1 (CS) SCLK pin 7 (CLK) MISO pin 2 (MISO) MOSI pin 8 (MOSI) Open the platform cover. Match pin 1(CS) on the Pomona clip with the first pin of the one of flash chip, marked with a small dot engraved on the chip. Firmware flashing To flash firmware follow the steps described below: Login to RTE via ssh or minicom . Turn on the platform by connecting the power supply. Wait at least 5 seconds. Turn off the platform by using the power button. Wait at least 3 seconds. Set the proper state of the SPI by using the following commands on RTE: # set SPI Vcc to 3.3V echo 1 > /sys/class/gpio/gpio405/value # SPI Vcc on echo 1 > /sys/class/gpio/gpio406/value # SPI lines ON echo 1 > /sys/class/gpio/gpio404/value Wait at least 2 seconds. Disconnect the power supply from the platform. Wait at least 2 seconds. Flash the platform by using the following command: flashrom -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 -c \"MX25L12835F/MX25L12845E/MX25L12865E\" -w [ path_to_binary ] Flashing with flashrom takes about 1 minute. Change back the state of the SPI by using the following commands: echo 0 > /sys/class/gpio/gpio404/value echo 0 > /sys/class/gpio/gpio406/value Reset CMOS, this can be done by two methods: Disconnect the CMOS battery, wait at least 10 seconds and connect again. Short the two pins from the CMOS header for at least 10 seconds. Turn on the platform by connecting the power supply. The first boot of the platform after proceeding with the above procedure can take much longer than standard.","title":"Recovery"},{"location":"variants/protectli_vp2420/recovery/#recovery","text":"","title":"Recovery"},{"location":"variants/protectli_vp2420/recovery/#intro","text":"The following documentation describes the process of recovering hardware from the brick state with RTE and Dasharo open-source firmware.","title":"Intro"},{"location":"variants/protectli_vp2420/recovery/#prerequisites","text":"Prepared RTE SOIC-8 Pomona clip 6x female-female wire cables","title":"Prerequisites"},{"location":"variants/protectli_vp2420/recovery/#connections","text":"To prepare the stand for flashing follow the steps described below: Connect the wire cables to the Pomona clip. Connect the Pomona clip to the SPI header on RTE. SPI header Pomona clip Vcc pin 5 (Vcc) GND pin 4 (GND) CS pin 1 (CS) SCLK pin 7 (CLK) MISO pin 2 (MISO) MOSI pin 8 (MOSI) Open the platform cover. Match pin 1(CS) on the Pomona clip with the first pin of the one of flash chip, marked with a small dot engraved on the chip.","title":"Connections"},{"location":"variants/protectli_vp2420/recovery/#firmware-flashing","text":"To flash firmware follow the steps described below: Login to RTE via ssh or minicom . Turn on the platform by connecting the power supply. Wait at least 5 seconds. Turn off the platform by using the power button. Wait at least 3 seconds. Set the proper state of the SPI by using the following commands on RTE: # set SPI Vcc to 3.3V echo 1 > /sys/class/gpio/gpio405/value # SPI Vcc on echo 1 > /sys/class/gpio/gpio406/value # SPI lines ON echo 1 > /sys/class/gpio/gpio404/value Wait at least 2 seconds. Disconnect the power supply from the platform. Wait at least 2 seconds. Flash the platform by using the following command: flashrom -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 -c \"MX25L12835F/MX25L12845E/MX25L12865E\" -w [ path_to_binary ] Flashing with flashrom takes about 1 minute. Change back the state of the SPI by using the following commands: echo 0 > /sys/class/gpio/gpio404/value echo 0 > /sys/class/gpio/gpio406/value Reset CMOS, this can be done by two methods: Disconnect the CMOS battery, wait at least 10 seconds and connect again. Short the two pins from the CMOS header for at least 10 seconds. Turn on the platform by connecting the power supply. The first boot of the platform after proceeding with the above procedure can take much longer than standard.","title":"Firmware flashing"},{"location":"variants/protectli_vp2420/releases/","text":"Release Notes Following Release Notes describe status of open-source firmware development for Protectli VP2420 family. For details about our release process please read Dasharo Standard Release Process . Subscribe to Protectli VP2420 Dasharo Release Newsletter Test results for this platform can be found here . v1.1.0 - 2023-04-20 Added USB stack and mass storage enable/disable option SMM BIOS write protection enable/disable option Changed Updating from v1.0.x requires flashing the WP_RO recovery partition Firmware version v1.1.x are signed with a new key Keys must be provisioned prior enabling Secure Boot Fixed VP2420 memory issues and incorrectly reported memory capacity Popup with information about recovery mode is still displayed after flashing with a valid binary Known issues pfSense boot time Double characters in pfSense initial boot phase Binaries protectli_vp2420_v1.1.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on c86c926 revision e36a117d edk2 based on 7f90b9cd revision 19bf14b4 v1.0.1 - 2023-02-02 Added TPM 2.0 support over SPI interface TPM Measured Boot Changed Downgrade edk2 Secure Boot driver to achieve consistent user experience as on the VP46XX v1.0.19 release Fixed Dasharo BIOS lock menu is missing iPXE entry doesn't occur in setup menu Impossibility of pfSense/OPNsense console versions installation Known issues Popup with information about recovery mode is still displayed after flashing with a valid binary pfSense boot time Double characters in pfSense initial boot phase Binaries protectli_vp2420_v1.0.1.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on c86c926 revision 54cbbc5b edk2 based on 7f90b9cd revision e31b7a71 v1.0.0 - 2022-12-22 Added Support for VP2420 platform Vboot Verified Boot TPM Measured Boot Vboot recovery notification in UEFI Payload UEFI Shell UEFI Secure Boot BIOS flash protection for Vboot recovery region UEFI boot support Intel i225 controller network boot support Customized boot menu keys Customized setup menu keys Configurable boot order Configurable boot options Binaries protectli_VP2420_v1.0.0.rom sha256 sha256.sig How to verify signatures: wget https://3mdeb.com/open-source-firmware/Dasharo/protectli_vault_ehl/v1.0.0/protectli_vp2420_v1.0.0.rom wget https://3mdeb.com/open-source-firmware/Dasharo/protectli_vault_ehl/v1.0.0/protectli_vp2420_v1.0.0.rom.sha256 wget https://3mdeb.com/open-source-firmware/Dasharo/protectli_vault_ehl/v1.0.0/protectli_vp2420_v1.0.0.rom.sha256.sig gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/customer-keys/protectli/release-keys/protectli-dasharo-firewall-release-1.0-key.asc gpg --list-sigs \"3mdeb Master Key\" \"3mdeb Dasharo Master Key\" \"Protectli Dasharo Firewall Release 1.0 Signing Key\" sha256sum -c protectli_vp2420_v1.0.0.rom.sha256 gpg -v --verify protectli_vp2420_v1.0.0.rom.sha256.sig protectli_vp2420_v1.0.0.rom.sha256 SBOM (Software Bill of Materials) coreboot based on c492b427 revision c86c9266 edk2 based on e461f08 revision 7948a20 iPXE for EFI revision 988d2","title":"Releases"},{"location":"variants/protectli_vp2420/releases/#release-notes","text":"Following Release Notes describe status of open-source firmware development for Protectli VP2420 family. For details about our release process please read Dasharo Standard Release Process . Subscribe to Protectli VP2420 Dasharo Release Newsletter Test results for this platform can be found here .","title":"Release Notes"},{"location":"variants/protectli_vp2420/releases/#v110-2023-04-20","text":"","title":"v1.1.0 - 2023-04-20"},{"location":"variants/protectli_vp2420/releases/#v101-2023-02-02","text":"","title":"v1.0.1 - 2023-02-02"},{"location":"variants/protectli_vp2420/releases/#v100-2022-12-22","text":"","title":"v1.0.0 - 2022-12-22"},{"location":"variants/protectli_vp2420/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports DSP DSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003 4. Network boot utilities NBT All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB USB001.XXX and USB002.XXX 9. FreeBSD support BSD All 10. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 11. USB-C support UTC UTC004.001, UTC004.002 12. M.2 WiFi/Bluetooth WLE ALL 13. eMMC support MMC MMC001.001 14. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 15. Custom network boot entries CNB CNB001.002 17. Windows booting WBT WBT001.001 18. UEFI Shell USH All 19. USB detection UDT All 20. USB booting UBT All 21. pfSense support PFS All 22. OPNsense support OPN All 23. Proxmox support PVE All 24. Ubuntu Server support USS All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM TPM001.002 and TPM001.003 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO All 5. BIOS lock support BLS All 6. USB stack enable/disable USS All 7. SMM BIOS write protection SMM All Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF Without CPU003.XXX and CPU005.XXX 4. Platform stability STB All 5. Ubuntu booting performance test BUB All 6. Debian booting performance test BDE All 7. FreeBSD booting performance test BFB All 8. Proxmox booting performance test BPM All 9. Ubuntu Server booting performance test BUS All 10. OPNsense (serial output) booting performance test BOS All 11. OPNsense (VGA output) booting performance test BOV All 12. pfSense (serial output) booting performance test BPS All 13. pfSense (VGA output) booting performance test BPV All","title":"Test matrix"},{"location":"variants/protectli_vp2420/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/protectli_vp2420/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"About"},{"location":"variants/protectli_vp2420/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports DSP DSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003 4. Network boot utilities NBT All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB USB001.XXX and USB002.XXX 9. FreeBSD support BSD All 10. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 11. USB-C support UTC UTC004.001, UTC004.002 12. M.2 WiFi/Bluetooth WLE ALL 13. eMMC support MMC MMC001.001 14. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 15. Custom network boot entries CNB CNB001.002 17. Windows booting WBT WBT001.001 18. UEFI Shell USH All 19. USB detection UDT All 20. USB booting UBT All 21. pfSense support PFS All 22. OPNsense support OPN All 23. Proxmox support PVE All 24. Ubuntu Server support USS All","title":"Module: Dasharo compatibility"},{"location":"variants/protectli_vp2420/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM TPM001.002 and TPM001.003 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO All 5. BIOS lock support BLS All 6. USB stack enable/disable USS All 7. SMM BIOS write protection SMM All","title":"Module: Dasharo security"},{"location":"variants/protectli_vp2420/test-matrix/#module-dasharo-performance","text":"No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF Without CPU003.XXX and CPU005.XXX 4. Platform stability STB All 5. Ubuntu booting performance test BUB All 6. Debian booting performance test BDE All 7. FreeBSD booting performance test BFB All 8. Proxmox booting performance test BPM All 9. Ubuntu Server booting performance test BUS All 10. OPNsense (serial output) booting performance test BOS All 11. OPNsense (VGA output) booting performance test BOV All 12. pfSense (serial output) booting performance test BPS All 13. pfSense (VGA output) booting performance test BPV All","title":"Module: Dasharo performance"},{"location":"variants/protectli_vp46xx/building-manual/","text":"Building manual Intro This document describes the procedure for compiling coreboot for Protectli VP4630, VP4650 and VP4670. Requirements Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git Build Dasharo BIOS firmware This build procedure produces full firmware binary including blobs such as FSP, and ME. Currently, access to them is restricted to the OEM (Protectli) via a private repository. Since version v1.0.18 VP4630 and VP4650 use different configuration file than VP4670. Versions v1.0.17 and older do not support VP4650 and VP4670 at all. Clone the coreboot repository: git clone https://github.com/Dasharo/coreboot Checkout the desired version, e.g. v1.0.19 : cd coreboot git checkout protectli_vault_cml_v1.0.19 Checkout submodules: git submodule update --init --checkout Obtain the Protectli blobs package: Replace with a a proper path to the repository in a form of: git@repo-path.git . You should checkout to the same tag as in case aof the coreboot repository. cd 3rdparty/blobs/mainboard/ git init git remote add origin git fetch origin && git checkout protectli_vault_cml_v1.0.19 cd - Build the firmware v1.0.19 or newer: for VP4630 and VP4650 ./build.sh vp4630_vp4650 for VP4670 ./build.sh vp4670 The resulting coreboot image will be placed in the coreboot directory as protectli_vault_cml__vp4630_vp4650.rom or protectli_vault_cml__vp4670.rom respectvely.","title":"Building manual"},{"location":"variants/protectli_vp46xx/building-manual/#building-manual","text":"","title":"Building manual"},{"location":"variants/protectli_vp46xx/building-manual/#intro","text":"This document describes the procedure for compiling coreboot for Protectli VP4630, VP4650 and VP4670.","title":"Intro"},{"location":"variants/protectli_vp46xx/building-manual/#requirements","text":"Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git","title":"Requirements"},{"location":"variants/protectli_vp46xx/building-manual/#build-dasharo-bios-firmware","text":"This build procedure produces full firmware binary including blobs such as FSP, and ME. Currently, access to them is restricted to the OEM (Protectli) via a private repository. Since version v1.0.18 VP4630 and VP4650 use different configuration file than VP4670. Versions v1.0.17 and older do not support VP4650 and VP4670 at all. Clone the coreboot repository: git clone https://github.com/Dasharo/coreboot Checkout the desired version, e.g. v1.0.19 : cd coreboot git checkout protectli_vault_cml_v1.0.19 Checkout submodules: git submodule update --init --checkout Obtain the Protectli blobs package: Replace with a a proper path to the repository in a form of: git@repo-path.git . You should checkout to the same tag as in case aof the coreboot repository. cd 3rdparty/blobs/mainboard/ git init git remote add origin git fetch origin && git checkout protectli_vault_cml_v1.0.19 cd - Build the firmware v1.0.19 or newer: for VP4630 and VP4650 ./build.sh vp4630_vp4650 for VP4670 ./build.sh vp4670 The resulting coreboot image will be placed in the coreboot directory as protectli_vault_cml__vp4630_vp4650.rom or protectli_vault_cml__vp4670.rom respectvely.","title":"Build Dasharo BIOS firmware"},{"location":"variants/protectli_vp46xx/firmware-update/","text":"Firmware update The following documentation describes the process of Dasharo open-source firmware update. If your device is currently flashed with the proprietary firmware please refer to the Initial deployment documentation. The update process may be different, depending on the currently installed Dasharo firmware version. For simplicity of the update process, we recommend using Dasharo Tools Suite . Before starting the update procedure be sure to disable Dasharo BIOS Boot medium lock and Secure Boot: Power on the device. While the device is booting, hold the DELETE key to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify the state of the Lock the BIOS boot medium option - if the option is chosen, press Space and then F10 to save the changes. Go back to the main menu using the ESC key. Enter the Device Manager menu. Enter the Secure Boot Configuration submenu. Verify that the Current Secure Boot State field says Disabled - if not, unselect the Attempt Secure Boot option below then press F10 to save the changes. Reboot the device to properly apply the changes. The settings of all the above options can be restored after a firmware update. Updating to Dasharo v1.0.18 or v1.0.19 or v1.1.0 From v1.0.18 Dasharo firmware is rebased on the more up-to-date revision of coreboot. If the current version of the firmware on the device is older than v1.0.18 or you are migrating from proprietary firmware the whole flash chip should be flashed as described in Initial Deployment . If the current version of the firmware on the device is v1.0.18 and it should be updated to v1.0.19 or v1.1.0, only the WP_RO and RW_SECTION_A should be flashed. To do this the following command should be used: flashrom -p internal -w protectli_vault_cml_v1.0.19.rom --fmap -i WP_RO -i RW_SECTION_A Updating on Dasharo v1.0.16 or v1.0.17 Only the RW_SECTION_A partition of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w protectli_vault_cml_v1.0.16.rom --fmap -i RW_SECTION_A This command also preserves Dasharo UEFI settings and the boot order. Updating on older Dasharo versions In this case, the whole bios region must be updated. flashrom -p internal -w protectli_vault_cml_v1.0.13.rom --ifd -i bios","title":"Firmware update"},{"location":"variants/protectli_vp46xx/firmware-update/#firmware-update","text":"The following documentation describes the process of Dasharo open-source firmware update. If your device is currently flashed with the proprietary firmware please refer to the Initial deployment documentation. The update process may be different, depending on the currently installed Dasharo firmware version. For simplicity of the update process, we recommend using Dasharo Tools Suite . Before starting the update procedure be sure to disable Dasharo BIOS Boot medium lock and Secure Boot: Power on the device. While the device is booting, hold the DELETE key to enter the UEFI Setup Menu. Enter the Dasharo System Features menu using the arrow keys and Enter. Enter the Dasharo Security Options submenu. Verify the state of the Lock the BIOS boot medium option - if the option is chosen, press Space and then F10 to save the changes. Go back to the main menu using the ESC key. Enter the Device Manager menu. Enter the Secure Boot Configuration submenu. Verify that the Current Secure Boot State field says Disabled - if not, unselect the Attempt Secure Boot option below then press F10 to save the changes. Reboot the device to properly apply the changes. The settings of all the above options can be restored after a firmware update.","title":"Firmware update"},{"location":"variants/protectli_vp46xx/firmware-update/#updating-to-dasharo-v1018-or-v1019-or-v110","text":"From v1.0.18 Dasharo firmware is rebased on the more up-to-date revision of coreboot. If the current version of the firmware on the device is older than v1.0.18 or you are migrating from proprietary firmware the whole flash chip should be flashed as described in Initial Deployment . If the current version of the firmware on the device is v1.0.18 and it should be updated to v1.0.19 or v1.1.0, only the WP_RO and RW_SECTION_A should be flashed. To do this the following command should be used: flashrom -p internal -w protectli_vault_cml_v1.0.19.rom --fmap -i WP_RO -i RW_SECTION_A","title":"Updating to Dasharo v1.0.18 or v1.0.19 or v1.1.0"},{"location":"variants/protectli_vp46xx/firmware-update/#updating-on-dasharo-v1016-or-v1017","text":"Only the RW_SECTION_A partition of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w protectli_vault_cml_v1.0.16.rom --fmap -i RW_SECTION_A This command also preserves Dasharo UEFI settings and the boot order.","title":"Updating on Dasharo v1.0.16 or v1.0.17"},{"location":"variants/protectli_vp46xx/firmware-update/#updating-on-older-dasharo-versions","text":"In this case, the whole bios region must be updated. flashrom -p internal -w protectli_vault_cml_v1.0.13.rom --ifd -i bios","title":"Updating on older Dasharo versions"},{"location":"variants/protectli_vp46xx/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configuration used for validation of the coreboot port on the Protectli VP46XX firewall. Protectli VP4630 Component Description CPU Intel Core i3-10110U RAM Slot 1: Empty Slot 2: SAMSUNG M471A4G43MB1-CTD Flash memory Macronix KH25L12835F SSD Kingston NV1 250GB SNVS/250G MMC drive SAMSUNG KLM8G1GETF-B041 (on-board) USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB USB Keyboard DELL KB216 USB Mouse DELL MS116p Wireless card Intel Wi-Fi 6 AX200 4G Modem AMIT MDG200-0T001 Display Display 1: HDMI 1920x1080p Display 2: DP 1920x1080p Ethernet controller 6x intel i225 (on-board) Internal devices Audio subsystem TPM Protectli TPM Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Channel Well Technology 12V, 5.0A 60W Protectli VP4650 Component Description CPU Intel Core i5-10210U RAM Slot 1: Kingston KVR24S17S8/8 Slot 2: Kingston KVR26S19S8/16 Flash memory Macronix KH25L12835F SSD Samsung 980 PRO NVMe 250 GB MMC drive SAMSUNG KLM8G1GETF-B041 (on-board) USB Keyboard DELL KB216 USB Mouse DELL MS116p Wireless card JJPLUS JWW6051 4G Modem AMIT MDG200-0T001 Display Display 1: HDMI 1920x1080p Display 2: DP 1920x1080p Ethernet controller 6x intel i225 (on-board) Internal devices Audio subsystem TPM Protectli TPM Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Channel Well Technology 12V, 7.5A 90W Protectli VP4670 Component Description CPU Intel Core i7-10810U RAM Slot 1: Samsung 4GB 1Rx8 PC4-2133P-SA0-11 Slot 2: Samsung 4GB 1Rx8 PC4-2133P-SA0-11 Flash memory Macronix KH25L12835F SSD Kingston NV1 250GB SNVS/250G MMC drive SAMSUNG KLM8G1GETF-B041 (on-board) USB Keyboard DELL KB216 USB Mouse DELL MS116p Wireless card JJPLUS JWW6051 4G Modem AMIT MDG200-0T001 Display Display 1: HDMI 1920x1080p Display 2: DP 1920x1080p Ethernet controller 6x intel i225 (on-board) Internal devices Audio subsystem TPM Protectli TPM Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Channel Well Technology 12V, 7.5A 90W","title":"Hardware Configuration Matrix"},{"location":"variants/protectli_vp46xx/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/protectli_vp46xx/hardware-matrix/#introduction","text":"This document describes the hardware configuration used for validation of the coreboot port on the Protectli VP46XX firewall.","title":"Introduction"},{"location":"variants/protectli_vp46xx/hardware-matrix/#protectli-vp4630","text":"Component Description CPU Intel Core i3-10110U RAM Slot 1: Empty Slot 2: SAMSUNG M471A4G43MB1-CTD Flash memory Macronix KH25L12835F SSD Kingston NV1 250GB SNVS/250G MMC drive SAMSUNG KLM8G1GETF-B041 (on-board) USB pendrives 1. SanDisk Ultra Flair USB 3.0 16 GB USB Keyboard DELL KB216 USB Mouse DELL MS116p Wireless card Intel Wi-Fi 6 AX200 4G Modem AMIT MDG200-0T001 Display Display 1: HDMI 1920x1080p Display 2: DP 1920x1080p Ethernet controller 6x intel i225 (on-board) Internal devices Audio subsystem TPM Protectli TPM Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Channel Well Technology 12V, 5.0A 60W","title":"Protectli VP4630"},{"location":"variants/protectli_vp46xx/hardware-matrix/#protectli-vp4650","text":"Component Description CPU Intel Core i5-10210U RAM Slot 1: Kingston KVR24S17S8/8 Slot 2: Kingston KVR26S19S8/16 Flash memory Macronix KH25L12835F SSD Samsung 980 PRO NVMe 250 GB MMC drive SAMSUNG KLM8G1GETF-B041 (on-board) USB Keyboard DELL KB216 USB Mouse DELL MS116p Wireless card JJPLUS JWW6051 4G Modem AMIT MDG200-0T001 Display Display 1: HDMI 1920x1080p Display 2: DP 1920x1080p Ethernet controller 6x intel i225 (on-board) Internal devices Audio subsystem TPM Protectli TPM Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Channel Well Technology 12V, 7.5A 90W","title":"Protectli VP4650"},{"location":"variants/protectli_vp46xx/hardware-matrix/#protectli-vp4670","text":"Component Description CPU Intel Core i7-10810U RAM Slot 1: Samsung 4GB 1Rx8 PC4-2133P-SA0-11 Slot 2: Samsung 4GB 1Rx8 PC4-2133P-SA0-11 Flash memory Macronix KH25L12835F SSD Kingston NV1 250GB SNVS/250G MMC drive SAMSUNG KLM8G1GETF-B041 (on-board) USB Keyboard DELL KB216 USB Mouse DELL MS116p Wireless card JJPLUS JWW6051 4G Modem AMIT MDG200-0T001 Display Display 1: HDMI 1920x1080p Display 2: DP 1920x1080p Ethernet controller 6x intel i225 (on-board) Internal devices Audio subsystem TPM Protectli TPM Network Local network wired connection Remote Testing Environment RTE v1.1.0 Power Control RTE v1.1.0 Power supply Channel Well Technology 12V, 7.5A 90W","title":"Protectli VP4670"},{"location":"variants/protectli_vp46xx/initial-deployment/","text":"Initial deployment Initial flashing of Dasharo firmware can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 22.04. Deploy using Dasharo Tools Suite For simplicity we recommend using Dasharo Tools Suite to omit all compilation steps and deploy the Dasharo firmware seamlessly. Be sure to disable the BIOS lock in the AMI firmware setup utility: Go to Chipset tab Enter PCH IO Configuration Disable BIOS Lock . Save changes and reset. Now you are ready to use Dasharo Tools Suite (DTS): Boot Dasharo Tools Suite. Perform Dasharo installation. This will flash the full image, including the Intel ME. The operation requires a hard reset of the platform. To perform a hard reset: Power off the platform. Note, it may not power off completely due to flashed ME. Disconnect power supply from the board when OS finishes all tasks after power off (the screen goes dark or black). Disconnect the RTC/CMOS battery OR clear the CMOS using the pin header located near memory slots. Wait about 10 seconds and unshort the pins. Connect the power supply back. The platform should power on normally now. You can connect the battery back if it was disconnected. This concludes Dasharo deployment process using DTS. Build flashrom Currently, the latest flashrom release lacks support for Comet Lake U internal flashing. Because of this, we need to build flashrom from source. Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://review.coreboot.org/flashrom.git cd flashrom Build flashrom: make sudo make install Reading flash contents Always prepare a backup of the current firmware image. To read from the flash and save it to a file ( dump.rom ), execute the following command: flashrom -p internal -r dump.rom Flashing Dasharo To flash Dasharo on the platform, execute the following command - replace [path] with the path to the Dasharo image you want to flash, e.g. protectli_vault_cml_v1.0.13.rom . flashrom -p internal -w protectli_vault_cml_v1.0.13.rom This will flash the full image, including the Intel ME. The operation requires a hard reset of the platform. To perform a hard reset: Power off the platform. Note, it may not power off completely due to flashed ME. Disconnect power supply from the board when OS finishes all tasks after power off (the screen goes dark or black). Disconnect the RTC/CMOS battery OR clear the CMOS using the pin header located near memory slots. Wait about half a minute (unshort the pins). Connect the power supply back. The platform should power on normally now. You can connect the battery back if it was disconnected.","title":"Initial deployment"},{"location":"variants/protectli_vp46xx/initial-deployment/#initial-deployment","text":"Initial flashing of Dasharo firmware can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 22.04.","title":"Initial deployment"},{"location":"variants/protectli_vp46xx/initial-deployment/#deploy-using-dasharo-tools-suite","text":"For simplicity we recommend using Dasharo Tools Suite to omit all compilation steps and deploy the Dasharo firmware seamlessly. Be sure to disable the BIOS lock in the AMI firmware setup utility: Go to Chipset tab Enter PCH IO Configuration Disable BIOS Lock . Save changes and reset. Now you are ready to use Dasharo Tools Suite (DTS): Boot Dasharo Tools Suite. Perform Dasharo installation. This will flash the full image, including the Intel ME. The operation requires a hard reset of the platform. To perform a hard reset: Power off the platform. Note, it may not power off completely due to flashed ME. Disconnect power supply from the board when OS finishes all tasks after power off (the screen goes dark or black). Disconnect the RTC/CMOS battery OR clear the CMOS using the pin header located near memory slots. Wait about 10 seconds and unshort the pins. Connect the power supply back. The platform should power on normally now. You can connect the battery back if it was disconnected. This concludes Dasharo deployment process using DTS.","title":"Deploy using Dasharo Tools Suite"},{"location":"variants/protectli_vp46xx/initial-deployment/#build-flashrom","text":"Currently, the latest flashrom release lacks support for Comet Lake U internal flashing. Because of this, we need to build flashrom from source. Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://review.coreboot.org/flashrom.git cd flashrom Build flashrom: make sudo make install","title":"Build flashrom"},{"location":"variants/protectli_vp46xx/initial-deployment/#reading-flash-contents","text":"Always prepare a backup of the current firmware image. To read from the flash and save it to a file ( dump.rom ), execute the following command: flashrom -p internal -r dump.rom","title":"Reading flash contents"},{"location":"variants/protectli_vp46xx/initial-deployment/#flashing-dasharo","text":"To flash Dasharo on the platform, execute the following command - replace [path] with the path to the Dasharo image you want to flash, e.g. protectli_vault_cml_v1.0.13.rom . flashrom -p internal -w protectli_vault_cml_v1.0.13.rom This will flash the full image, including the Intel ME. The operation requires a hard reset of the platform. To perform a hard reset: Power off the platform. Note, it may not power off completely due to flashed ME. Disconnect power supply from the board when OS finishes all tasks after power off (the screen goes dark or black). Disconnect the RTC/CMOS battery OR clear the CMOS using the pin header located near memory slots. Wait about half a minute (unshort the pins). Connect the power supply back. The platform should power on normally now. You can connect the battery back if it was disconnected.","title":"Flashing Dasharo"},{"location":"variants/protectli_vp46xx/overview/","text":"Overview The Vault is a small form network appliance built for use as a firewall / router, virtualization platform, a daily-driven personal computer, and more. The VP46XX is the second platform of the Vault Pro series with higher performance and newer technology than the original FW6 series. The VP46XX features an Intel 10th Generation CPU, 2x DDR4 DIMM modules, 6x Intel i225-V 2.5G Ethernet ports, PCIe x4/SATA NVMe storage, LPC TPM, M.2 WIFI and WWAN slots. VP4630 - Intel Core i3-10110U VP4650 - Intel Core i5-10210U VP4670 - Intel Core i7-10810U For more information please refer to the references below. References VP4630 announcement Buy VP4630 in Protectli shop Documentation sections Releases - groups information about all releases. Building manual - describes how to build Dasharo for NovaCustom NV4x. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for Protectli VP46xx. Firmware update - explains supported Dasharo open-source firmware update methods. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes validation scope used during Dasharo firmware validation procedure.","title":"Overview"},{"location":"variants/protectli_vp46xx/overview/#overview","text":"The Vault is a small form network appliance built for use as a firewall / router, virtualization platform, a daily-driven personal computer, and more. The VP46XX is the second platform of the Vault Pro series with higher performance and newer technology than the original FW6 series. The VP46XX features an Intel 10th Generation CPU, 2x DDR4 DIMM modules, 6x Intel i225-V 2.5G Ethernet ports, PCIe x4/SATA NVMe storage, LPC TPM, M.2 WIFI and WWAN slots. VP4630 - Intel Core i3-10110U VP4650 - Intel Core i5-10210U VP4670 - Intel Core i7-10810U For more information please refer to the references below.","title":"Overview"},{"location":"variants/protectli_vp46xx/overview/#references","text":"VP4630 announcement Buy VP4630 in Protectli shop","title":"References"},{"location":"variants/protectli_vp46xx/overview/#documentation-sections","text":"Releases - groups information about all releases. Building manual - describes how to build Dasharo for NovaCustom NV4x. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for Protectli VP46xx. Firmware update - explains supported Dasharo open-source firmware update methods. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes validation scope used during Dasharo firmware validation procedure.","title":"Documentation sections"},{"location":"variants/protectli_vp46xx/recovery/","text":"Recovery Intro The following documentation describes the process of recovering hardware from the brick state with RTE and Dasharo open-source firmware. Prerequisites Prepared RTE SOIC-8 Pomona clip 6x female-female wire cables Connections To prepare the stand for flashing follow the steps described below: Connect the wire cables to the Pomona clip. Connect the Pomona clip to the SPI header on RTE. SPI header Pomona clip Vcc pin 5 (Vcc) GND pin 4 (GND) CS pin 1 (CS) SCLK pin 7 (CLK) MISO pin 2 (MISO) MOSI pin 8 (MOSI) Open the platform cover. Match pin 1(CS) on the Pomona clip with the first pin of the flash chip, marked with a small dot engraved on the chip. Firmware flashing To flash firmware follow the steps described below: Login to RTE via ssh or minicom . Turn on the platform by connecting the power supply. Wait at least 5 seconds. Turn off the platform by using the power button. Wait at least 3 seconds. Set the proper state of the SPI by using the following commands on RTE: # set SPI Vcc to 3.3V echo 1 > /sys/class/gpio/gpio405/value # SPI Vcc on echo 1 > /sys/class/gpio/gpio406/value # SPI lines ON echo 1 > /sys/class/gpio/gpio404/value Wait at least 2 seconds. Disconnect the power supply from the platform. Wait at least 2 seconds. Flash the platform by using the following command: flashrom -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 -c \"MX25L12835F/MX25L12845E/MX25L12865E\" -w [ path_to_binary ] Flashing with flashrom takes about 1 minute. Change back the state of the SPI by using the following commands: echo 0 > /sys/class/gpio/gpio404/value echo 0 > /sys/class/gpio/gpio406/value Reset CMOS, this can be done by two methods: Disconnect the CMOS battery, wait at least 10 seconds and connect again. Short the two pins from the CMOS header for at least 10 seconds. Turn on the platform by connecting the power supply. The first boot of the platform after proceeding with the above procedure can take much longer than standard.","title":"Recovery"},{"location":"variants/protectli_vp46xx/recovery/#recovery","text":"","title":"Recovery"},{"location":"variants/protectli_vp46xx/recovery/#intro","text":"The following documentation describes the process of recovering hardware from the brick state with RTE and Dasharo open-source firmware.","title":"Intro"},{"location":"variants/protectli_vp46xx/recovery/#prerequisites","text":"Prepared RTE SOIC-8 Pomona clip 6x female-female wire cables","title":"Prerequisites"},{"location":"variants/protectli_vp46xx/recovery/#connections","text":"To prepare the stand for flashing follow the steps described below: Connect the wire cables to the Pomona clip. Connect the Pomona clip to the SPI header on RTE. SPI header Pomona clip Vcc pin 5 (Vcc) GND pin 4 (GND) CS pin 1 (CS) SCLK pin 7 (CLK) MISO pin 2 (MISO) MOSI pin 8 (MOSI) Open the platform cover. Match pin 1(CS) on the Pomona clip with the first pin of the flash chip, marked with a small dot engraved on the chip.","title":"Connections"},{"location":"variants/protectli_vp46xx/recovery/#firmware-flashing","text":"To flash firmware follow the steps described below: Login to RTE via ssh or minicom . Turn on the platform by connecting the power supply. Wait at least 5 seconds. Turn off the platform by using the power button. Wait at least 3 seconds. Set the proper state of the SPI by using the following commands on RTE: # set SPI Vcc to 3.3V echo 1 > /sys/class/gpio/gpio405/value # SPI Vcc on echo 1 > /sys/class/gpio/gpio406/value # SPI lines ON echo 1 > /sys/class/gpio/gpio404/value Wait at least 2 seconds. Disconnect the power supply from the platform. Wait at least 2 seconds. Flash the platform by using the following command: flashrom -p linux_spi:dev = /dev/spidev1.0,spispeed = 16000 -c \"MX25L12835F/MX25L12845E/MX25L12865E\" -w [ path_to_binary ] Flashing with flashrom takes about 1 minute. Change back the state of the SPI by using the following commands: echo 0 > /sys/class/gpio/gpio404/value echo 0 > /sys/class/gpio/gpio406/value Reset CMOS, this can be done by two methods: Disconnect the CMOS battery, wait at least 10 seconds and connect again. Short the two pins from the CMOS header for at least 10 seconds. Turn on the platform by connecting the power supply. The first boot of the platform after proceeding with the above procedure can take much longer than standard.","title":"Firmware flashing"},{"location":"variants/protectli_vp46xx/releases/","text":"Release Notes Following Release Notes describe status of Open Source Firmware development for Protectli VP46xx For details about our release process please read Dasharo Standard Release Process . Subscribe to Protectli VP46xx Dasharo Release Newsletter Test results for this platform can be found here . v1.1.0 - 2023-06-05 Release version v1.1.0 is currently only available for the VP4670 platform. Added USB stack and mass storage enable/disable option SMM BIOS write protection enable/disable option Changed Reverted to use FSP GOP for graphics initialization as it caused problems with Windows 11 display on VP4670 Switched to use driver for IT8784E Super I/O, which is present on the boards CPU power limits increased from baseline to performance Updating from v1.0.x requires flashing the WP_RO recovery partition Firmware version v1.1.x are signed with a new key Fixed Booting problems with Ubuntu 22.04 Low CPU frequency values Disabled C states deeper than C1 on VP4670 to fix Proxmox booting issue Protectli VP4670 - windows crashes after installing updates The inconvenience of using external headsets VP46XX Known issues Popup with information about recovery mode is still displayed after flashing with a valid binary Binaries protectli_vp4670_v1.1.0.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on c6ee1509da revision dcc5f2e2 edk2 based on 7f90b9cd revision 19bf14b4 iPXE based on 6ba671ac revision 6ba671ac v1.0.19 - 2022-12-08 Changed ME is now disabled by default (ME soft-disable) vboot is now run as separate verstage (previously was run inside bootblock) increased pre-RAM console buffer to fit more early cbmem logs Binaries protectli_vp4630_vp4650_v1.0.19.rom sha256 sha256.sig protectli_vp4670_v1.0.19.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on c6ee1509da revision 9034fb12 edk2 based on 7f90b9cd revision e31b7a71 iPXE for EFI revision 988d2 VP4670: Cometlake1 FSP 9.0.7B.20 VP4630 and VP4650: Cometlake2 FSP 9.2.7B.20 Intel i225 EFI driver version 0.10.4, SHA256: 2d234ecf629fc10dc0c291a1390de3d27a05c6ecbd935628b6ff154f386d061e Management Engine: Custom image based on ME 14.0.47.1558, SHA256: 7fa37e108176c9a2d0df60c93b10b3ad9c7725f1f82b87197a2991208c4cffec microcode: CPU signature: 0x0806EC, Date: 17.11.2021, Revision: 0xF0 CPU signature: 0x0A0660, Date: 15.11.2021, Revision: 0xF0 CPU signature: 0x0A0661, Date: 16.11.2021, Revision: 0xF0 v1.0.18 - 2022-11-16 Test results for this release can be found here . Added Support for VP4650 and VP4670 platforms Platform will beep 12 times and blink HDD led on critical firmware errors Changed Disabled Intel PTT (fTPM) Removed workaround for graphics power management as the issue no longer reproduces on newer revision of the hardware Binaries are built with coreboot-sdk 2021-09-23_b0d87f753c (was 0ad5fbd48d) Open-source graphics initialization with libgfxinit instead of proprietary and closed FSP GOP driver Binaries protectli_vp4630_vp4650_v1.0.18.rom sha256 sha256.sig protectli_vp4670_v1.0.18.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on c6ee1509da revision ed9f6fe0 edk2 based on 7f90b9cd revision e31b7a71 iPXE for EFI revision 988d2 VP4670: Cometlake1 FSP 9.0.7B.20 VP4630 and VP4650: Cometlake2 FSP 9.2.7B.20 Intel i225 EFI driver version 0.10.4, SHA256: 2d234ecf629fc10dc0c291a1390de3d27a05c6ecbd935628b6ff154f386d061e Management Engine: Custom image based on ME 14.0.47.1558, SHA256: 7fa37e108176c9a2d0df60c93b10b3ad9c7725f1f82b87197a2991208c4cffec microcode: CPU signature: 0x0806EC, Date: 17.11.2021, Revision: 0xF0 CPU signature: 0x0A0660, Date: 15.11.2021, Revision: 0xF0 CPU signature: 0x0A0661, Date: 16.11.2021, Revision: 0xF0 v1.0.17 - 2022-08-17 Test results for this release can be found here . Added Tools for resigning Vboot images with one RW partition Changed Set thermal throttling temperature to 80 degrees Disabled UEFI Secure Boot by default Fixed Platform rebooting every 56 minutes Incorrect menu labels displayed in network boot menu Built-in audio jack does not work Binaries protectli_vault_cml_v1.0.17.rom_file protectli_vault_cml_v1.0.17.rom_hash protectli_vault_cml_v1.0.17.rom_sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 4.16 revision d662831d edk2 based on 7f90b9cd revision 576aa6a4 iPXE for EFI revision 988d2 Cometlake2 FSP 9.2.7B.20 Intel i225 EFI driver version 0.10.4, SHA256: 2d234ecf629fc10dc0c291a1390de3d27a05c6ecbd935628b6ff154f386d061e Management Engine: Custom image based on ME 14.0.47.1558, SHA256: 7fa37e108176c9a2d0df60c93b10b3ad9c7725f1f82b87197a2991208c4cffec microcode: CPU signature: 0x0806EC, Date: 28.04.2021, Revision: 0xEC CPU signature: 0x0A0660, Date: 28.04.2021, Revision: 0xEA CPU signature: 0x0A0661, Date: 29.04.2021, Revision: 0xEC v1.0.16 - 2022-07-13 Test results for this release can be found here . Added Vboot Verified Boot TPM Measured Boot Vboot recovery notification in UEFI Payload UEFI Shell UEFI Secure Boot Intel ME soft disable BIOS flash protection for Vboot recovery region Changed Changed supported CPUs to Comet Lake stepping 2 Fixed i225 network controller initialization takes too much time CVE-2022-29264 Binaries protectli_vault_cml_v1.0.16.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 4.16 revision dfaaf44d edk2 based on 7f90b9cd revision 5345a611 iPXE for EFI revision 988d2 Cometlake2 FSP 9.2.7B.20 Intel i225 EFI driver version 0.10.4, SHA256: 2d234ecf629fc10dc0c291a1390de3d27a05c6ecbd935628b6ff154f386d061e Management Engine: Custom image based on ME 14.0.47.1558, SHA256: 7fa37e108176c9a2d0df60c93b10b3ad9c7725f1f82b87197a2991208c4cffec microcode: CPU signature: 0x0806EC, Date: 28.04.2021, Revision: 0xEC CPU signature: 0x0A0660, Date: 28.04.2021, Revision: 0xEA CPU signature: 0x0A0661, Date: 29.04.2021, Revision: 0xEC v1.0.13 - 2022-03-22 Added UEFI boot support i225 network controller network boot support Customized boot menu keys Customized setup menu keys Configurable boot order Configurable boot options Changed ME version to 14.0.47.1558 Known issues i225 network controller initialization takes too much time Binaries protectli_vault_cml_v1.0.13.rom sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 4.16 revision 546e1c86 edk2 based on 7f90b9cd revision 7f90b9cd iPXE for EFI revision 988d2 Cometlake1 FSP 9.0.7B.20 Intel i225 EFI driver version 0.9.03, SHA256: 63e77b237dc9a8aacdd7465675ee88afc01dad3204156a91a0976a4ad1ed5b00 Management Engine: Custom image based on ME 14.0.47.1558, SHA256: 7fa37e108176c9a2d0df60c93b10b3ad9c7725f1f82b87197a2991208c4cffec microcode: CPU signature: 0x0806EC, Date: 28.04.2021, Revision: 0xEC CPU signature: 0x0A0660, Date: 28.04.2021, Revision: 0xEA","title":"Releases"},{"location":"variants/protectli_vp46xx/releases/#release-notes","text":"Following Release Notes describe status of Open Source Firmware development for Protectli VP46xx For details about our release process please read Dasharo Standard Release Process . Subscribe to Protectli VP46xx Dasharo Release Newsletter Test results for this platform can be found here .","title":"Release Notes"},{"location":"variants/protectli_vp46xx/releases/#v110-2023-06-05","text":"Release version v1.1.0 is currently only available for the VP4670 platform.","title":"v1.1.0 - 2023-06-05"},{"location":"variants/protectli_vp46xx/releases/#v1019-2022-12-08","text":"","title":"v1.0.19 - 2022-12-08"},{"location":"variants/protectli_vp46xx/releases/#v1018-2022-11-16","text":"Test results for this release can be found here .","title":"v1.0.18 - 2022-11-16"},{"location":"variants/protectli_vp46xx/releases/#v1017-2022-08-17","text":"Test results for this release can be found here .","title":"v1.0.17 - 2022-08-17"},{"location":"variants/protectli_vp46xx/releases/#v1016-2022-07-13","text":"Test results for this release can be found here .","title":"v1.0.16 - 2022-07-13"},{"location":"variants/protectli_vp46xx/releases/#v1013-2022-03-22","text":"","title":"v1.0.13 - 2022-03-22"},{"location":"variants/protectli_vp46xx/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. The test scope is the same for all platforms of the VP46XX family. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports DSP DSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003 4. Network boot utilities NBT All 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB USB001.XXX and USB002.XXX 9. FreeBSD support BSD All 10. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 11. USB-C support UTC UTC004.001, UTC004.002 12. M.2 WiFi/Bluetooth WLE ALL 13. eMMC support MMC MMC001.001 14. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 15. Custom network boot entries CNB CNB001.002 16. M.2 automatic SATA/NVMe switching support MSS MSS001.001 17. Windows booting WBT WBT001.001 18. Audio subsystem AUD AUD001.001, AUD001.002, AUD002.001, AUD002.002, AUD003.001, AUD003.002, AUD004.001, AUD004.002, AUD005.001, AUD005.002, AUD006.001, AUD006.002 19. UEFI Shell USH All 20. USB detection UDT All 21. USB booting UBT All 22. pfSense support PFS All 23. OPNsense support OPN All 24. Proxmox support PVE All 25. Ubuntu Server support USS All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001,TPM002.001 and TPM003.001 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO All 5. ME disable/neuter support MNE MNE004.001 6. BIOS lock support BLS All 7. USB stack enable/disable USS All 8. SMM BIOS write protection SMM All Note: in Dasharo compatible with Protectli VP46xx ME is soft-disabled by default - no additional option for ME disabling is available in the Setup Menu. Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF Without CPU003.XXX and CPU005.XXX 4. Platform stability STB All 5. Ubuntu booting performance test BUB All 6. Debian booting performance test BDE All 7. FreeBSD booting performance test BFB All 8. Proxmox booting performance test BPM All 9. Ubuntu Server booting performance test BUS All 10. OPNsense (serial output) booting performance test BOS All 11. OPNsense (VGA output) booting performance test BOV All 12. pfSense (serial output) booting performance test BPS All 13. pfSense (VGA output) booting performance test BPV All","title":"Test matrix"},{"location":"variants/protectli_vp46xx/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/protectli_vp46xx/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. The test scope is the same for all platforms of the VP46XX family.","title":"About"},{"location":"variants/protectli_vp46xx/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports DSP DSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003 4. Network boot utilities NBT All 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB USB001.XXX and USB002.XXX 9. FreeBSD support BSD All 10. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 11. USB-C support UTC UTC004.001, UTC004.002 12. M.2 WiFi/Bluetooth WLE ALL 13. eMMC support MMC MMC001.001 14. SMBIOS DMI DMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001 15. Custom network boot entries CNB CNB001.002 16. M.2 automatic SATA/NVMe switching support MSS MSS001.001 17. Windows booting WBT WBT001.001 18. Audio subsystem AUD AUD001.001, AUD001.002, AUD002.001, AUD002.002, AUD003.001, AUD003.002, AUD004.001, AUD004.002, AUD005.001, AUD005.002, AUD006.001, AUD006.002 19. UEFI Shell USH All 20. USB detection UDT All 21. USB booting UBT All 22. pfSense support PFS All 23. OPNsense support OPN All 24. Proxmox support PVE All 25. Ubuntu Server support USS All","title":"Module: Dasharo compatibility"},{"location":"variants/protectli_vp46xx/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001,TPM002.001 and TPM003.001 2. Verified Boot support VBO Without VBO006.001 and VBO007.001 3. Measured Boot support MBO All 4. Secure Boot support SBO All 5. ME disable/neuter support MNE MNE004.001 6. BIOS lock support BLS All 7. USB stack enable/disable USS All 8. SMM BIOS write protection SMM All Note: in Dasharo compatible with Protectli VP46xx ME is soft-disabled by default - no additional option for ME disabling is available in the Setup Menu.","title":"Module: Dasharo security"},{"location":"variants/protectli_vp46xx/test-matrix/#module-dasharo-performance","text":"No. Supported test suite Test suite ID Supported test cases 1. coreboot bring up time measurement CBMEM All 2. CPU temperature measure CPT All 3. CPU frequency measure CPF Without CPU003.XXX and CPU005.XXX 4. Platform stability STB All 5. Ubuntu booting performance test BUB All 6. Debian booting performance test BDE All 7. FreeBSD booting performance test BFB All 8. Proxmox booting performance test BPM All 9. Ubuntu Server booting performance test BUS All 10. OPNsense (serial output) booting performance test BOS All 11. OPNsense (VGA output) booting performance test BOV All 12. pfSense (serial output) booting performance test BPS All 13. pfSense (VGA output) booting performance test BPV All","title":"Module: Dasharo performance"},{"location":"variants/qemu_q35/building-manual/","text":"Dasharo (UEFI) v0.1.0 for QEMU Q35 - Building Manual Follow below steps to create the \"Dasharo (UEFI) OVMF image for QEMU Q35\" from EDK2: Requirements Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Procedure Easiest way to build OVMF for QEMU Q35 is to use coreboot Docker image. As some dependencies maybe missing in given local instance. Obtain the docker image: docker pull coreboot/coreboot-sdk:2021-09-23_b0d87f753c Clone official Dasharo EDK2 repository to your docker instance, with git or downloading the source code from github. git clone https://github.com/Dasharo/edk2.git Start the instance of the docker image under the Dasharo/edk2 repository: sudo docker run --rm -it -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot coreboot/coreboot-sdk:2021-09-23_b0d87f753c \\ /bin/bash Follow below instructions, to prepare your environment for building OVMF image. Setup the environment variables with the following command make -C BaseTools source edksetup.sh Update the submodules in order get latest dependencies. git submodule update --init --checkout Clone the edk2-platforms repository for additional packages git clone https://github.com/Dasharo/edk2-platforms.git \\ -b 3323ed481d35096fb6a7eae7b49f35eff00f86cf Update the PACKAGES_PATH variable export EDK2_PLATFORMS_PATH = \" $WORKSPACE /edk2-platforms\" export PACKAGES_PATH = \" $WORKSPACE :\\ $EDK2_PLATFORMS_PATH /Platform/Intel:\\ $EDK2_PLATFORMS_PATH /Silicon/Intel:\\ $EDK2_PLATFORMS_PATH /Features/Intel:\\ $EDK2_PLATFORMS_PATH /Features/Intel/Debugging:\\ $EDK2_PLATFORMS_PATH /Features/Intel/Network:\\ $EDK2_PLATFORMS_PATH /Features/Intel/OutOfBandManagement:\\ $EDK2_PLATFORMS_PATH /Features/Intel/PowerManagement:\\ $EDK2_PLATFORMS_PATH /Features/Intel/SystemInformation:\\ $EDK2_PLATFORMS_PATH /Features/Intel/UserInterface\" Building the firmware image To build the image simply invoke the following command build -a IA32 -a X64 -t GCC5 -b RELEASE -p OvmfPkg/OvmfPkgX64.dsc You can also enable additional options, for example CSM with by adding -D CSM_ENABLE : build -a IA32 -a X64 -t GCC5 -b RELEASE -p OvmfPkg/OvmfPkgX64.dsc -D CSM_ENABLE Once the build is completed, the OVMF firmware image can be found below given path: edk2/Build/Ovmf/RELEASE_GCC5/FV/OVMF_CODE.fd edk2/Build/Ovmf/RELEASE_GCC5/FV/OVMF_VARS.fd For debug build use: build -a IA32 -a X64 -t GCC5 -b DEBUG -p OvmfPkg/OvmfPkgX64.dsc Then the resulting files will be placed in: edk2/Build/Ovmf/DEBUG_GCC5/FV/OVMF_CODE.fd edk2/Build/Ovmf/DEBUG_GCC5/FV/OVMF_VARS.fd","title":"Building manual"},{"location":"variants/qemu_q35/building-manual/#dasharo-uefi-v010-for-qemu-q35-building-manual","text":"Follow below steps to create the \"Dasharo (UEFI) OVMF image for QEMU Q35\" from EDK2:","title":"Dasharo (UEFI) v0.1.0 for QEMU Q35 - Building Manual"},{"location":"variants/qemu_q35/building-manual/#requirements","text":"Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux","title":"Requirements"},{"location":"variants/qemu_q35/building-manual/#procedure","text":"Easiest way to build OVMF for QEMU Q35 is to use coreboot Docker image. As some dependencies maybe missing in given local instance. Obtain the docker image: docker pull coreboot/coreboot-sdk:2021-09-23_b0d87f753c Clone official Dasharo EDK2 repository to your docker instance, with git or downloading the source code from github. git clone https://github.com/Dasharo/edk2.git Start the instance of the docker image under the Dasharo/edk2 repository: sudo docker run --rm -it -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot coreboot/coreboot-sdk:2021-09-23_b0d87f753c \\ /bin/bash Follow below instructions, to prepare your environment for building OVMF image. Setup the environment variables with the following command make -C BaseTools source edksetup.sh Update the submodules in order get latest dependencies. git submodule update --init --checkout Clone the edk2-platforms repository for additional packages git clone https://github.com/Dasharo/edk2-platforms.git \\ -b 3323ed481d35096fb6a7eae7b49f35eff00f86cf Update the PACKAGES_PATH variable export EDK2_PLATFORMS_PATH = \" $WORKSPACE /edk2-platforms\" export PACKAGES_PATH = \" $WORKSPACE :\\ $EDK2_PLATFORMS_PATH /Platform/Intel:\\ $EDK2_PLATFORMS_PATH /Silicon/Intel:\\ $EDK2_PLATFORMS_PATH /Features/Intel:\\ $EDK2_PLATFORMS_PATH /Features/Intel/Debugging:\\ $EDK2_PLATFORMS_PATH /Features/Intel/Network:\\ $EDK2_PLATFORMS_PATH /Features/Intel/OutOfBandManagement:\\ $EDK2_PLATFORMS_PATH /Features/Intel/PowerManagement:\\ $EDK2_PLATFORMS_PATH /Features/Intel/SystemInformation:\\ $EDK2_PLATFORMS_PATH /Features/Intel/UserInterface\"","title":"Procedure"},{"location":"variants/qemu_q35/building-manual/#building-the-firmware-image","text":"To build the image simply invoke the following command build -a IA32 -a X64 -t GCC5 -b RELEASE -p OvmfPkg/OvmfPkgX64.dsc You can also enable additional options, for example CSM with by adding -D CSM_ENABLE : build -a IA32 -a X64 -t GCC5 -b RELEASE -p OvmfPkg/OvmfPkgX64.dsc -D CSM_ENABLE Once the build is completed, the OVMF firmware image can be found below given path: edk2/Build/Ovmf/RELEASE_GCC5/FV/OVMF_CODE.fd edk2/Build/Ovmf/RELEASE_GCC5/FV/OVMF_VARS.fd For debug build use: build -a IA32 -a X64 -t GCC5 -b DEBUG -p OvmfPkg/OvmfPkgX64.dsc Then the resulting files will be placed in: edk2/Build/Ovmf/DEBUG_GCC5/FV/OVMF_CODE.fd edk2/Build/Ovmf/DEBUG_GCC5/FV/OVMF_VARS.fd","title":"Building the firmware image"},{"location":"variants/qemu_q35/development/","text":"Dasharo (UEFI) v0.1.0 for QEMU Q35 Intro Please check your qemu setup and launch qemu outside docker instance (host machine) using built OVMF firmware image. Install QEMU on your linux distro Run the OVMF in QEMU: qemu-system-x86_64 -machine q35,smm = on \\ -global driver = cfi.pflash01,property = secure,value = on \\ -drive if = pflash,format = raw,unit = 0 ,file = Build/OvmfX64/DEBUG_GCC5/FV/OVMF_CODE.fd,readonly = on \\ -drive if = pflash,format = raw,unit = 1 ,file = Build/OvmfX64/DEBUG_GCC5/FV/OVMF_VARS.fd \\ -debugcon file:debug.log -global isa-debugcon.iobase = 0x402 \\ -global ICH9-LPC.disable_s3 = 1 -drive indicate device is pflash with firmware image of built OVMF*.fd image. -debugcon file:debug.log -global isa-debugcon.iobase=0x402 default OVMF build writes debug messages to IO port 0x402 . The following qemu command line options save them in the file called debug.log. -global ICH9-LPC.disable_s3=1 SMM is put to use in the S3 suspend and resume infrastructure, and in the UEFI variable driver stack. Similarly, a pflash-backed variable store is a requirement. -machine q35,smm=on For SMM to work, only Q35 machines are supported hence the machine type. After executing the above qemu command, qemu boots into UEFI built-in shell and to BIOS selection area. The features which are enabled in OvmfPkgX64.dsc can be verified at Setup menu . At Device Manager section Dasharo features can be verified in Dasharo System Features section. Useful Tips for modifying the DSC & FDF Follow the steps below to rebuild firmware image & experiment with the features If any code is added to C file or any library functions are invoked in other files, rebuild the OVMF image with the following command. build -a IA32 -a X64 -t GCC5 -b DEBUG -p OvmfPkg/OvmfPkgX64.dsc By making some changes in the OvmfPkgX64.dsc file, one can add features like OPAL, SATA security support for QEMU Q35 machine and also for specific platforms. An example of where the changes can be made in the OvmfPkgX64.dsc file is given below. The following changes describe defining in the Defines Section of OvmfPkgX64.dsc # Defines for default states. These can be changed on the command line. # -D FLAG=VALUE # ( ... ) DEFINE SATA_PASSWORD_ENABLE = TRUE DEFINE OPAL_PASSWORD_ENABLE = TRUE Include the appropriate libraries in the Libraries Section of OvmfPkgX64.dsc . !if $( OPAL_PASSWORD_ENABLE ) == TRUE TcgStorageCoreLib | SecurityPkg/Library/TcgStorageCoreLib/TcgStorageCoreLib.inf TcgStorageOpalLib | SecurityPkg/Library/TcgStorageOpalLib/TcgStorageOpalLib.inf !endif According to the feature, proper PCD's must be defined in OvmfPkgX64.dsc file. Adding components in Components Section of OvmfPkgX64.dsc file: !if $( SATA_PASSWORD_ENABLE ) == TRUE SecurityPkg/HddPassword/HddPasswordPei.inf !endif Dasharo System Features The .fdf describes the source files' location and variables used during the build process. Below code snippet shows the location of SATA disk password INF file. !if $( SATA_PASSWORD_ENABLE ) == TRUE INF SecurityPkg/HddPassword/HddPasswordDxe.inf !endif Include all necessary source file locations to point at source libraries in FDF file. Below is the screenshot of the SATA_PASSWORD support in Device Manager . By default the Dasharo System Features are enabled in the DasharoSystemFeatures.dec . It describes the configuration of the platform. The flags can be toggled inside platform DSC file in order to enable Dasharo System Features . [ PcdsFixedAtBuild ] gDasharoSystemFeaturesTokenSpaceGuid.PcdShowMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdShowSecurityMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdShowIntelMeMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdShowUsbMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdShowNetworkMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdShowChipsetMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdDefaultNetworkBootEnable | FALSE In the above PCD definitions, please check column after PCD definition to find TRUE/FALSE . By toggling these flags, one can enable or disable the Dasharo System Features. The below image shows the Dasharo System Features enabled for the QEMU Q35 machine.","title":"Development"},{"location":"variants/qemu_q35/development/#dasharo-uefi-v010-for-qemu-q35","text":"","title":"Dasharo (UEFI) v0.1.0 for QEMU Q35"},{"location":"variants/qemu_q35/development/#intro","text":"Please check your qemu setup and launch qemu outside docker instance (host machine) using built OVMF firmware image. Install QEMU on your linux distro Run the OVMF in QEMU: qemu-system-x86_64 -machine q35,smm = on \\ -global driver = cfi.pflash01,property = secure,value = on \\ -drive if = pflash,format = raw,unit = 0 ,file = Build/OvmfX64/DEBUG_GCC5/FV/OVMF_CODE.fd,readonly = on \\ -drive if = pflash,format = raw,unit = 1 ,file = Build/OvmfX64/DEBUG_GCC5/FV/OVMF_VARS.fd \\ -debugcon file:debug.log -global isa-debugcon.iobase = 0x402 \\ -global ICH9-LPC.disable_s3 = 1 -drive indicate device is pflash with firmware image of built OVMF*.fd image. -debugcon file:debug.log -global isa-debugcon.iobase=0x402 default OVMF build writes debug messages to IO port 0x402 . The following qemu command line options save them in the file called debug.log. -global ICH9-LPC.disable_s3=1 SMM is put to use in the S3 suspend and resume infrastructure, and in the UEFI variable driver stack. Similarly, a pflash-backed variable store is a requirement. -machine q35,smm=on For SMM to work, only Q35 machines are supported hence the machine type. After executing the above qemu command, qemu boots into UEFI built-in shell and to BIOS selection area. The features which are enabled in OvmfPkgX64.dsc can be verified at Setup menu . At Device Manager section Dasharo features can be verified in Dasharo System Features section.","title":"Intro"},{"location":"variants/qemu_q35/development/#useful-tips-for-modifying-the-dsc-fdf","text":"","title":"Useful Tips for modifying the DSC & FDF"},{"location":"variants/qemu_q35/development/#dasharo-system-features","text":"The .fdf describes the source files' location and variables used during the build process. Below code snippet shows the location of SATA disk password INF file. !if $( SATA_PASSWORD_ENABLE ) == TRUE INF SecurityPkg/HddPassword/HddPasswordDxe.inf !endif Include all necessary source file locations to point at source libraries in FDF file. Below is the screenshot of the SATA_PASSWORD support in Device Manager . By default the Dasharo System Features are enabled in the DasharoSystemFeatures.dec . It describes the configuration of the platform. The flags can be toggled inside platform DSC file in order to enable Dasharo System Features . [ PcdsFixedAtBuild ] gDasharoSystemFeaturesTokenSpaceGuid.PcdShowMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdShowSecurityMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdShowIntelMeMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdShowUsbMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdShowNetworkMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdShowChipsetMenu | TRUE gDasharoSystemFeaturesTokenSpaceGuid.PcdDefaultNetworkBootEnable | FALSE In the above PCD definitions, please check column after PCD definition to find TRUE/FALSE . By toggling these flags, one can enable or disable the Dasharo System Features. The below image shows the Dasharo System Features enabled for the QEMU Q35 machine.","title":"Dasharo System Features"},{"location":"variants/qemu_q35/firmware-update/","text":"Firmware Update The update process of Dasharo OVMF firmware on QEMU Q35 does not need any special actions. QEMU Q35 is an emulated platform, not real hardware. Updating the Dasharo OVMF firmware is as simple as invoking a QEMU command with a newer OVMF*.fd files: qemu-system-x86_64 -machine q35,smm = on \\ -global driver = cfi.pflash01,property = secure,value = on \\ -drive if = pflash,format = raw,unit = 0 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd,readonly = on \\ -drive if = pflash,format = raw,unit = 1 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \\ -debugcon file:debug.log -global isa-debugcon.iobase = 0x402 \\ -global ICH9-LPC.disable_s3 = 1","title":"Firmware update"},{"location":"variants/qemu_q35/firmware-update/#firmware-update","text":"The update process of Dasharo OVMF firmware on QEMU Q35 does not need any special actions. QEMU Q35 is an emulated platform, not real hardware. Updating the Dasharo OVMF firmware is as simple as invoking a QEMU command with a newer OVMF*.fd files: qemu-system-x86_64 -machine q35,smm = on \\ -global driver = cfi.pflash01,property = secure,value = on \\ -drive if = pflash,format = raw,unit = 0 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd,readonly = on \\ -drive if = pflash,format = raw,unit = 1 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \\ -debugcon file:debug.log -global isa-debugcon.iobase = 0x402 \\ -global ICH9-LPC.disable_s3 = 1","title":"Firmware Update"},{"location":"variants/qemu_q35/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the devices emulated by the QEMU Q35. QEMU Q35 Component Description CPU QEMU emulated with Q35 emulated chipset RAM Slot 1: QEMU DIMM CDROM QEMU DVD-ROM USB Keyboard AT Translated Set 2 Keyboard USB Mouse Virtual/PS 2 VMware Mouse Display Display 1: Emulated 1024px768p Ethernet controller Emulated Intel 82574L Gigabit Ethernet Internal devices QEMU emulated Audio subsystem Network Local Network Connection from host Power Control None Power supply Power Button Emulated","title":"Hardware Configuration Matrix"},{"location":"variants/qemu_q35/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/qemu_q35/hardware-matrix/#introduction","text":"This document describes the devices emulated by the QEMU Q35.","title":"Introduction"},{"location":"variants/qemu_q35/hardware-matrix/#qemu-q35","text":"Component Description CPU QEMU emulated with Q35 emulated chipset RAM Slot 1: QEMU DIMM CDROM QEMU DVD-ROM USB Keyboard AT Translated Set 2 Keyboard USB Mouse Virtual/PS 2 VMware Mouse Display Display 1: Emulated 1024px768p Ethernet controller Emulated Intel 82574L Gigabit Ethernet Internal devices QEMU emulated Audio subsystem Network Local Network Connection from host Power Control None Power supply Power Button Emulated","title":"QEMU Q35"},{"location":"variants/qemu_q35/initial-deployment/","text":"Initial Deployment Initial deployment of Dasharo OVMF firmware on QEMU Q35 does not need any special actions. QEMU Q35 is an emulated platform, not real hardware. Running the Dasharo OVMF is as simple as invoking a QEMU command: qemu-system-x86_64 -machine q35,smm = on \\ -global driver = cfi.pflash01,property = secure,value = on \\ -drive if = pflash,format = raw,unit = 0 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd,readonly = on \\ -drive if = pflash,format = raw,unit = 1 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \\ -debugcon file:debug.log -global isa-debugcon.iobase = 0x402 \\ -global ICH9-LPC.disable_s3 = 1","title":"Initial Deployment"},{"location":"variants/qemu_q35/initial-deployment/#initial-deployment","text":"Initial deployment of Dasharo OVMF firmware on QEMU Q35 does not need any special actions. QEMU Q35 is an emulated platform, not real hardware. Running the Dasharo OVMF is as simple as invoking a QEMU command: qemu-system-x86_64 -machine q35,smm = on \\ -global driver = cfi.pflash01,property = secure,value = on \\ -drive if = pflash,format = raw,unit = 0 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd,readonly = on \\ -drive if = pflash,format = raw,unit = 1 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \\ -debugcon file:debug.log -global isa-debugcon.iobase = 0x402 \\ -global ICH9-LPC.disable_s3 = 1","title":"Initial Deployment"},{"location":"variants/qemu_q35/overview/","text":"Overview Releases - Groups information about all releases. Building manual - describes how to build Dasharo (UEFI) for the QEMU Emulator Q35 Machine type. Test matrix - describes the validation scope used during the Dasharo firmware validation procedure. Development - describes information for running Dasharo OVMF in QEMU Q35 machine and for Dasharo Developers. Initial deployment - QEMU is an emulation environment and not real hardware thus firmware deployment is not applicable. Firmware update - QEMU is an emulation environment and not real hardware thus firmware update is not applicable. Recovery - QEMU is an emulation environment and not a real hardware thus firmware recovery is not applicable. Hardware configuration matrix - describes about the devices emulated by QEMU. Useful documents EDK2 OVMF Package Documentation Dasharo EDK2 repo for the reference","title":"Overview"},{"location":"variants/qemu_q35/overview/#overview","text":"Releases - Groups information about all releases. Building manual - describes how to build Dasharo (UEFI) for the QEMU Emulator Q35 Machine type. Test matrix - describes the validation scope used during the Dasharo firmware validation procedure. Development - describes information for running Dasharo OVMF in QEMU Q35 machine and for Dasharo Developers. Initial deployment - QEMU is an emulation environment and not real hardware thus firmware deployment is not applicable. Firmware update - QEMU is an emulation environment and not real hardware thus firmware update is not applicable. Recovery - QEMU is an emulation environment and not a real hardware thus firmware recovery is not applicable. Hardware configuration matrix - describes about the devices emulated by QEMU.","title":"Overview"},{"location":"variants/qemu_q35/overview/#useful-documents","text":"EDK2 OVMF Package Documentation Dasharo EDK2 repo for the reference","title":"Useful documents"},{"location":"variants/qemu_q35/recovery/","text":"Recovery The recovery process of Dasharo OVMF firmware on QEMU Q35 does not need any special actions. QEMU Q35 is an emulated platform, not real hardware, so it doesn't brick itself. If something goes wrong simply rerun the QEMU command: qemu-system-x86_64 -machine q35,smm = on \\ -global driver = cfi.pflash01,property = secure,value = on \\ -drive if = pflash,format = raw,unit = 0 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd,readonly = on \\ -drive if = pflash,format = raw,unit = 1 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \\ -debugcon file:debug.log -global isa-debugcon.iobase = 0x402 \\ -global ICH9-LPC.disable_s3 = 1 Or build a debug image, gather the logs in debug.log file qemu-system-x86_64 -machine q35,smm = on \\ -global driver = cfi.pflash01,property = secure,value = on \\ -drive if = pflash,format = raw,unit = 0 ,file = Build/OvmfX64/DEBUG_GCC5/FV/OVMF_CODE.fd,readonly = on \\ -drive if = pflash,format = raw,unit = 1 ,file = Build/OvmfX64/DEBUG_GCC5/FV/OVMF_VARS.fd \\ -debugcon file:debug.log -global isa-debugcon.iobase = 0x402 \\ -global ICH9-LPC.disable_s3 = 1 and report an issue with attached log.","title":"Recovery"},{"location":"variants/qemu_q35/recovery/#recovery","text":"The recovery process of Dasharo OVMF firmware on QEMU Q35 does not need any special actions. QEMU Q35 is an emulated platform, not real hardware, so it doesn't brick itself. If something goes wrong simply rerun the QEMU command: qemu-system-x86_64 -machine q35,smm = on \\ -global driver = cfi.pflash01,property = secure,value = on \\ -drive if = pflash,format = raw,unit = 0 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd,readonly = on \\ -drive if = pflash,format = raw,unit = 1 ,file = Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \\ -debugcon file:debug.log -global isa-debugcon.iobase = 0x402 \\ -global ICH9-LPC.disable_s3 = 1 Or build a debug image, gather the logs in debug.log file qemu-system-x86_64 -machine q35,smm = on \\ -global driver = cfi.pflash01,property = secure,value = on \\ -drive if = pflash,format = raw,unit = 0 ,file = Build/OvmfX64/DEBUG_GCC5/FV/OVMF_CODE.fd,readonly = on \\ -drive if = pflash,format = raw,unit = 1 ,file = Build/OvmfX64/DEBUG_GCC5/FV/OVMF_VARS.fd \\ -debugcon file:debug.log -global isa-debugcon.iobase = 0x402 \\ -global ICH9-LPC.disable_s3 = 1 and report an issue with attached log.","title":"Recovery"},{"location":"variants/qemu_q35/releases/","text":"Release Notes Following Release Notes describe status of Open Source Firmware development for QEMU Q35 (Emulator). v0.1.0 - 2023-01-20 Added Enabled TPM Support. Secure Boot Support for Q35 machine. Option to reset Secure Boot keys to defaults. Dasharo System Features. Dasharo setup password. OPAL disk password support. SATA disk password support. SMM Feature enabled.","title":"Releases"},{"location":"variants/qemu_q35/releases/#release-notes","text":"Following Release Notes describe status of Open Source Firmware development for QEMU Q35 (Emulator).","title":"Release Notes"},{"location":"variants/qemu_q35/releases/#v010-2023-01-20","text":"","title":"v0.1.0 - 2023-01-20"},{"location":"variants/qemu_q35/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Note, that the below-described test scope is used during Dasharo Certification Procedure for tested platform: QEMU Q35 Machine Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. UEFI compatible interface EFI All 2. UEFI Shell USH All 3. Display ports and LCD support DSP DSP001.001 4. Debian Stable and Ubuntu LTS support LBT LBT001.001, LBT001.002, LBT002.001, LBT002.002, LBT003.001, LBT003.002, LBT004.001, LBT004.002 5. Network boot PXE All 6. Windows booting WBT All 7. Qubes OS Support QBS QBS001.001, QBS001.002 8. CPU status CPU All 9. UEFI Setup password PSW All Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001, TPM002.001 and TPM003.001 2. Secure Boot support SBO All","title":"Test matrix"},{"location":"variants/qemu_q35/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/qemu_q35/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Note, that the below-described test scope is used during Dasharo Certification Procedure for tested platform: QEMU Q35 Machine","title":"About"},{"location":"variants/qemu_q35/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. UEFI compatible interface EFI All 2. UEFI Shell USH All 3. Display ports and LCD support DSP DSP001.001 4. Debian Stable and Ubuntu LTS support LBT LBT001.001, LBT001.002, LBT002.001, LBT002.002, LBT003.001, LBT003.002, LBT004.001, LBT004.002 5. Network boot PXE All 6. Windows booting WBT All 7. Qubes OS Support QBS QBS001.001, QBS001.002 8. CPU status CPU All 9. UEFI Setup password PSW All","title":"Module: Dasharo compatibility"},{"location":"variants/qemu_q35/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001, TPM002.001 and TPM003.001 2. Secure Boot support SBO All","title":"Module: Dasharo security"},{"location":"variants/supermicro_x11_lga1151_series/building-manual/","text":"Supermicro X11 LGA1151 Series - building manual Please read the overview page first!","title":"Building manual"},{"location":"variants/supermicro_x11_lga1151_series/building-manual/#supermicro-x11-lga1151-series-building-manual","text":"Please read the overview page first!","title":"Supermicro X11 LGA1151 Series - building manual"},{"location":"variants/supermicro_x11_lga1151_series/faq/","text":"FAQ Please read the overview page first! How to identify my mainboard model? ~# dmidecode -t baseboard # dmidecode 3.0 Getting SMBIOS data from sysfs. SMBIOS 3 .0 present. Handle 0x0002, DMI type 2 , 15 bytes Base Board Information Manufacturer: Supermicro Product Name: X11SSH-TF Version: 1 .01 Serial Number: WM123S123456 Asset Tag: To be filled by O.E.M. Features: Board is a hosting board Board is replaceable Location In Chassis: To be filled by O.E.M. Chassis Handle: 0x0003 Type: Motherboard Contained Object Handles: 0 Handle 0x0026, DMI type 41 , 11 bytes Onboard Device Reference Designation: ASPEED Video AST2400 Type: Video Status: Enabled Type Instance: 1 Bus Address: 0000 :03:00.0 Handle 0x0027, DMI type 41 , 11 bytes Onboard Device Reference Designation: Intel LAN X550-AT2 #1 Type: Ethernet Status: Enabled Type Instance: 1 Bus Address: 0000 :04:00.0 Handle 0x0028, DMI type 41 , 11 bytes Onboard Device Reference Designation: Intel LAN X550-AT2 #2 Type: Ethernet Status: Enabled Type Instance: 2 Bus Address: 0000 :04:00.1 Handle 0x0029, DMI type 41 , 11 bytes Onboard Device Reference Designation: Avago SAS 3008 Type: SAS Controller Status: Disabled Type Instance: 1 Bus Address: 0000 :ff:00.0","title":"FAQ"},{"location":"variants/supermicro_x11_lga1151_series/faq/#faq","text":"Please read the overview page first!","title":"FAQ"},{"location":"variants/supermicro_x11_lga1151_series/faq/#how-to-identify-my-mainboard-model","text":"~# dmidecode -t baseboard # dmidecode 3.0 Getting SMBIOS data from sysfs. SMBIOS 3 .0 present. Handle 0x0002, DMI type 2 , 15 bytes Base Board Information Manufacturer: Supermicro Product Name: X11SSH-TF Version: 1 .01 Serial Number: WM123S123456 Asset Tag: To be filled by O.E.M. Features: Board is a hosting board Board is replaceable Location In Chassis: To be filled by O.E.M. Chassis Handle: 0x0003 Type: Motherboard Contained Object Handles: 0 Handle 0x0026, DMI type 41 , 11 bytes Onboard Device Reference Designation: ASPEED Video AST2400 Type: Video Status: Enabled Type Instance: 1 Bus Address: 0000 :03:00.0 Handle 0x0027, DMI type 41 , 11 bytes Onboard Device Reference Designation: Intel LAN X550-AT2 #1 Type: Ethernet Status: Enabled Type Instance: 1 Bus Address: 0000 :04:00.0 Handle 0x0028, DMI type 41 , 11 bytes Onboard Device Reference Designation: Intel LAN X550-AT2 #2 Type: Ethernet Status: Enabled Type Instance: 2 Bus Address: 0000 :04:00.1 Handle 0x0029, DMI type 41 , 11 bytes Onboard Device Reference Designation: Avago SAS 3008 Type: SAS Controller Status: Disabled Type Instance: 1 Bus Address: 0000 :ff:00.0","title":"How to identify my mainboard model?"},{"location":"variants/supermicro_x11_lga1151_series/firmware-update/","text":"Firmware update Please read the overview page first! Following documentation describe process of Dasharo open-source firmware distribution update.","title":"Firmware update"},{"location":"variants/supermicro_x11_lga1151_series/firmware-update/#firmware-update","text":"Please read the overview page first! Following documentation describe process of Dasharo open-source firmware distribution update.","title":"Firmware update"},{"location":"variants/supermicro_x11_lga1151_series/hardware-matrix/","text":"Hardware configuration matrix Please read the overview page first! The tables below contain information about current components of the testing environment for Supermicro X11 LGA1151 Series available in 3mdeb testing laboratory and in hands of community members. Supermicro X11SSH-TF (pietrushnic) Component Description CPU Intel Core iTBD CPU Cooler GPU N/A RAM TBD HDD TBD SSD TBD Flash memory TBD Network Local network wired connection Attached devices 1. TBD USB stick Power Supply TBD Power Control 1. Sonoff TBD Remote Testing Environment 1. RTE TBD","title":"Hardware Configuration Matrix"},{"location":"variants/supermicro_x11_lga1151_series/hardware-matrix/#hardware-configuration-matrix","text":"Please read the overview page first! The tables below contain information about current components of the testing environment for Supermicro X11 LGA1151 Series available in 3mdeb testing laboratory and in hands of community members.","title":"Hardware configuration matrix"},{"location":"variants/supermicro_x11_lga1151_series/hardware-matrix/#supermicro-x11ssh-tf-pietrushnic","text":"Component Description CPU Intel Core iTBD CPU Cooler GPU N/A RAM TBD HDD TBD SSD TBD Flash memory TBD Network Local network wired connection Attached devices 1. TBD USB stick Power Supply TBD Power Control 1. Sonoff TBD Remote Testing Environment 1. RTE TBD","title":"Supermicro X11SSH-TF (pietrushnic)"},{"location":"variants/supermicro_x11_lga1151_series/initial-deployment/","text":"Initial deployment We strongly recommend following these official instructions. The official guide has a lot of collaborative effort put into covering all of the edge cases and is regularly tested. Following these instructions to the letter without skipping, reordering or adding any steps will give you a proper Dasharo installation unless there's a hardware issue. We strongly recommend against following unofficial guides deviating in any way from the official instructions. If you have trouble with the installation process, ask for help on the official Dasharo chat channel . There are almost always people around willing to help with it. Before asking for help, make an attempt to follow the guide on your own and then ask for help with anything you get stuck on. Hardware preparation Please use Supermicro Quick Reference Guide for you mainboard e.g. X11SSH-TF . Find JPME2 and change its state to position 2-3, which means ME Manufacturing Mode enabled. Booting DTS over network For seamless and storageless deployment one can use BMC virtual floppy functionality to mount a floppy image containing iPXE. iPXE will allow to boot DTS over network without much effort. The image file can be downloaded from 3mdeb FTP server . If you wish to build the image, please follow instructions in Building iPXE floppy image section. To boot from the iPXE image, please do the following: Download or build the iPXE image on your host machine. Log in to the BMC dashboard. Select the floppy image through Browse button: Upload image to the BMC in the Virtual Media panel, by clicking Upload : Go to Remote Control -> iKVM/HTML5 and start iKVM/HTML5 remote control window. Use Power Control -> Set Power On Enter Boot Menu with F11. Select UEFI: ATEN Virtual Floppy 3000, Partition 1 . Wait for the embedded menu to show up (it may take up to 30 seconds for the UEFI protocols to execute during iPXE initialization - proprietary UEFI banzai...). Choose Dasharo Tools Suite from the menu: ------------------------ Dasharo Network Boot Menu ------------------------ Autoboot (DHCP) Dasharo Tools Suite OS installation (netboot.xyz official server) iPXE Shell Vendor BIOS backup Please follow DTS backup guide . Installing Dasharo with DTS TBD Building iPXE floppy image To create a floppy disk image for Supermicro BMC Virtual Media, you will need a Linux OS with docker installed. Then follow steps below: Compile iPXE (a sample revision has been taken from top of master branch on 25.01.2023, iPXE unfortunately stopped tagging the code in December 2020). Following set of commands will embed Dasharo iPXE menu script, enable HTTPS and EFI image support and provide custom build ID command to ensure build reproducibility: Clone iPXE repository: git clone https://github.com/ipxe/ipxe.git cd ipxe git checkout 4bffe0f0d9d0e1496ae5cfb7579e813277c29b0f NOTE : As mentioned above this is sample revision since iPXE code is not tagged. Get Dasharo menu for network booting. wget https://raw.githubusercontent.com/Dasharo/dasharo-blobs/46cc16f6d8f0ed9d057fdd20f15bb89ce5b8d212/dasharo/dasharo.ipxe Modify iPXE build configuration through general.h sed \"s|//#define\\s*IMAGE_SCRIPT.*|#define IMAGE_SCRIPT|\" src/config/general.h > src/config/general.h.tmp mv src/config/general.h.tmp src/config/general.h sed \"s|.*DOWNLOAD_PROTO_HTTPS|#define DOWNLOAD_PROTO_HTTPS|g\" src/config/general.h > src/config/general.h.tmp mv src/config/general.h.tmp src/config/general.h sed \"s|.*IMAGE_EFI|#define IMAGE_EFI|g\" src/config/general.h > src/config/general.h.tmp mv src/config/general.h.tmp src/config/general.h Use coreboot-sdk container to build iPXE binry: docker run --rm -it -v $PWD :/home/coreboot/ipxe -w /home/coreboot/ipxe \\ coreboot/coreboot-sdk:2022-12-18_3b32af950d /bin/bash Inside container: make sure you use correct cross-toolchain: export CROSS_COMPILE = \"x86_64-elf-\" Inside container: start compailation: make -C src bin-x86_64-efi-sb/ipxe.efi EMBED = $PWD /dasharo.ipxe BUILD_ID_CMD = \"echo 0x1234567890\" \\ EXTRA_CFLAGS = \"-Wno-address-of-packed-member -m64 -fuse-ld=bfd \\ -Wl,--build-id=none -fno-delete-null-pointer-checks -Wlogical-op -march=nocona \\ -malign-data=abi -mcmodel=large -mno-red-zone -fno-pic\" Exit docker container with exit command. Create image file: dd if = /dev/zero of = ipxe.img count = 1 bs = 1440K Make FAT filesystem on the image file: sudo mkfs.fat --mbr = y ipxe.img Mount the image file: sudo mount ipxe.img /mnt Copy the iPXE to the mounted image file: sudo mkdir -p /mnt/EFI/BOOT/ && \\ sudo cp src/bin-x86_64-efi-sb/ipxe.efi /mnt/EFI/BOOT/BOOTX64.EFI Unmount the image file: sudo umount /mnt The resulting ipxe.img file is now ready to be attached as Virtual Media on Supermicro BMC.","title":"Initial deployment"},{"location":"variants/supermicro_x11_lga1151_series/initial-deployment/#initial-deployment","text":"We strongly recommend following these official instructions. The official guide has a lot of collaborative effort put into covering all of the edge cases and is regularly tested. Following these instructions to the letter without skipping, reordering or adding any steps will give you a proper Dasharo installation unless there's a hardware issue. We strongly recommend against following unofficial guides deviating in any way from the official instructions. If you have trouble with the installation process, ask for help on the official Dasharo chat channel . There are almost always people around willing to help with it. Before asking for help, make an attempt to follow the guide on your own and then ask for help with anything you get stuck on.","title":"Initial deployment"},{"location":"variants/supermicro_x11_lga1151_series/initial-deployment/#hardware-preparation","text":"Please use Supermicro Quick Reference Guide for you mainboard e.g. X11SSH-TF . Find JPME2 and change its state to position 2-3, which means ME Manufacturing Mode enabled.","title":"Hardware preparation"},{"location":"variants/supermicro_x11_lga1151_series/initial-deployment/#booting-dts-over-network","text":"For seamless and storageless deployment one can use BMC virtual floppy functionality to mount a floppy image containing iPXE. iPXE will allow to boot DTS over network without much effort. The image file can be downloaded from 3mdeb FTP server . If you wish to build the image, please follow instructions in Building iPXE floppy image section. To boot from the iPXE image, please do the following: Download or build the iPXE image on your host machine. Log in to the BMC dashboard. Select the floppy image through Browse button: Upload image to the BMC in the Virtual Media panel, by clicking Upload : Go to Remote Control -> iKVM/HTML5 and start iKVM/HTML5 remote control window. Use Power Control -> Set Power On Enter Boot Menu with F11. Select UEFI: ATEN Virtual Floppy 3000, Partition 1 . Wait for the embedded menu to show up (it may take up to 30 seconds for the UEFI protocols to execute during iPXE initialization - proprietary UEFI banzai...). Choose Dasharo Tools Suite from the menu: ------------------------ Dasharo Network Boot Menu ------------------------ Autoboot (DHCP) Dasharo Tools Suite OS installation (netboot.xyz official server) iPXE Shell","title":"Booting DTS over network"},{"location":"variants/supermicro_x11_lga1151_series/initial-deployment/#vendor-bios-backup","text":"Please follow DTS backup guide .","title":"Vendor BIOS backup"},{"location":"variants/supermicro_x11_lga1151_series/initial-deployment/#installing-dasharo-with-dts","text":"TBD","title":"Installing Dasharo with DTS"},{"location":"variants/supermicro_x11_lga1151_series/overview/","text":"Overview Supermicro X11 LGA1151 Series are mainboards dedicated for servers and workstations. Most notable examples of this hardware are X11SSH-TF and X11SSH-F . Ideal motherboard for NAS servers, with a PCIE x16 slot to potentially accommodate a graphics card. To learn more about our motivation for the coreboot port and Dasharo compatible with Supermicro X11 LGA1151 Series please check references section. If you want to build, initially deploy, update or recover your setup please check documentation sections on the left. Status Dasharo compatible with Supermicro X11 LGA1151 Series is a community-driven effort. We work on this in our free time, since we have no sponsor for this project. To address the issue we organize virtual hackathon on Dasharo Matrix whenever we can. At this point two communinty members are engaged ( collector-ynh with X11SSH-F and pietrushnic with X11SSH-TF, we also have X11SSH-TF in 3mdeb lab). Feel free to conact us if you wan to talk about project status. Please note that Dasharo compatilbe with Supermicro X11 LGA1151 Series may work with various boards from this family, at this stage only X11SSH-F and X11SSH-TF can be treated as tested. This state can change when we will enter more mature state with transparent validation results published in Releases section and hardware configuration matrix used for testing. We may also consider CPU, DRAM and GPU HCL sections in documentation. If you are interested in this project, please consider joining the community-dirven effort or supporting us in other way . The most advanced code is on development branch . This code supports only Dasharo (coreboot+UEFI) . Work in progress documentation can be found here . NOTE : We decided to follow divide and conquer strategy, every piece of contribution which was verified and reviewed will be merged even if that is just small part of bigger documentation . Otherwise we will never move forward. References Mullvad: Open-source firmware is the future Green TekSolutions: The first motherboard for servers to use CoreBoot - X11SSH-TF coreboot: X11 LGA1151 Series documentation coreboot: Supermicro X11SSH-F/X11SSH-LN4F documentation","title":"Overview"},{"location":"variants/supermicro_x11_lga1151_series/overview/#overview","text":"Supermicro X11 LGA1151 Series are mainboards dedicated for servers and workstations. Most notable examples of this hardware are X11SSH-TF and X11SSH-F . Ideal motherboard for NAS servers, with a PCIE x16 slot to potentially accommodate a graphics card. To learn more about our motivation for the coreboot port and Dasharo compatible with Supermicro X11 LGA1151 Series please check references section. If you want to build, initially deploy, update or recover your setup please check documentation sections on the left.","title":"Overview"},{"location":"variants/supermicro_x11_lga1151_series/overview/#status","text":"Dasharo compatible with Supermicro X11 LGA1151 Series is a community-driven effort. We work on this in our free time, since we have no sponsor for this project. To address the issue we organize virtual hackathon on Dasharo Matrix whenever we can. At this point two communinty members are engaged ( collector-ynh with X11SSH-F and pietrushnic with X11SSH-TF, we also have X11SSH-TF in 3mdeb lab). Feel free to conact us if you wan to talk about project status. Please note that Dasharo compatilbe with Supermicro X11 LGA1151 Series may work with various boards from this family, at this stage only X11SSH-F and X11SSH-TF can be treated as tested. This state can change when we will enter more mature state with transparent validation results published in Releases section and hardware configuration matrix used for testing. We may also consider CPU, DRAM and GPU HCL sections in documentation. If you are interested in this project, please consider joining the community-dirven effort or supporting us in other way . The most advanced code is on development branch . This code supports only Dasharo (coreboot+UEFI) . Work in progress documentation can be found here . NOTE : We decided to follow divide and conquer strategy, every piece of contribution which was verified and reviewed will be merged even if that is just small part of bigger documentation . Otherwise we will never move forward.","title":"Status"},{"location":"variants/supermicro_x11_lga1151_series/overview/#references","text":"Mullvad: Open-source firmware is the future Green TekSolutions: The first motherboard for servers to use CoreBoot - X11SSH-TF coreboot: X11 LGA1151 Series documentation coreboot: Supermicro X11SSH-F/X11SSH-LN4F documentation","title":"References"},{"location":"variants/supermicro_x11_lga1151_series/recovery/","text":"Recovery Please read the overview page first! BIOS Update through BMC Following instruction was tested on: X11SSH-TF v1.01 For information how to identify your mainboard model pelase check faq . Following documentation describes the process of recovering hardware from brick state with through BMC BIOS Update feature. This feature can be used also for initial deployment and Firmware Update . Requirements License activation Without active license you can't use BIOS Update feature. License key can be generated using kasuganosoras scripts and entered through BMC web interface ( Miscellaneous->Activate License ). Up to date firmware Please make sure you using firmware revision 01.60 If not please follow IPMI Firmware Update_NEW.pdf instruction from package that you can download here . Unfortunately most efficient way to interact with proprietary BMC is to use Supermicro proprietary closed source tools: Supermicro Update Manager please download and unpack archive. Backup or Supermicro BIOS update please download and unpack archive.","title":"Recovery"},{"location":"variants/supermicro_x11_lga1151_series/recovery/#recovery","text":"Please read the overview page first!","title":"Recovery"},{"location":"variants/supermicro_x11_lga1151_series/recovery/#bios-update-through-bmc","text":"Following instruction was tested on: X11SSH-TF v1.01 For information how to identify your mainboard model pelase check faq . Following documentation describes the process of recovering hardware from brick state with through BMC BIOS Update feature. This feature can be used also for initial deployment and Firmware Update .","title":"BIOS Update through BMC"},{"location":"variants/supermicro_x11_lga1151_series/releases/","text":"Dasharo compatible with Supermicro X11 LGA1151 Series Please read the overview page first!","title":"Releases"},{"location":"variants/supermicro_x11_lga1151_series/releases/#dasharo-compatible-with-supermicro-x11-lga1151-series","text":"Please read the overview page first!","title":"Dasharo compatible with Supermicro X11 LGA1151 Series"},{"location":"variants/supermicro_x11_lga1151_series/test-matrix/","text":"Test matrix - MSI Z690-A WIFI DDR4 Please read the overview page first! About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"Test matrix"},{"location":"variants/supermicro_x11_lga1151_series/test-matrix/#test-matrix-msi-z690-a-wifi-ddr4","text":"Please read the overview page first!","title":"Test matrix - MSI Z690-A WIFI DDR4"},{"location":"variants/supermicro_x11_lga1151_series/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"About"},{"location":"variants/talos_2/building-manual/","text":"Building manual Building coreboot To build coreboot image, follow the steps below: Clone the coreboot repository: git clone --depth = 1 https://github.com/Dasharo/coreboot.git -b raptor-cs_talos-2/rel_v0.7.0 Get the submodules: cd coreboot git submodule update --init --recursive --checkout Start docker container: docker run --rm -it \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ -u \" $( id -u ) : $( id -g ) \" \\ coreboot/coreboot-sdk:0ad5fbd48d /bin/bash Inside of the container, configure and start the build process: ( docker ) cp configs/config.raptor-cs-talos-2 .config ( docker ) make olddefconfig ( docker ) make Building heads Clone the heads repository: git clone --depth = 1 https://github.com/Dasharo/heads.git -b raptor-cs_talos-2/release Start docker container: cd heads docker run --rm -it -v $PWD : $PWD -w $PWD -u \" $( id -u ) : $( id -g ) \" 3mdeb/heads-docker:2.4.0 /bin/bash Build: make BOARD = talos-2","title":"Building manual"},{"location":"variants/talos_2/building-manual/#building-manual","text":"","title":"Building manual"},{"location":"variants/talos_2/building-manual/#building-coreboot","text":"To build coreboot image, follow the steps below: Clone the coreboot repository: git clone --depth = 1 https://github.com/Dasharo/coreboot.git -b raptor-cs_talos-2/rel_v0.7.0 Get the submodules: cd coreboot git submodule update --init --recursive --checkout Start docker container: docker run --rm -it \\ -v $PWD :/home/coreboot/coreboot \\ -w /home/coreboot/coreboot \\ -u \" $( id -u ) : $( id -g ) \" \\ coreboot/coreboot-sdk:0ad5fbd48d /bin/bash Inside of the container, configure and start the build process: ( docker ) cp configs/config.raptor-cs-talos-2 .config ( docker ) make olddefconfig ( docker ) make","title":"Building coreboot"},{"location":"variants/talos_2/building-manual/#building-heads","text":"Clone the heads repository: git clone --depth = 1 https://github.com/Dasharo/heads.git -b raptor-cs_talos-2/release Start docker container: cd heads docker run --rm -it -v $PWD : $PWD -w $PWD -u \" $( id -u ) : $( id -g ) \" 3mdeb/heads-docker:2.4.0 /bin/bash Build: make BOARD = talos-2","title":"Building heads"},{"location":"variants/talos_2/conferences/","text":"Conference materials OpenPOWER Summit, 2021 coreboot on POWER9 - Piotr Kr\u00f3l OpenPOWER Summit, 2020 POWER9 Support in coreboot - Micha\u0142 \u017bygowski Fosdem, 2021 Status of OpenPOWER support in coreboot - Micha\u0142 \u017bygowski Open Source Firmware Conference, 2020 POWER9 support in coreboot - Micha\u0142 \u017bygowski","title":"Conference materials"},{"location":"variants/talos_2/conferences/#conference-materials","text":"","title":"Conference materials"},{"location":"variants/talos_2/conferences/#openpower-summit-2021","text":"coreboot on POWER9 - Piotr Kr\u00f3l","title":"OpenPOWER Summit, 2021"},{"location":"variants/talos_2/conferences/#openpower-summit-2020","text":"POWER9 Support in coreboot - Micha\u0142 \u017bygowski","title":"OpenPOWER Summit, 2020"},{"location":"variants/talos_2/conferences/#fosdem-2021","text":"Status of OpenPOWER support in coreboot - Micha\u0142 \u017bygowski","title":"Fosdem, 2021"},{"location":"variants/talos_2/conferences/#open-source-firmware-conference-2020","text":"POWER9 support in coreboot - Micha\u0142 \u017bygowski","title":"Open Source Firmware Conference, 2020"},{"location":"variants/talos_2/firmware-update/","text":"Firmware update The following documentation describes the process of Dasharo open-source firmware update. Copy the binaries to the BMC: scp build/bootblock.signed.ecc root@:/tmp/bootblock.signed.ecc scp build/coreboot.rom.signed.ecc root@:/tmp/coreboot.rom.signed.ecc Flash the binaries by replacing the HBB partition (execute from BMC): pflash -e -P HBB -p /tmp/bootblock.signed.ecc pflash -e -P HBI -p /tmp/coreboot.rom.signed.ecc Log into the BMC GUI at https:// . Enter the Server power operations ( https:///#/server-control/power-operations ) and invoke warm reboot . Go to Serial over LAN remote console ( https:///#/server-control/remote-console ). Enjoy the updated firmware running on Talos II.","title":"Firmware update"},{"location":"variants/talos_2/firmware-update/#firmware-update","text":"The following documentation describes the process of Dasharo open-source firmware update. Copy the binaries to the BMC: scp build/bootblock.signed.ecc root@:/tmp/bootblock.signed.ecc scp build/coreboot.rom.signed.ecc root@:/tmp/coreboot.rom.signed.ecc Flash the binaries by replacing the HBB partition (execute from BMC): pflash -e -P HBB -p /tmp/bootblock.signed.ecc pflash -e -P HBI -p /tmp/coreboot.rom.signed.ecc Log into the BMC GUI at https:// . Enter the Server power operations ( https:///#/server-control/power-operations ) and invoke warm reboot . Go to Serial over LAN remote console ( https:///#/server-control/remote-console ). Enjoy the updated firmware running on Talos II.","title":"Firmware update"},{"location":"variants/talos_2/hardware-matrix/","text":"Hardware configuration matrix Introduction This document describes the hardware configuration used for validation of the coreboot port on the Talos II platform. Talos II Component Description 1st CPU IBM POWER9 \u201cSforza\u201d 02CY650 CPU Cooler 2nd CPU IBM POWER9 \u201cSforza\u201d 02CY650 CPU Cooler SSD Intel 670p 512 GB M26472-201 NVME RAM Crucial CT8G4RF88266 Flash memory Micron MT25QL512ABB8ESF-0SIT Network Local network wired connection Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. Logitech, Inc. Keyboard K120 Ethernet 2x Broadcom BCM5719 Power Supply Corsair TX550M Power Control Sonoff S20 switch Remote Control OpenBMC Note: for single CPU testing the 2nd CPU is dismantled. Following RAM configurations were tested and are proved to be properly initialized. MCS0, MCA0 DIMM0: 1Rx4 16GB PC4-2666V-RC2-12-PA0 DIMM1: not installed MCS0, MCA1 DIMM0: 1Rx8 8GB PC4-2666V-RD1-12 DIMM1: not installed MCS1, MCA0 DIMM0: 2Rx4 32GB PC4-2666V-RB2-12-MA0 DIMM1: not installed MCS1, MCA1 DIMM0: 2Rx8 16GB PC4-2666V-RE2-12 DIMM1: not installed All 3 major DRAM vendors are supported, namely Samsung, Micron and Hynix.","title":"Hardware configuration matrix"},{"location":"variants/talos_2/hardware-matrix/#hardware-configuration-matrix","text":"","title":"Hardware configuration matrix"},{"location":"variants/talos_2/hardware-matrix/#introduction","text":"This document describes the hardware configuration used for validation of the coreboot port on the Talos II platform.","title":"Introduction"},{"location":"variants/talos_2/hardware-matrix/#talos-ii","text":"Component Description 1st CPU IBM POWER9 \u201cSforza\u201d 02CY650 CPU Cooler 2nd CPU IBM POWER9 \u201cSforza\u201d 02CY650 CPU Cooler SSD Intel 670p 512 GB M26472-201 NVME RAM Crucial CT8G4RF88266 Flash memory Micron MT25QL512ABB8ESF-0SIT Network Local network wired connection Attached devices 1. SanDisk USB 3.2Gen1 16 GB 2. Logitech, Inc. Keyboard K120 Ethernet 2x Broadcom BCM5719 Power Supply Corsair TX550M Power Control Sonoff S20 switch Remote Control OpenBMC Note: for single CPU testing the 2nd CPU is dismantled. Following RAM configurations were tested and are proved to be properly initialized. MCS0, MCA0 DIMM0: 1Rx4 16GB PC4-2666V-RC2-12-PA0 DIMM1: not installed MCS0, MCA1 DIMM0: 1Rx8 8GB PC4-2666V-RD1-12 DIMM1: not installed MCS1, MCA0 DIMM0: 2Rx4 32GB PC4-2666V-RB2-12-MA0 DIMM1: not installed MCS1, MCA1 DIMM0: 2Rx8 16GB PC4-2666V-RE2-12 DIMM1: not installed All 3 major DRAM vendors are supported, namely Samsung, Micron and Hynix.","title":"Talos II"},{"location":"variants/talos_2/initial-deployment/","text":"Initial deployment coreboot installation Copy the binaries to the BMC (assuming in the coreboot root directory): scp build/bootblock.signed.ecc root@:/tmp/bootblock.signed.ecc scp build/coreboot.rom.signed.ecc root@:/tmp/coreboot.rom.signed.ecc If that file is not present, use coreboot.rom instead Backup the HBB partition (for faster later recovery) by invoking this command on BMC: pflash -P HBB -r /tmp/hbb.bin pflash -P HBI -r /tmp/hbi.bin Flash the binaries by replacing HBB partition (execute from BMC): pflash -e -P HBB -p /tmp/bootblock.signed.ecc pflash -e -P HBI -p /tmp/coreboot.rom.signed.ecc Again, if that file is not present, use coreboot.rom instead Answer yes to the prompt and wait for the process to finish. Log into the BMC GUI again at https:// . Enter the Server power operations ( https:///#/server-control/power-operations ) and invoke warm reboot . Go to Serial over LAN remote console ( https:///#/server-control/remote-console ). Wait for a while until coreboot shows up: Enjoy the coreboot running on Talos II. Optional: In order to recovery the platform quickly to healthy state, flash the HBB partition back with: pflash -e -P HBB -p /tmp/hbb.bin pflash -e -P HBI -p /tmp/hbi.bin Heads installation Copy the Heads binary to the BMC (assuming in the Heads root directory): scp build/zImage.bundled root@:/tmp/zImage.bundled Log in to the BMC: ssh root@ Flash the BOOTKERNEL partition with Heads: pflash -e -P BOOTKERNEL -p /tmp/zImage.bundled Answer yes to the prompt and wait for the process to finish. Log into the BMC GUI at https:/// . Enter the Server power operations ( https:///#/server-control/power-operations ) and invoke warm reboot . Go to Serial over LAN remote console ( https:///#/server-control/remote-console ). Wait for a while until Heads shows up: Enjoy the Heads running on Talos II. Testing firmware images without flashing BMC firmware v2.00+ allows testing new firmware images without flashing the physical flash device. This makes testing and switching between two versions (e.g. Hostboot and coreboot) much faster and safer. There are two ways of doing so, here's a more convenient one that uses mboxctl : Read original flash: For earlier versions of coreboot port it is required to read from system that booted at least once, since some of the partitions are modified on the first boot. this is no longer necessary since v0.5.0. root@talos:~# pflash -r /tmp/talos.pnor This file may also be copied out of BMC to a secure place and serve as a backup of whole flash contents. Keep in mind that tmpfs size is limited and exceeding that limit may result in unresponsive BMC, which in most severe cases requires hard power cycle. \"Flashing\" modified partition(s): This is similar to flashing real device with two changes: no need to erase the flash and target file must be specified. New command looks like this: root@talos:~# pflash -f -P -p .bin -F /tmp/talos.pnor Since the real flash device is not used, backup can be skipped. The rest is like above: # bootblock pflash -f -P HBB -p /tmp/bootblock.signed.ecc -F /tmp/talos.pnor # coreboot pflash -f -P HBI -p /tmp/coreboot.rom.signed.ecc -F /tmp/talos.pnor # Heads pflash -f -P BOOTKERNEL -p /tmp/zImage.bundled -F /tmp/talos.pnor Mount the file as flash device: root@talos:~# mboxctl --backend file:/tmp/talos.pnor Sometimes this command fails with timeout, in that case repeat it until it succeeds. Optionally, success can be tested with: root@talos:~# mboxctl --lpc-state LPC Bus Maps: BMC Memory BMC Memory tells that emulated flash is used instead of real one. Host doesn't see any difference (except maybe different access times and erase block size), it still reads and writes PNOR the same way as with physical device. Start the platform as described in previous sections and test it. To get back to using real PNOR: root@talos:~# mboxctl --backend vpnor Failed to post message: Connection timed out root@talos:~# mboxctl --lpc-state LPC Bus Maps: Flash Device Even though that command reports failure, it maps LPC back to flash device. This can be tested with mboxctl --lpc-state . (Optional) Flash tested image to permanent storage: root@talos:~# pflash -E -p /tmp/talos.pnor The other method is described on Raptor's wiki and requires starting mboxd manually (still needs BMC firmware v2.00+). It's worth to take a look there because sometimes mboxd stops working ( mboxctl errors every time) and that page shows how it can be started.","title":"Initial deployment"},{"location":"variants/talos_2/initial-deployment/#initial-deployment","text":"","title":"Initial deployment"},{"location":"variants/talos_2/initial-deployment/#coreboot-installation","text":"Copy the binaries to the BMC (assuming in the coreboot root directory): scp build/bootblock.signed.ecc root@:/tmp/bootblock.signed.ecc scp build/coreboot.rom.signed.ecc root@:/tmp/coreboot.rom.signed.ecc If that file is not present, use coreboot.rom instead Backup the HBB partition (for faster later recovery) by invoking this command on BMC: pflash -P HBB -r /tmp/hbb.bin pflash -P HBI -r /tmp/hbi.bin Flash the binaries by replacing HBB partition (execute from BMC): pflash -e -P HBB -p /tmp/bootblock.signed.ecc pflash -e -P HBI -p /tmp/coreboot.rom.signed.ecc Again, if that file is not present, use coreboot.rom instead Answer yes to the prompt and wait for the process to finish. Log into the BMC GUI again at https:// . Enter the Server power operations ( https:///#/server-control/power-operations ) and invoke warm reboot . Go to Serial over LAN remote console ( https:///#/server-control/remote-console ). Wait for a while until coreboot shows up: Enjoy the coreboot running on Talos II. Optional: In order to recovery the platform quickly to healthy state, flash the HBB partition back with: pflash -e -P HBB -p /tmp/hbb.bin pflash -e -P HBI -p /tmp/hbi.bin","title":"coreboot installation"},{"location":"variants/talos_2/initial-deployment/#heads-installation","text":"Copy the Heads binary to the BMC (assuming in the Heads root directory): scp build/zImage.bundled root@:/tmp/zImage.bundled Log in to the BMC: ssh root@ Flash the BOOTKERNEL partition with Heads: pflash -e -P BOOTKERNEL -p /tmp/zImage.bundled Answer yes to the prompt and wait for the process to finish. Log into the BMC GUI at https:/// . Enter the Server power operations ( https:///#/server-control/power-operations ) and invoke warm reboot . Go to Serial over LAN remote console ( https:///#/server-control/remote-console ). Wait for a while until Heads shows up: Enjoy the Heads running on Talos II.","title":"Heads installation"},{"location":"variants/talos_2/initial-deployment/#testing-firmware-images-without-flashing","text":"BMC firmware v2.00+ allows testing new firmware images without flashing the physical flash device. This makes testing and switching between two versions (e.g. Hostboot and coreboot) much faster and safer. There are two ways of doing so, here's a more convenient one that uses mboxctl : Read original flash: For earlier versions of coreboot port it is required to read from system that booted at least once, since some of the partitions are modified on the first boot. this is no longer necessary since v0.5.0. root@talos:~# pflash -r /tmp/talos.pnor This file may also be copied out of BMC to a secure place and serve as a backup of whole flash contents. Keep in mind that tmpfs size is limited and exceeding that limit may result in unresponsive BMC, which in most severe cases requires hard power cycle. \"Flashing\" modified partition(s): This is similar to flashing real device with two changes: no need to erase the flash and target file must be specified. New command looks like this: root@talos:~# pflash -f -P -p .bin -F /tmp/talos.pnor Since the real flash device is not used, backup can be skipped. The rest is like above: # bootblock pflash -f -P HBB -p /tmp/bootblock.signed.ecc -F /tmp/talos.pnor # coreboot pflash -f -P HBI -p /tmp/coreboot.rom.signed.ecc -F /tmp/talos.pnor # Heads pflash -f -P BOOTKERNEL -p /tmp/zImage.bundled -F /tmp/talos.pnor Mount the file as flash device: root@talos:~# mboxctl --backend file:/tmp/talos.pnor Sometimes this command fails with timeout, in that case repeat it until it succeeds. Optionally, success can be tested with: root@talos:~# mboxctl --lpc-state LPC Bus Maps: BMC Memory BMC Memory tells that emulated flash is used instead of real one. Host doesn't see any difference (except maybe different access times and erase block size), it still reads and writes PNOR the same way as with physical device. Start the platform as described in previous sections and test it. To get back to using real PNOR: root@talos:~# mboxctl --backend vpnor Failed to post message: Connection timed out root@talos:~# mboxctl --lpc-state LPC Bus Maps: Flash Device Even though that command reports failure, it maps LPC back to flash device. This can be tested with mboxctl --lpc-state . (Optional) Flash tested image to permanent storage: root@talos:~# pflash -E -p /tmp/talos.pnor The other method is described on Raptor's wiki and requires starting mboxd manually (still needs BMC firmware v2.00+). It's worth to take a look there because sometimes mboxd stops working ( mboxctl errors every time) and that page shows how it can be started.","title":"Testing firmware images without flashing"},{"location":"variants/talos_2/overview/","text":"Overview Releases - groups information about all releases. Building manual - describes how to build Dasharo for Talos II. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for Talos II. Firmware update - explains supported Dasharo open-source firmware update methods. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes validation scope used during Dasharo firmware validation procedure. Conferences - includes information from various conferences about POWER architecture support in coreboot. TPM connections and support - describes the methods of connecting dedicated TPM module to the board and how to validate it. Useful documents Board manual","title":"Overview"},{"location":"variants/talos_2/overview/#overview","text":"Releases - groups information about all releases. Building manual - describes how to build Dasharo for Talos II. Initial deployment - describes initial Dasharo deployment methods (i. e. flashing new firmware) for Talos II. Firmware update - explains supported Dasharo open-source firmware update methods. Recovery - gathers information on how to recover the platform from potential failure. Hardware configuration matrix - describes the platform's hardware configuration used during the Dasharo firmware validation procedure. Test matrix - describes validation scope used during Dasharo firmware validation procedure. Conferences - includes information from various conferences about POWER architecture support in coreboot. TPM connections and support - describes the methods of connecting dedicated TPM module to the board and how to validate it.","title":"Overview"},{"location":"variants/talos_2/overview/#useful-documents","text":"Board manual","title":"Useful documents"},{"location":"variants/talos_2/recovery/","text":"Recovery Prequisitions To proceed with the recovery procedure the backup with the vendor firmware will be necessary eg. talos.pnor . The backup file should be generated before making any changes in the device flash chip according to documentation in the first step in Testing firmware images without flashing section. Flashing using BMC Flash firmware by executing the following commands on BMC: pflash -E -p /tmp/talos.pnor Log into the BMC GUI at https:// . Enter the Server power operations ( https:///#/server-control/power-operations ) and invoke warm reboot . After rebooting the vendor firmware will be restored. Restore Petitboot If you want to use Petitboot, and you have already installed system Heads, follow this procedure: Download the newest PNOR package from raptor wiki . Unzip downloaded file and find the talos.pnor file. Copy the file to the BMC: scp talos.pnor root@:/tmp/talos.pnor Modify partitions by executing the following commands on BMC (this is not necessary): pflash -P HBB -p /tmp/bootblock.signed.ecc -F /tmp/talos.pnor pflash -P HBI -p /tmp/coreboot.rom.signed.ecc -F /tmp/talos.pnor Flash firmware: pflash -E -p /tmp/talos.pnor Log into the BMC GUI at https:// . Enter the Server power operations ( https:///#/server-control/power-operations ) and invoke warm reboot . Enjoy the Petitboot running on Talos II.","title":"Recovery"},{"location":"variants/talos_2/recovery/#recovery","text":"","title":"Recovery"},{"location":"variants/talos_2/recovery/#prequisitions","text":"To proceed with the recovery procedure the backup with the vendor firmware will be necessary eg. talos.pnor . The backup file should be generated before making any changes in the device flash chip according to documentation in the first step in Testing firmware images without flashing section.","title":"Prequisitions"},{"location":"variants/talos_2/recovery/#flashing-using-bmc","text":"Flash firmware by executing the following commands on BMC: pflash -E -p /tmp/talos.pnor Log into the BMC GUI at https:// . Enter the Server power operations ( https:///#/server-control/power-operations ) and invoke warm reboot . After rebooting the vendor firmware will be restored.","title":"Flashing using BMC"},{"location":"variants/talos_2/recovery/#restore-petitboot","text":"If you want to use Petitboot, and you have already installed system Heads, follow this procedure: Download the newest PNOR package from raptor wiki . Unzip downloaded file and find the talos.pnor file. Copy the file to the BMC: scp talos.pnor root@:/tmp/talos.pnor Modify partitions by executing the following commands on BMC (this is not necessary): pflash -P HBB -p /tmp/bootblock.signed.ecc -F /tmp/talos.pnor pflash -P HBI -p /tmp/coreboot.rom.signed.ecc -F /tmp/talos.pnor Flash firmware: pflash -E -p /tmp/talos.pnor Log into the BMC GUI at https:// . Enter the Server power operations ( https:///#/server-control/power-operations ) and invoke warm reboot . Enjoy the Petitboot running on Talos II.","title":"Restore Petitboot"},{"location":"variants/talos_2/releases/","text":"Release notes Following Release Notes describe status of Open Source Firmware development for Raptor Computing Systems Talos II For details about our release process please read Dasharo Standard Release Process . Subscribe to Release Newsletter Test results for this platform can be found here . v0.7.0 - 2023-07-26 Fixed CPU appears to be stuck on initial frequency No flashrom support 0.6 Release - Cannot boot if no TPM OS-level access to CBMEM TPM discovery and usage stability Dual CPU setup - Second fan at full speed Known issues Missing parts of Device Tree describing specific unit (VPD, serial numbers) No DIMM temperatures reported Binaries raptor-cs_talos-2_bootblock_v0.7.0.signed.ecc sha256 sha256.sig raptor-cs_talos-2_coreboot_v0.7.0.rom.signed.ecc sha256 sha256.sig raptor-cs_talos-2_zImage_v0.7.0.bundled sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 4ed0a830b14d6e1841eae0dd3c2e6539a8dcf0a8 revision fc47236e skiboot based on 9858186353f2203fe477f316964e03609d12fd1d revision 1b14dd0b heads based on edf200e7913c62975a424cfb9dbd579747d0665c revision edf200e7913c62975a424cfb9dbd579747d0665c v0.6.0 - 2022-08-26 Added Optional support for Infineon I2C TPM1 chips Initial support for measured boot Fixed Heads console output only on BMC console, not VGA Startup on a single CPU configuration Startup on a single CPU configuration and support for older CPUs (without WOF tables and with different frequencies) CBMEM can no longer be accessed from OS Known issues Missing parts of Device Tree describing specific unit (VPD, serial numbers) CPU appears to be stuck on initial frequency Binaries raptor-cs_talos-2_zImage_v0.6.0.bundled sha256 sha256.sig raptor-cs_talos-2_coreboot_v0.6.0.rom.signed.ecc sha256 sha256.sig raptor-cs_talos-2_bootblock_v0.6.0.signed.ecc sha256 sha256.sig See how to verify signatures on this video SBOM (Software Bill of Materials) coreboot based on 5621a1e revision 2207bbcc skiboot based on 7f90b9cd revision fa060c2c heads based on fdbd9b2 revision 66f0fce0870b729d v0.5.0 - 2022-04-12 Changed Add FSI initialization and functions for accessing devices behind FSI bus Cache MVPD between stages Initialize and train XBus links Change SCOM API to be able to access second CPU Initialize PCIe, MCS, OCC and TOD for second CPU Switch to ELF payload, clean up Device Tree generation Various boot time optimizations Fixed Only one CPU is started SPDs are not exposed in sysfs automatically Known issues Missing parts of Device Tree describing specific unit (VPD, serial numbers) CBMEM can no longer be accessed from OS Binaries raptor-cs_talos-2_bootblock_v0.5.0.signed.ecc sha256 sha256.sig raptor-cs_talos-2_coreboot_v0.5.0.rom.signed.ecc sha256 sha256.sig Heads was not modified in this release, its binary from previous releases can be used. SBOM (Software Bill of Materials) coreboot based on 5621a1e revision c92383f9 skiboot based on 04-16-2019 revision 98581863 v0.4.1 - 2022-01-10 Changed Simplify memlayout Replace PPC_SHIFT with PPC_PLACE macro Change SPR numbers definitions to decimal Print signing output to terminal Fixed Watchdog timing out Sporadic signing failure due to the tools not being built Building with cross compiler other than powerpc64-linux-gnu- Known issues Only one CPU is started SPDs are not exposed in sysfs automatically Missing parts of Device Tree describing specific unit (VPD, serial numbers) Binaries dasharo_talos_2_bootblock_v0.4.1.signed.ecc sha256 sha256.sig dasharo_talos_2_coreboot_v0.4.1.rom.signed.ecc sha256 sha256.sig dasharo_talos_2_zImage_v0.4.1.bundled sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on 5621a1e revision 13b58058 skiboot based on 04-16-2019 revision 98581863 heads based on 21e50681 revision 34c77951 v0.4.0 - 2021-10-29 Added OCC support XIVE support PCIe initialization IPMI block transfer interface Non-constant nodes in Device Tree are generated programmatically Known issues Only one CPU is started SPDs are not exposed in sysfs automatically Missing parts of Device Tree describing specific unit (VPD, serial numbers) Watchdog times out Binaries dasharo_talos_2_bootblock_v0.4.0.signed.ecc sha256 sha256.sig dasharo_talos_2_coreboot.rom.signed.ecc sha256 sha256.sig zImage_v0.4.0.bundled sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on 5621a1e revision b535763b skiboot based on 04-16-2019 revision 98581863 heads based on 21e50681 revision 34c77951","title":"Releases"},{"location":"variants/talos_2/releases/#release-notes","text":"Following Release Notes describe status of Open Source Firmware development for Raptor Computing Systems Talos II For details about our release process please read Dasharo Standard Release Process . Subscribe to Release Newsletter Test results for this platform can be found here .","title":"Release notes"},{"location":"variants/talos_2/releases/#v070-2023-07-26","text":"","title":"v0.7.0 - 2023-07-26"},{"location":"variants/talos_2/releases/#v060-2022-08-26","text":"","title":"v0.6.0 - 2022-08-26"},{"location":"variants/talos_2/releases/#v050-2022-04-12","text":"","title":"v0.5.0 - 2022-04-12"},{"location":"variants/talos_2/releases/#v041-2022-01-10","text":"","title":"v0.4.1 - 2022-01-10"},{"location":"variants/talos_2/releases/#v040-2021-10-29","text":"","title":"v0.4.0 - 2021-10-29"},{"location":"variants/talos_2/test-matrix/","text":"Test matrix About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. coreboot base port CBP CBP001.001, CBP002.001, CBP004.001 2. Heads bootloader support HDS HDS001.001, HDS001.002 3. Device Tree DVT DVT001.001, DVT002.001 Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM TPM001.001 and TPM002.001 Module: Dasharo performance No. Supported test suite Test suite ID Supported test cases 1. CPU frequency measure CPF CPF001.003","title":"Test matrix"},{"location":"variants/talos_2/test-matrix/#test-matrix","text":"","title":"Test matrix"},{"location":"variants/talos_2/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"About"},{"location":"variants/talos_2/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. coreboot base port CBP CBP001.001, CBP002.001, CBP004.001 2. Heads bootloader support HDS HDS001.001, HDS001.002 3. Device Tree DVT DVT001.001, DVT002.001","title":"Module: Dasharo compatibility"},{"location":"variants/talos_2/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM TPM001.001 and TPM002.001","title":"Module: Dasharo security"},{"location":"variants/talos_2/test-matrix/#module-dasharo-performance","text":"No. Supported test suite Test suite ID Supported test cases 1. CPU frequency measure CPF CPF001.003","title":"Module: Dasharo performance"},{"location":"variants/talos_2/tpm-support/","text":"TPM connections and support The following documentation contains most important information about TPM 1.2 module dedicated to the Talos II mainboard. Connecting TPM to the Talos mainboard To properly connect TPM to the Talos II mainboard reproduce the following steps: Turn off the platform by using OpenBMC . Disconnect mainboard from the mains. Based on the documentation find TPM connector on the mainboard. Mount TPM module as shown in the graphics below: Connect mainboard to the mains. Additional information, i. e. TPM header pinout, might be found in the mainboard documentation . TPM module testing Turn on the platform and log into it by using obmc-console-client or KVM . Boot into Heads. Select the Exit to recovery shell option using the arrow keys and Enter. Execute the following command: cbmem -L Output of the above-described command should contains information about TPM logs. Example output: TPM2 log: Specification: 2 .00 Platform class: PC Client No vendor information provided TPM2 log entry 1 : PCR: 2 Event type: Action Digests: SHA1: f78a530fb5a70afcffdc86a98529abd24a90bac9 Event data: FMAP: FMAP TPM2 log entry 2 : PCR: 2 Event type: Action Digests: SHA1: 369155e6eab3b0a874140e591a4c0e992268b4b9 Event data: FMAP: BOOTBLOCK TPM2 log entry 3 : PCR: 2 Event type: Action Digests: SHA1: 5e785c080264aa6e169f70c80ac40b556066292b Event data: FMAP: COREBOOT CBFS: fallback/romstage TPM2 log entry 4 : PCR: 2 Event type: Action Digests: SHA1: ba2a5af955811fbac58a5198545539596eb38c3e Event data: FMAP: COREBOOT CBFS: fallback/ramstage TPM2 log entry 5 : PCR: 2 Event type: Action Digests: SHA1: ba35d4ce29d7b633b5644e2a3206c6069cf7f24d Event data: FMAP: COREBOOT CBFS: fallback/payload TPM2 log entry 6 : PCR: 2 Event type: Action Digests: SHA1: 47b49026133377e05193f8440c9a7cad239e883c Event data: FMAP: COREBOOT CBFS: 1 -cpu.dtb TPM2 log entry 7 : PCR: 3 Event type: Action Digests: SHA256: 6e7b06693452d997ac534e823b1ea79e5bb8ed19ba8a7af878abf10199c3d515 SHA1: 6e7b06693452d997ac534e823b1ea79e5bb8ed19 Event data: VERSION TPM2 log entry 8 : PCR: 2 Event type: Action Digests: SHA256: de73053377e1ae5ba5d2b637a4f5bfaeb410137722f11ef135e7a1be524e3092 SHA1: de73053377e1ae5ba5d2b637a4f5bfaeb4101377 Event data: IMA_CATALOG TPM2 log entry 9 : PCR: 4 Event type: Action Digests: SHA256: cd32830f83a4f74b75d7feac6c03bd3ad8d553f54a8cac4b4b5a4b175ccbce3e SHA1: cd32830f83a4f74b75d7feac6c03bd3ad8d553f5 Event data: BOOTKERNEL Additional information The Module is available at the official 3mdeb store . You can also buy the product by mailing us at: shopping@3mdeb.com .","title":"TPM connection and support"},{"location":"variants/talos_2/tpm-support/#tpm-connections-and-support","text":"The following documentation contains most important information about TPM 1.2 module dedicated to the Talos II mainboard.","title":"TPM connections and support"},{"location":"variants/talos_2/tpm-support/#connecting-tpm-to-the-talos-mainboard","text":"To properly connect TPM to the Talos II mainboard reproduce the following steps: Turn off the platform by using OpenBMC . Disconnect mainboard from the mains. Based on the documentation find TPM connector on the mainboard. Mount TPM module as shown in the graphics below: Connect mainboard to the mains. Additional information, i. e. TPM header pinout, might be found in the mainboard documentation .","title":"Connecting TPM to the Talos mainboard"},{"location":"variants/talos_2/tpm-support/#tpm-module-testing","text":"Turn on the platform and log into it by using obmc-console-client or KVM . Boot into Heads. Select the Exit to recovery shell option using the arrow keys and Enter. Execute the following command: cbmem -L Output of the above-described command should contains information about TPM logs. Example output: TPM2 log: Specification: 2 .00 Platform class: PC Client No vendor information provided TPM2 log entry 1 : PCR: 2 Event type: Action Digests: SHA1: f78a530fb5a70afcffdc86a98529abd24a90bac9 Event data: FMAP: FMAP TPM2 log entry 2 : PCR: 2 Event type: Action Digests: SHA1: 369155e6eab3b0a874140e591a4c0e992268b4b9 Event data: FMAP: BOOTBLOCK TPM2 log entry 3 : PCR: 2 Event type: Action Digests: SHA1: 5e785c080264aa6e169f70c80ac40b556066292b Event data: FMAP: COREBOOT CBFS: fallback/romstage TPM2 log entry 4 : PCR: 2 Event type: Action Digests: SHA1: ba2a5af955811fbac58a5198545539596eb38c3e Event data: FMAP: COREBOOT CBFS: fallback/ramstage TPM2 log entry 5 : PCR: 2 Event type: Action Digests: SHA1: ba35d4ce29d7b633b5644e2a3206c6069cf7f24d Event data: FMAP: COREBOOT CBFS: fallback/payload TPM2 log entry 6 : PCR: 2 Event type: Action Digests: SHA1: 47b49026133377e05193f8440c9a7cad239e883c Event data: FMAP: COREBOOT CBFS: 1 -cpu.dtb TPM2 log entry 7 : PCR: 3 Event type: Action Digests: SHA256: 6e7b06693452d997ac534e823b1ea79e5bb8ed19ba8a7af878abf10199c3d515 SHA1: 6e7b06693452d997ac534e823b1ea79e5bb8ed19 Event data: VERSION TPM2 log entry 8 : PCR: 2 Event type: Action Digests: SHA256: de73053377e1ae5ba5d2b637a4f5bfaeb410137722f11ef135e7a1be524e3092 SHA1: de73053377e1ae5ba5d2b637a4f5bfaeb4101377 Event data: IMA_CATALOG TPM2 log entry 9 : PCR: 4 Event type: Action Digests: SHA256: cd32830f83a4f74b75d7feac6c03bd3ad8d553f54a8cac4b4b5a4b175ccbce3e SHA1: cd32830f83a4f74b75d7feac6c03bd3ad8d553f5 Event data: BOOTKERNEL","title":"TPM module testing"},{"location":"variants/talos_2/tpm-support/#additional-information","text":"The Module is available at the official 3mdeb store . You can also buy the product by mailing us at: shopping@3mdeb.com .","title":"Additional information"},{"location":"variants/tuxedo_ibs15/building/","text":"Dasharo for Tuxedo IBS15 Gen6 - Building manual Intro This documents describes the procedure for compiling coreboot for Tuxedo IBS15. Requirements Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git Procedure The easiest way to build coreboot is to use the official Docker image. Obtain the image: docker pull coreboot/coreboot-sdk:0ad5fbd48d Obtain coreboot source code for Tuxedo IBS15: git clone https://github.com/Dasharo/coreboot.git Navigate to the source code directory and checkout to the desired revision: Replace the REVISION with one of the: - tuxedo_ibs15/release for the latest released version - tuxedo_ibs15/vVERSION (e.g. v1.0.0 ) for the given release cd coreboot git checkout REVISION git submodule update --init --recursive --checkout ./build.sh build The resulting coreboot image will be placed in artifacts/dasharo_tuxedo_ibs15_VERSION.rom . Warning: Do not run ./build.sh as root. This command uses docker and should be executed as your current user. If you're having trouble running build.sh on your user account, follow the Docker instructions outlined in Requirements .","title":"Building manual"},{"location":"variants/tuxedo_ibs15/building/#dasharo-for-tuxedo-ibs15-gen6-building-manual","text":"","title":"Dasharo for Tuxedo IBS15 Gen6 - Building manual"},{"location":"variants/tuxedo_ibs15/building/#intro","text":"This documents describes the procedure for compiling coreboot for Tuxedo IBS15.","title":"Intro"},{"location":"variants/tuxedo_ibs15/building/#requirements","text":"Docker follow Install Docker Engine on Ubuntu follow Post-installation steps for Linux Git","title":"Requirements"},{"location":"variants/tuxedo_ibs15/building/#procedure","text":"The easiest way to build coreboot is to use the official Docker image. Obtain the image: docker pull coreboot/coreboot-sdk:0ad5fbd48d Obtain coreboot source code for Tuxedo IBS15: git clone https://github.com/Dasharo/coreboot.git Navigate to the source code directory and checkout to the desired revision: Replace the REVISION with one of the: - tuxedo_ibs15/release for the latest released version - tuxedo_ibs15/vVERSION (e.g. v1.0.0 ) for the given release cd coreboot git checkout REVISION git submodule update --init --recursive --checkout ./build.sh build The resulting coreboot image will be placed in artifacts/dasharo_tuxedo_ibs15_VERSION.rom . Warning: Do not run ./build.sh as root. This command uses docker and should be executed as your current user. If you're having trouble running build.sh on your user account, follow the Docker instructions outlined in Requirements .","title":"Procedure"},{"location":"variants/tuxedo_ibs15/hardware-matrix/","text":"Hardware configuration matrix - Tuxedo IBS15 Introduction This document describes the hardware configurations used for validation of the coreboot port on the Tuxedo IBS15 laptop. IBS15 #1 Component Description CPU Intel(R) Core(TM) i5-1135G7 Internal Cooling RAM Slot 1: KVR29S21S6/8 Slot 2: KVR29S21S6/4 SSD 1. Samsung 980 PRO NVMe 250 GB 2. Samsung 860 EVO SATA M.2 250 GB Flash memory GigaDevice 25B127DSIG 16 MB Network Local network wired connection Internal devices 1. 1920x1080 15 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Fingerprint scanner 5. Camera 6. Audio subsystem 7. Intel Wi-Fi 6 AX201 wireless card Attached devices 1. SanDisk Ultra USB 3.0 64 GB 2. SanDisk Ultra Flair USB 3.0 16 GB 3. Kingston DataTraveler 3.1Gen1 16 GB 4. SanDisk Ultra microSD HC I 16 GB + SD Adapter 5. DELL KB216 USB Keyboard 6. 4-port USB Type-C Hub Pro 7. HDMI 1920x1080p Display 8. Sony MDR-EX15AP headset Power Supply Chicony 65 W Power Control N/A Remote Testing Environment OpenSSH_8.2p1 OpenSSL 1.1.1f IBS15 #2 Component Description CPU Intel(R) Core(TM) i5-11300H Internal Cooling RAM Slot 1: KVR29S21S6/8 Slot 2: KVR29S21S6/4 SSD Toshiba KXG50NV256G NVMe 256GB Flash memory GigaDevice 25B127DSIG 16 MB Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Fingerprint scanner 5. Camera 6. Audio subsystem 7. Intel Wi-Fi 6 AX201 wireless card Attached devices 1. SanDisk Ultra USB 3.0 64 GB 2. SanDisk Ultra Flair USB 3.0 16 GB 3. Kingston DataTraveler 3.1Gen1 16 GB 4. SanDisk Ultra microSD HC I 16 GB + SD Adapter 5. DELL KB216 USB Keyboard 6. 4-port USB Type-C Hub Pro 7. HDMI 1920x1080p Display 8. Sony MDR-EX15AP headset Power Supply Chicony 65 W Power Control N/A Remote Testing Environment OpenSSH_8.2p1 OpenSSL 1.1.1f","title":"Hardware Configuration Matrix"},{"location":"variants/tuxedo_ibs15/hardware-matrix/#hardware-configuration-matrix-tuxedo-ibs15","text":"","title":"Hardware configuration matrix - Tuxedo IBS15"},{"location":"variants/tuxedo_ibs15/hardware-matrix/#introduction","text":"This document describes the hardware configurations used for validation of the coreboot port on the Tuxedo IBS15 laptop.","title":"Introduction"},{"location":"variants/tuxedo_ibs15/hardware-matrix/#ibs15-1","text":"Component Description CPU Intel(R) Core(TM) i5-1135G7 Internal Cooling RAM Slot 1: KVR29S21S6/8 Slot 2: KVR29S21S6/4 SSD 1. Samsung 980 PRO NVMe 250 GB 2. Samsung 860 EVO SATA M.2 250 GB Flash memory GigaDevice 25B127DSIG 16 MB Network Local network wired connection Internal devices 1. 1920x1080 15 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Fingerprint scanner 5. Camera 6. Audio subsystem 7. Intel Wi-Fi 6 AX201 wireless card Attached devices 1. SanDisk Ultra USB 3.0 64 GB 2. SanDisk Ultra Flair USB 3.0 16 GB 3. Kingston DataTraveler 3.1Gen1 16 GB 4. SanDisk Ultra microSD HC I 16 GB + SD Adapter 5. DELL KB216 USB Keyboard 6. 4-port USB Type-C Hub Pro 7. HDMI 1920x1080p Display 8. Sony MDR-EX15AP headset Power Supply Chicony 65 W Power Control N/A Remote Testing Environment OpenSSH_8.2p1 OpenSSL 1.1.1f","title":"IBS15 #1"},{"location":"variants/tuxedo_ibs15/hardware-matrix/#ibs15-2","text":"Component Description CPU Intel(R) Core(TM) i5-11300H Internal Cooling RAM Slot 1: KVR29S21S6/8 Slot 2: KVR29S21S6/4 SSD Toshiba KXG50NV256G NVMe 256GB Flash memory GigaDevice 25B127DSIG 16 MB Network Local network wired connection Internal devices 1. 1920x1080 14 inch screen 2. Internal keyboard with LED backlight 3. Touchpad 4. Fingerprint scanner 5. Camera 6. Audio subsystem 7. Intel Wi-Fi 6 AX201 wireless card Attached devices 1. SanDisk Ultra USB 3.0 64 GB 2. SanDisk Ultra Flair USB 3.0 16 GB 3. Kingston DataTraveler 3.1Gen1 16 GB 4. SanDisk Ultra microSD HC I 16 GB + SD Adapter 5. DELL KB216 USB Keyboard 6. 4-port USB Type-C Hub Pro 7. HDMI 1920x1080p Display 8. Sony MDR-EX15AP headset Power Supply Chicony 65 W Power Control N/A Remote Testing Environment OpenSSH_8.2p1 OpenSSL 1.1.1f","title":"IBS15 #2"},{"location":"variants/tuxedo_ibs15/installation/","text":"Dasharo for Tuxedo IBS15 Gen6 - Installation manual Intro Flashing coreboot can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 20.04. Build flashrom Currently, the latest flashrom release lacks support for Tiger Lake-U internal flashing. Because of this, we need to build flashrom from source. Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://review.coreboot.org/flashrom.git cd flashrom Build flashrom: make sudo make install Reading flash contents To read from the flash and save them to a file ( dump.rom ), execute the following command: flashrom -p internal -r dump.rom Installing Dasharo Initial Installation During the initial installation of Dasharo, you will need the supported Intel ME version (and configuration) to be present in the Dasharo firmware image. If you already have a Dasharo compatible ME firmware installed, then proceed with Updating Dasharo instructions . Publicly released binaries do not contain ME binary. If you need a Dasharo compatible Intel ME update for your device, contact us via already established commercial support channel. When flashing binaries with ME binary included, flashing of the whole chip is required. Follow the steps below: Power off the laptop While holding the Fn+M keys, power on the laptop - This unlocks the ME and allows for it to be overwritten. The fans will spin at 100% speed at this point Execute the following command, replacing [path] with the path to the full firmware image (containing ME firmware and flash descriptor) you want to flash: flashrom -p internal -w [ full_image ] Reboot the laptop The laptop will boot into Dasharo. After Dasharo has booted, it is safe to shut down the laptop to silence the fans Note: if you shut down the laptop instead of rebooting, it may be necessary to hold Fn+M for it to boot the first time after flashing. Updating Dasharo If Dasharo is currently installed, only the BIOS region of the flash needs to be updated. Flash it using the following command: flashrom -p internal -w [ path ] --ifd -i bios","title":"Installation manual"},{"location":"variants/tuxedo_ibs15/installation/#dasharo-for-tuxedo-ibs15-gen6-installation-manual","text":"","title":"Dasharo for Tuxedo IBS15 Gen6 - Installation manual"},{"location":"variants/tuxedo_ibs15/installation/#intro","text":"Flashing coreboot can be done from Linux using flashrom with the internal programmer. This document describes the process of building, installing and running flashrom on Ubuntu 20.04.","title":"Intro"},{"location":"variants/tuxedo_ibs15/installation/#build-flashrom","text":"Currently, the latest flashrom release lacks support for Tiger Lake-U internal flashing. Because of this, we need to build flashrom from source. Install build dependencies: apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson Obtain source code: git clone https://review.coreboot.org/flashrom.git cd flashrom Build flashrom: make sudo make install","title":"Build flashrom"},{"location":"variants/tuxedo_ibs15/installation/#reading-flash-contents","text":"To read from the flash and save them to a file ( dump.rom ), execute the following command: flashrom -p internal -r dump.rom","title":"Reading flash contents"},{"location":"variants/tuxedo_ibs15/installation/#installing-dasharo","text":"","title":"Installing Dasharo"},{"location":"variants/tuxedo_ibs15/post_install/","text":"Post-installation setup This document contains extra steps to perform after installing Dasharo in order to enable full functionality. Touchpad hotkey enablement (Linux) The touchpad hotkey needs extra setup to function correctly under Linux. To enable the touchpad hotkey to work under Linux, follow the steps below: Create a file /etc/udev/hwdb.d/60-keyboard.hwdb with the following contents: evdev:atkbd:dmi:bvn*:bvr*:svnNotebook:pnNS50MU:* KEYBOARD_KEY_f7 = 191 KEYBOARD_KEY_f8 = 191 Execute the following commands: sudo systemd-hwdb update sudo udevadm trigger After executing these steps, it should be possible to enable and disable the touchpad using the touchpad hotkey (Fn+F1) on the keyboard when using GNOME.","title":"Post-installation setup"},{"location":"variants/tuxedo_ibs15/post_install/#post-installation-setup","text":"This document contains extra steps to perform after installing Dasharo in order to enable full functionality.","title":"Post-installation setup"},{"location":"variants/tuxedo_ibs15/post_install/#touchpad-hotkey-enablement-linux","text":"The touchpad hotkey needs extra setup to function correctly under Linux. To enable the touchpad hotkey to work under Linux, follow the steps below: Create a file /etc/udev/hwdb.d/60-keyboard.hwdb with the following contents: evdev:atkbd:dmi:bvn*:bvr*:svnNotebook:pnNS50MU:* KEYBOARD_KEY_f7 = 191 KEYBOARD_KEY_f8 = 191 Execute the following commands: sudo systemd-hwdb update sudo udevadm trigger After executing these steps, it should be possible to enable and disable the touchpad using the touchpad hotkey (Fn+F1) on the keyboard when using GNOME.","title":"Touchpad hotkey enablement (Linux)"},{"location":"variants/tuxedo_ibs15/releases/","text":"Tuxedo IBS15 Dasharo Release Notes Following Release Notes describe status of Open Source Firmware development for Tuxedo IBS15 For details about our release process please read Dasharo Standard Release Process . Subscribe to Tuxedo IBS15 Dasharo Release Newsletter Test results for this platform can be found here . v1.0.0 - 2022-03-15 Added Support for Tuxedo InfinityBook S 15 Gen6 Support for EC firmware 1.07.02 Support for Intel ME version 15.0.30.1776 UEFI Boot Support Configurable boot order Configurable boot options UEFI Secure Boot support Tuxedo boot logo Known issues The touchpad ON/OFF switch Fn key is not functional Binaries tuxedo_ibs15_v1.0.0.rom sha256 sha256.sig SBOM (Software Bill of Materials) coreboot based on 4.16 revision cf13d6c7 tianocore based on 9522071f7497a1a0b1077d2b0d5fcc97a126cfd0 revision 7f90b9cd","title":"Releases"},{"location":"variants/tuxedo_ibs15/releases/#tuxedo-ibs15-dasharo-release-notes","text":"Following Release Notes describe status of Open Source Firmware development for Tuxedo IBS15 For details about our release process please read Dasharo Standard Release Process . Subscribe to Tuxedo IBS15 Dasharo Release Newsletter Test results for this platform can be found here .","title":"Tuxedo IBS15 Dasharo Release Notes"},{"location":"variants/tuxedo_ibs15/releases/#v100-2022-03-15","text":"","title":"v1.0.0 - 2022-03-15"},{"location":"variants/tuxedo_ibs15/test-matrix/","text":"Test matrix - Tuxedo - Tuxedo IBS15 About The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary. Module: Dasharo compatibility No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports and LCD support DSP DSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002, DSP002.003 4. Embedded Controller and Super I/O initialization ECR Without ECR021.xxx - ECR024.xxx 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB All 9. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 10. UEFI Shell USH All 11. Windows booting WBT WBT001.001 12. Audio subsystem AUD All 13. USB-C support UTC All 14. Network boot PXE PXE007.001 15. M.2 WiFi/Bluetooth WLE All 16. SD card support SDC All 17. USB Camera verification CAM All 19. Fan speed measure FAN FAN001.001 20. SMBIOS DMI DMI002.001, DMI003.001, DMI005.001, DMI006.001, DMI007.001, DMI008.001 Module: Dasharo security No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO VBO006.002, VBO007.002, 3. Measured Boot support MBO All 4. Secure Boot support SBO Without SBO006.001, SBO007.001 and SBO008.001","title":"Test matrix"},{"location":"variants/tuxedo_ibs15/test-matrix/#test-matrix-tuxedo-tuxedo-ibs15","text":"","title":"Test matrix - Tuxedo - Tuxedo IBS15"},{"location":"variants/tuxedo_ibs15/test-matrix/#about","text":"The test matrix is used to determine the scope of tests which the DUT is subjected from before the release of the new binary.","title":"About"},{"location":"variants/tuxedo_ibs15/test-matrix/#module-dasharo-compatibility","text":"No. Supported test suite Test suite ID Supported test cases 1. Memory HCL HCL All 2. UEFI compatible interface EFI All 3. Display ports and LCD support DSP DSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002, DSP002.003 4. Embedded Controller and Super I/O initialization ECR Without ECR021.xxx - ECR024.xxx 5. NVMe support NVM All 6. Custom logo CLG All 7. Custom boot menu key CBK All 8. USB HID and MSC Support USB All 9. Debian Stable and Ubuntu LTS support LBT LBT003.001, LBT003.002, LBT004.001, LBT004.002 10. UEFI Shell USH All 11. Windows booting WBT WBT001.001 12. Audio subsystem AUD All 13. USB-C support UTC All 14. Network boot PXE PXE007.001 15. M.2 WiFi/Bluetooth WLE All 16. SD card support SDC All 17. USB Camera verification CAM All 19. Fan speed measure FAN FAN001.001 20. SMBIOS DMI DMI002.001, DMI003.001, DMI005.001, DMI006.001, DMI007.001, DMI008.001","title":"Module: Dasharo compatibility"},{"location":"variants/tuxedo_ibs15/test-matrix/#module-dasharo-security","text":"No. Supported test suite Test suite ID Supported test cases 1. TPM Support TPM Without TPM001.001 and TPM002.001 2. Verified Boot support VBO VBO006.002, VBO007.002, 3. Measured Boot support MBO All 4. Secure Boot support SBO Without SBO006.001, SBO007.001 and SBO008.001","title":"Module: Dasharo security"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000000..1fd41108bdb --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,1423 @@ + + + + https://docs.dasharo.com/ + 2023-07-27 + daily + + + https://docs.dasharo.com/glossary/ + 2023-07-27 + daily + + + https://docs.dasharo.com/newcomers/ + 2023-07-27 + daily + + + https://docs.dasharo.com/ways-you-can-help-us/ + 2023-07-27 + daily + + + https://docs.dasharo.com/common-coreboot-docs/checkbox/ + 2023-07-27 + daily + + + https://docs.dasharo.com/common-coreboot-docs/dumping_logs/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dasharo-menu-docs/boot-maintenance-mgr/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dasharo-menu-docs/dasharo-system-features/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dasharo-menu-docs/device-manager/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dasharo-menu-docs/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dasharo-tools-suite/documentation/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dasharo-tools-suite/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dasharo-tools-suite/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dev-proc/documentation-guidelines/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dev-proc/feature-bug-fix-dev-process/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dev-proc/hcl-maintainer/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dev-proc/smbios-rules/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dev-proc/source-code-structure/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dev-proc/standard-release-process/ + 2023-07-27 + daily + + + https://docs.dasharo.com/dev-proc/versioning/ + 2023-07-27 + daily + + + https://docs.dasharo.com/ecosystem/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/ecosystem/roadmap/ + 2023-07-27 + daily + + + https://docs.dasharo.com/guides/dasharo-reviewers-guide/ + 2023-07-27 + daily + + + https://docs.dasharo.com/guides/logo-customization/ + 2023-07-27 + daily + + + https://docs.dasharo.com/guides/vboot-signing/ + 2023-07-27 + daily + + + https://docs.dasharo.com/osf-trivia-list/dasharo/ + 2023-07-27 + daily + + + https://docs.dasharo.com/osf-trivia-list/deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/osf-trivia-list/dts/ + 2023-07-27 + daily + + + https://docs.dasharo.com/osf-trivia-list/introduction/ + 2023-07-27 + daily + + + https://docs.dasharo.com/osf-trivia-list/me/ + 2023-07-27 + daily + + + https://docs.dasharo.com/osf-trolling-list/build_process/ + 2023-07-27 + daily + + + https://docs.dasharo.com/osf-trolling-list/jsm_documentation/ + 2023-07-27 + daily + + + https://docs.dasharo.com/osf-trolling-list/trusted_computing/ + 2023-07-27 + daily + + + https://docs.dasharo.com/projects/trenchboot-aem-v2/ + 2023-07-27 + daily + + + https://docs.dasharo.com/projects/trenchboot-aem/ + 2023-07-27 + daily + + + https://docs.dasharo.com/quality-principles/introduction/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/msi-z690/laboratory-assembly-guide/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/msi-z690/presale-assembly-and-validation/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/msi-z790/laboratory-assembly-guide/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/muxpi/basic-validation/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/muxpi/theory-of-operations/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/pikvm/assembly-and-validation/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/rte/introduction/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/rte/revision-history/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/rte/v1.1.0/flashing-guide/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/rte/v1.1.0/quick-start-guide/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/rte/v1.1.0/reference-os/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/rte/v1.1.0/serial-port-connection-guide/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/rte/v1.1.0/specification/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/sd-wire/getting-started/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/sd-wire/specification/ + 2023-07-27 + daily + + + https://docs.dasharo.com/transparent-validation/sd-wire/usage-validation/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified/clevo/post-install/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified/novacustom/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified/novacustom/fan-profiles/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified/novacustom/firmware-update/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified/novacustom/fn-lock-hotkey/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified/novacustom/fwupd-usage/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified/novacustom/initial-deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified/novacustom/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified/novacustom/recovery/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified/novacustom/rgb-keyboard/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/generic-test-setup/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/301-memory-hcl/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/303-custom-boot-menu-key/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/304-custom-logo/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/307-freebsd-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/309-qubesos-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/30A-custom-network-boot-entries/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/30M-uefi-compatible-interface/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/30P-uefi-shell/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/310-fedora-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/312-nvme-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/315-network-boot/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/316-sdcard-reader/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/317-usb-camera/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31A-windows-booting/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31H-usb-type-c/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31I-nvme-switching/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31J-sleep-mode/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31L-smbios/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31M-emmc-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31N-usb-boot/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31O-usb-detect/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31P-flash-write-protection/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31R-pcie-ports/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31S-sata-led-and-pc-speaker-error-indication/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31T-cpu-status/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31V-petitboot-payload-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/31W-device-tree/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/320-fwupd-firmware-update/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/325-custom-boot-order/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/326b-firmware-building-locally/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/327-embedded_controller_flashing/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/328-logo-customization-functionality/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/341-pfSense-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/342-OPNsense-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/343-super-I-O-initialization-on-QubesOS/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/344-power-operations/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/345-display-resolution/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/346-SATA-hotplug-detection/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/347-sign-of-life/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/348-proxmox-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/349-ubuntu-server-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/357-bios-menu-function-keys/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/358-suspend-mechanism-switching-S0ix-S3/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/S30-fan-speed/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-compatibility/S31-coreboot-fan-control/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/400-coreboot-boot-measure/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/401-cpu-temperature/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/402-cpu-frequency/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/403-device-boot-measure/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/404-platform-stability/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/405-fan-control-measure/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/406-custom-fan-curve/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/407-ubuntu-booting-performance-test/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/408-debian-booting-performance-test/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/409-freebsd-booting-performance-test/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/410-proxmox-booting-performance-test/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/411-ubuntu-server-booting-performance-test/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/412-opnsense-serial-booting-performance-test/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/413-opnsense-vga-booting-performance-test/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/414-pfsense-serial-booting-performance-test/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/415-pfsense-vga-booting-performance-test/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-performance/416-windows-booting-performance-test/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/200-tpm-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/201-verified-boot/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/203-measured-boot/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/206-secure-boot/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/207-boot-guard-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/20F-me-neuter/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/20J-bios-lock-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/20L-early-boot-dma-protection/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/20O-SMM-bios-write-protection/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/20P-boot-menu/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/20R-uefi-setup-password/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/20S-usb-stack/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-security/20T-network-boot/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-stability/C02-m2-wi-fi/ + 2023-07-27 + daily + + + https://docs.dasharo.com/unified-test-documentation/dasharo-stability/C03-nvme-detection/ + 2023-07-27 + daily + + + https://docs.dasharo.com/value-prop/compatibility/ + 2023-07-27 + daily + + + https://docs.dasharo.com/value-prop/marketing/ + 2023-07-27 + daily + + + https://docs.dasharo.com/value-prop/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/value-prop/security/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/hardware-compatibility-list/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/fan-control/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/firmware-update/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/initial-deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/recovery/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/setup/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/spi-wp/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/asus_kgpe_d16/tpm-mboot/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/dell_optiplex/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/dell_optiplex/faq/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/dell_optiplex/firmware-update/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/dell_optiplex/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/dell_optiplex/initial-deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/dell_optiplex/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/dell_optiplex/recovery/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/dell_optiplex/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/dell_optiplex/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/community-test-results/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/development/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/faq/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/firmware-update/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/gpu-hcl/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/hcl/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/initial-deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/memory-hcl/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/openness_analysis/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/recovery/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z690/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z790/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/msi_z790/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_ns5x_adl/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_ns5x_adl/post_install/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_ns5x_adl/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_ns5x_adl/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_ns5x_tgl/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_ns5x_tgl/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_ns5x_tgl/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_nv4x_adl/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_nv4x_adl/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_nv4x_adl/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_nv4x_tgl/compatibility-check-results-ubuntu/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_nv4x_tgl/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_nv4x_tgl/lvfs_report/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_nv4x_tgl/openness_analysis/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_nv4x_tgl/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/novacustom_nv4x_tgl/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/pc_engines/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/pc_engines/post-eol-fw-announcement/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_fw6/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_fw6/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_fw6/installation-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_fw6/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_fw6/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_fw6/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_ptx01/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_ptx01/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2410/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2410/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2410/initial-deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2410/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2410/recovery/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2410/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2410/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2420/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2420/firmware-update/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2420/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2420/initial-deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2420/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2420/recovery/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2420/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp2420/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp46xx/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp46xx/firmware-update/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp46xx/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp46xx/initial-deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp46xx/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp46xx/recovery/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp46xx/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/protectli_vp46xx/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/qemu_q35/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/qemu_q35/development/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/qemu_q35/firmware-update/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/qemu_q35/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/qemu_q35/initial-deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/qemu_q35/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/qemu_q35/recovery/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/qemu_q35/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/qemu_q35/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/supermicro_x11_lga1151_series/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/supermicro_x11_lga1151_series/faq/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/supermicro_x11_lga1151_series/firmware-update/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/supermicro_x11_lga1151_series/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/supermicro_x11_lga1151_series/initial-deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/supermicro_x11_lga1151_series/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/supermicro_x11_lga1151_series/recovery/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/supermicro_x11_lga1151_series/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/supermicro_x11_lga1151_series/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/talos_2/building-manual/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/talos_2/conferences/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/talos_2/firmware-update/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/talos_2/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/talos_2/initial-deployment/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/talos_2/overview/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/talos_2/recovery/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/talos_2/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/talos_2/test-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/talos_2/tpm-support/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/tuxedo_ibs15/building/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/tuxedo_ibs15/hardware-matrix/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/tuxedo_ibs15/installation/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/tuxedo_ibs15/post_install/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/tuxedo_ibs15/releases/ + 2023-07-27 + daily + + + https://docs.dasharo.com/variants/tuxedo_ibs15/test-matrix/ + 2023-07-27 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 00000000000..49245f2c4cd Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/stylesheets/extra.css b/stylesheets/extra.css new file mode 100644 index 00000000000..0bc212f8351 --- /dev/null +++ b/stylesheets/extra.css @@ -0,0 +1,18 @@ +:root { + --md-primary-fg-color: #29363b; + --md-primary-fg-color--light: #808080; + --md-primary-fg-color--dark: #29363b; + --md-accent-fg-color: hsla(117, 66%, 51%, 0.7); + --md-text-font-family: "Oswald",sans-serif; +} + +:root > * { + --md-typeset-a-color: #38d430; +} + +.center { + display: block; + margin-left: auto; + margin-right: auto; + width: 95%; +} diff --git a/transparent-validation/msi-z690/images/cpu-cooler.jpg b/transparent-validation/msi-z690/images/cpu-cooler.jpg new file mode 100644 index 00000000000..33715a807c7 Binary files /dev/null and b/transparent-validation/msi-z690/images/cpu-cooler.jpg differ diff --git a/transparent-validation/msi-z690/images/cpu.jpg b/transparent-validation/msi-z690/images/cpu.jpg new file mode 100644 index 00000000000..d97b1ecdfbd Binary files /dev/null and b/transparent-validation/msi-z690/images/cpu.jpg differ diff --git a/transparent-validation/msi-z690/images/enclosure.jpg b/transparent-validation/msi-z690/images/enclosure.jpg new file mode 100644 index 00000000000..71cf1e6e4c5 Binary files /dev/null and b/transparent-validation/msi-z690/images/enclosure.jpg differ diff --git a/transparent-validation/msi-z690/images/female_female_cables.jpg b/transparent-validation/msi-z690/images/female_female_cables.jpg new file mode 100644 index 00000000000..cf5719caefa Binary files /dev/null and b/transparent-validation/msi-z690/images/female_female_cables.jpg differ diff --git a/transparent-validation/msi-z690/images/memory.jpg b/transparent-validation/msi-z690/images/memory.jpg new file mode 100644 index 00000000000..97d277bc284 Binary files /dev/null and b/transparent-validation/msi-z690/images/memory.jpg differ diff --git a/transparent-validation/msi-z690/images/motherboard.jpg b/transparent-validation/msi-z690/images/motherboard.jpg new file mode 100644 index 00000000000..7d56cce4ae2 Binary files /dev/null and b/transparent-validation/msi-z690/images/motherboard.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_all_connections.jpeg b/transparent-validation/msi-z690/images/msi_z690_all_connections.jpeg new file mode 100644 index 00000000000..0b88694dd61 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_all_connections.jpeg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_connected_rte.jpg b/transparent-validation/msi-z690/images/msi_z690_connected_rte.jpg new file mode 100644 index 00000000000..d3eeb0f40ba Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_connected_rte.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_RTE.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_RTE.jpg new file mode 100644 index 00000000000..f269c249880 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_RTE.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_SPI_RTE.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_SPI_RTE.jpg new file mode 100644 index 00000000000..5055cb477ce Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_SPI_RTE.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_SPI_RTE_2.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_SPI_RTE_2.jpg new file mode 100644 index 00000000000..496dee393c1 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_SPI_RTE_2.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_chip_connections.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_chip_connections.jpg new file mode 100644 index 00000000000..c561dc07768 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_chip_connections.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_chip_ground_RTE.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_chip_ground_RTE.jpg new file mode 100644 index 00000000000..7e6f1b5c3f7 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_chip_ground_RTE.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_chip_power_RTE.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_chip_power_RTE.jpg new file mode 100644 index 00000000000..38432246873 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_chip_power_RTE.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_chip_power_connections.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_chip_power_connections.jpg new file mode 100644 index 00000000000..1de2fdfc2bd Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_chip_power_connections.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_chip_weld.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_chip_weld.jpg new file mode 100644 index 00000000000..b6767dfa461 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_chip_weld.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_complete.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_complete.jpg new file mode 100644 index 00000000000..03455e742f6 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_complete.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_serial_RTE.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_serial_RTE.jpg new file mode 100644 index 00000000000..5d00f159cc5 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_serial_RTE.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_lab_serial_panel.jpg b/transparent-validation/msi-z690/images/msi_z690_lab_serial_panel.jpg new file mode 100644 index 00000000000..96c9ec4e901 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_lab_serial_panel.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_coller.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_coller.jpg new file mode 100644 index 00000000000..f45dfdbef6b Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_coller.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_coller_items.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_coller_items.jpg new file mode 100644 index 00000000000..416a33649c4 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_coller_items.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_connection_from_inside.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_connection_from_inside.jpg new file mode 100644 index 00000000000..64d235f7113 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_connection_from_inside.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_connection_from_outside.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_connection_from_outside.jpg new file mode 100644 index 00000000000..7946ef8dffb Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_connection_from_outside.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_cpu_1.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_cpu_1.jpg new file mode 100644 index 00000000000..e5c383341f8 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_cpu_1.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_cpu_2.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_cpu_2.jpg new file mode 100644 index 00000000000..25f7cb5327b Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_cpu_2.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_cpu_cooler_connection.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_cpu_cooler_connection.jpg new file mode 100644 index 00000000000..a0067a01c34 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_cpu_cooler_connection.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_enclosure.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_enclosure.jpg new file mode 100644 index 00000000000..1f2b38dfc5b Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_enclosure.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_fan.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_fan.jpg new file mode 100644 index 00000000000..68f693024d9 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_fan.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_front_panel.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_front_panel.jpg new file mode 100644 index 00000000000..b2300775efe Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_front_panel.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_motherboard.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_motherboard.jpg new file mode 100644 index 00000000000..7b38b4a9b67 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_motherboard.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_power_supply.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_power_supply.jpg new file mode 100644 index 00000000000..4b00992b7bd Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_power_supply.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_ram.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_ram.jpg new file mode 100644 index 00000000000..1123fe0a4a1 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_ram.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_rear_panel.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_rear_panel.jpg new file mode 100644 index 00000000000..34f6a3102a6 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_rear_panel.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_slots.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_slots.jpg new file mode 100644 index 00000000000..b78520f6026 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_slots.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_speaker.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_speaker.jpg new file mode 100644 index 00000000000..2fc4faa5ad2 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_speaker.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_storage.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_storage.jpg new file mode 100644 index 00000000000..0f83a9444ad Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_storage.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_montage_thermal_paste.jpg b/transparent-validation/msi-z690/images/msi_z690_montage_thermal_paste.jpg new file mode 100644 index 00000000000..d8dc987f3d0 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_montage_thermal_paste.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_serial_panel.jpg b/transparent-validation/msi-z690/images/msi_z690_serial_panel.jpg new file mode 100644 index 00000000000..593b7210101 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_serial_panel.jpg differ diff --git a/transparent-validation/msi-z690/images/msi_z690_spi.jpeg b/transparent-validation/msi-z690/images/msi_z690_spi.jpeg new file mode 100644 index 00000000000..4d6a43be171 Binary files /dev/null and b/transparent-validation/msi-z690/images/msi_z690_spi.jpeg differ diff --git a/transparent-validation/msi-z690/images/power-supply.jpg b/transparent-validation/msi-z690/images/power-supply.jpg new file mode 100644 index 00000000000..b41a40b1dc0 Binary files /dev/null and b/transparent-validation/msi-z690/images/power-supply.jpg differ diff --git a/transparent-validation/msi-z690/images/reading_power_status.jpg b/transparent-validation/msi-z690/images/reading_power_status.jpg new file mode 100644 index 00000000000..7fccb64315d Binary files /dev/null and b/transparent-validation/msi-z690/images/reading_power_status.jpg differ diff --git a/transparent-validation/msi-z690/images/rte_built.jpg b/transparent-validation/msi-z690/images/rte_built.jpg new file mode 100644 index 00000000000..b49f34cc60c Binary files /dev/null and b/transparent-validation/msi-z690/images/rte_built.jpg differ diff --git a/transparent-validation/msi-z690/images/sonoff-s20-uart.jpg b/transparent-validation/msi-z690/images/sonoff-s20-uart.jpg new file mode 100644 index 00000000000..6c744937c1c Binary files /dev/null and b/transparent-validation/msi-z690/images/sonoff-s20-uart.jpg differ diff --git a/transparent-validation/msi-z690/images/sonoff_connected.jpg b/transparent-validation/msi-z690/images/sonoff_connected.jpg new file mode 100644 index 00000000000..8df4c12e151 Binary files /dev/null and b/transparent-validation/msi-z690/images/sonoff_connected.jpg differ diff --git a/transparent-validation/msi-z690/images/sonoff_disconnected.jpg b/transparent-validation/msi-z690/images/sonoff_disconnected.jpg new file mode 100644 index 00000000000..6f49def3698 Binary files /dev/null and b/transparent-validation/msi-z690/images/sonoff_disconnected.jpg differ diff --git a/transparent-validation/msi-z690/images/sonoff_with_header.jpg b/transparent-validation/msi-z690/images/sonoff_with_header.jpg new file mode 100644 index 00000000000..78802597d10 Binary files /dev/null and b/transparent-validation/msi-z690/images/sonoff_with_header.jpg differ diff --git a/transparent-validation/msi-z690/images/sonoff_without_header.jpg b/transparent-validation/msi-z690/images/sonoff_without_header.jpg new file mode 100644 index 00000000000..2b4169ea0f1 Binary files /dev/null and b/transparent-validation/msi-z690/images/sonoff_without_header.jpg differ diff --git a/transparent-validation/msi-z690/images/storage.jpg b/transparent-validation/msi-z690/images/storage.jpg new file mode 100644 index 00000000000..6c727ac04ee Binary files /dev/null and b/transparent-validation/msi-z690/images/storage.jpg differ diff --git a/transparent-validation/msi-z690/laboratory-assembly-guide/index.html b/transparent-validation/msi-z690/laboratory-assembly-guide/index.html new file mode 100644 index 00000000000..8b58f31b0cd --- /dev/null +++ b/transparent-validation/msi-z690/laboratory-assembly-guide/index.html @@ -0,0 +1,6330 @@ + + + + + + + + + + + + + + + + + + Laboratory stand assembly guide - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Laboratory stand dedicated to MSI PRO Z690-A assembly guide

    +

    Introduction

    +

    This document describes the assembly procedure dedicated to the MSI PRO Z690-A +testing stand.

    +

    Prerequisites

    +

    The below table contains information about all elements which are needed to +create the testing stand.

    +
      +
    • MSI PRO Z690-A platform
    • +
    • RTE v1.1.0
    • +
    • Sonoff S20 type E
    • +
    • 4x standard female-female connection wire 2.54 mm raster
    • +
    • 7x standard female-female connection wire 2.54/2.00 mm raster
    • +
    • USB-UART converter with 4-wire cable
    • +
    • 4-pin header 2.54 mm raster
    • +
    +

    Pre-setup activities

    +

    The following subsections describe the method of preparing all the +components of the laboratory stand.

    +

    MSI PRO Z690-A

    +

    MSI PRO Z690-A platform should be prepared in accordance with the +Motherboard assembly +documentation.

    +

    RTE

    +

    RTE (acronym: Remote Testing Environment) should be prepared in accordance with +Quick start guide documentation dedicated +to the device.

    +

    Sonoff

    +

    The below section of the documentation is based on the +EPSHome documentation

    +
      +
    1. +

      Open the Sonoff case.

      +
    2. +
    3. +

      Check if the headers are soldered to the board. If not - 4 pin header + raster 2.54 mm should be soldered to the board in accordance with the below + images.

      +

      sonoff_without_header

      +

      sonoff_with_header

      +
    4. +
    5. +

      Connect the USB-UART converter to the USB port.

      +

      uart connection

      +
    6. +
    7. +

      Create a Sonoff configuration file. The file extension should be .yaml and + it should contain the device configuration.

      +

      Example configuration:

      +
      esphome:
      +  name: XXXXXX
      +  platform: ESP8266
      +  board: esp01_1m
      +
      +wifi:
      +  ssid: "XXXXXX"
      +  password: "XXXXXX"
      +  # manual_ip:
      +  #   # Set this to the IP of the ESP
      +  #   static_ip: 192.168.4.187
      +  #   # Set this to the IP address of the router. Often ends with .1
      +  #   gateway: 192.168.4.1
      +  #   # The subnet of the network. 255.255.255.0 works for most home networks.
      +  #   subnet: 255.255.255.0
      +  power_save_mode: none
      +
      +
      +  # # Enable fallback hotspot (captive portal) in case wifi connection fails
      +  ap:
      +    ssid: "Sonoff1 Fallback Hotspot"
      +    password: "123456789"
      +
      +
      +captive_portal:
      +
      +# Enable logging
      +logger:
      +
      +# Enable Home Assistant API
      +api:
      +
      +
      +ota:
      +
      +
      +binary_sensor:
      +- platform: gpio
      +  pin:
      +    number: GPIO0
      +    mode: INPUT_PULLUP
      +    inverted: True
      +  name: "Sonoff S20 Button"
      +  on_press:
      +    - switch.toggle: relay
      +- platform: status
      +  name: "Sonoff S20 Status"
      +
      +
      +switch:
      +- platform: gpio
      +  name: "Sonoff S20 Relay"
      +  pin: GPIO12
      +  id: relay
      +
      +output:
      +- platform: esp8266_pwm
      +  id: s20_green_led
      +  pin: GPIO13
      +  inverted: True
      +
      +light:
      +- platform: monochromatic
      +  name: "Sonoff S20 Green LED"
      +  output: s20_green_led
      +
      +web_server:
      +  port: 80
      +  reboot_timeout: 0s
      +
      +
    8. +
    9. +

      Run the docker container in the folder containing created .yaml + configuration file:

      +
      docker run --rm -v "${PWD}":/config --device=/dev/ttyUSB0 -p 6052:6052 -it esphome/esphome
      +
      +
    10. +
    11. +

      Open the browser and type into the web browser the following address:

      +
      http://localhost:6052/
      +
      +
    12. +
    13. +

      Put the device in flash mode. Putting the device in this mode should be done + in accordance with the + documentation.

      +
    14. +
    15. +

      Change the upload method from OTA to /dev/ttyUSB0. After this operation, + the new element with the name specified in esphome:name should be + displayed.

      +
    16. +
    17. +

      Select the option Upload. After clicking, the program should generate + the image, compile it and upload it to the device.

      +
    18. +
    19. +

      After successful upload replug the device to the USB (without the button + pressed) to get out of the flashing mode.

      +
    20. +
    21. +

      Open connection to the device in the PC terminal by typing:

      +
      sudo minicom -D /dev/ttyUSB0 -o -b 115200.
      +
      +
      +

      Note: /dev/ttyUSB0 is example device - check whether USB0 is the +correct one.

      +
      +
    22. +
    23. +

      Check if the device is responsible - whether network connectivity + information is generated.

      +
      +

      Note: The effective range for this device is only a few meters.

      +
      +
    24. +
    25. +

      Based on the minicom logs read the IP address assigned to the device.

      +
    26. +
    +

    Connections

    +

    The following sections describe how to enable all of the following features:

    +
      +
    • serial connection to the platform,
    • +
    • controlling power supply,
    • +
    • enabling basic power actions with the platform (power off/power on/reset),
    • +
    • external flashing with the RTE,
    • +
    • device power status readout.
    • +
    +

    Serial connection

    +
      +
    1. +

      Attach the jumpers in the RTE J16 header to enable header J18:

      + + + + + + + + + + + + + +
      Jumper position (TX)Jumper position (RX)
      EXT + COMEXT + COM
      +
    2. +
    3. +

      Connect the RTE J18 header to the platform JBD1 header as described in the + table:

      + + + + + + + + + + + + + + + + + +
      RTEMSI PRO Z690-A
      J18 pin 1 (GND)JBD1 pin 1 (pin closer to JBAT1)
      J18 pin 2 (RX)JBD1 pin 2 (pin further from JBAT1)
      +
      +

      Note: Pins on JBD1 are not described in the documentation. They have been +discovered experimentally. Pay attention to the connections.

      +
      +

      IMG +IMG

      +
    4. +
    +

    Power supply controlling

    +

    Connect SeaSonic FOCUS Plus Platinum to Sonoff.

    +

    Basic power operations enabling

    +

    Connect the RTE J11 header to the platform JFP1 header as described in the +table:

    + + + + + + + + + + + + + + + + + + + + + +
    RTEMsi Z690
    J11 pin 9JFP1 pin 6 (PWR_ON)
    J11 pin 8JFP1 pin 7 (RST)
    J15 pin 1 (GND)JFP1 pin 5 (GND)
    +

    IMG +IMG +IMG

    +

    External flashing enabling

    +

    Connect the RTE SPI header to the platform as described in the table:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    RTE SPI headerMSI Z690-A
    J7 pin 1 (Vcc)JTPM1 pin 1 (SPI Power)
    J7 pin 2 (GND)JTPM1 pin 7 (GND)
    J7 pin 3 (CS)JTPM1 pin 5 (RESERVED / BIOS SPI CS pin)
    J7 pin 4 (SCLK)JTPM1 pin 6 (SPI Clock)
    J7 pin 5 (MISO)JTPM1 pin 3 (MISO)
    J7 pin 6 (MOSI)JTPM1 pin 4 (MOSI)
    +
    +

    Note: external access to the flash chip is possible only from the JTPM +header. JTPM1 is a 2mm pitch header, you will need 2mm to 2.54mm +female-female dupont wires to connect to RTE.

    +
    +

    IMG +IMG

    +

    Device power status readout

    +

    Connect the RTE J1 header to the platform JFP1 header as shown in the picture +below:

    +

    IMG

    +

    The values ​​of R1, R2, V1 and V2 should meet the relationship according +to the formula R1/R2 = V2/V1. V1 cannot be greater than 3.3V (RTE property).

    +

    Complete Setup

    +

    After preparing all of the connections also three activities should be +performed to enable all of the test stand features:

    +
      +
    1. +

      Connect Sonoff to the mains:

      +

      IMG

      +
    2. +
    3. +

      Connect the RTE to the Internet by using the Ethernet cable.

      +
    4. +
    5. Connect the RTE to the mains by using the microUSB 5 V/2 A power supply.
    6. +
    +

    Complete setup should looks as follows:

    +

    Complete

    +

    Theory of operation

    +

    The following sections describe how to use all of the enabled features:

    +
      +
    • serial connection to the platform,
    • +
    • controlling power supply,
    • +
    • enabling basic power actions with the platform (power off/power on/reset),
    • +
    • external flashing with the RTE,
    • +
    • device power status readout.
    • +
    +

    Serial connection

    +

    The method of setting and using serial connection is described in the +Serial connection guide.

    +

    Power supply controlling

    +

    Power supply controlling (in this case: controlling the state of Sonoff) +should be performed based on the sonoff.sh script implemented in meta-rte +(OS image dedicated to the RTE platform).

    +
    +

    Note, that before using the above-mentioned script, it should be modified and +SONOFF_IP parameter should be set in accordance with obtained Sonoff IP address.

    +
    +

    To perform basic power operations use the below-described commands:

    +
      +
    1. +

      Turn on the power supply:

      +
      ./sonoff on
      +
      +
    2. +
    3. +

      Turn off the power supply:

      +
      ./sonoff on
      +
      +
    4. +
    +

    Basic power operations

    +

    Basic power operations should be performed based on the rte_ctrl script +implemented in meta-rte (OS image dedicated to the RTE platform). To perform +basic power operations use the below-described commands:

    +
      +
    1. +

      Turn on the platform:

      +
      rte_ctrl pon
      +
      +
    2. +
    3. +

      Turn off the platform:

      +
      rte_ctrl poff
      +
      +
    4. +
    5. +

      Reset the platform:

      +
      rte_ctrl reset
      +
      +
    6. +
    +
    +

    Note, that in order for the above commands to work properly, the platform +should be powered up: both Sonoff and the power supply must be turned on.

    +
    +

    External flashing

    +

    The external flashing procedure should be performed based on the scripts +implemented on the RTE platform. To perform the flashing operation reproduce, +the below-described steps:

    +
      +
    1. +

      By using scp put the requested Dasharo file to the RTE:

      +
      scp <path_to_firmware>/<firmware_file> root@<RTE_IP>:/tmp/coreboot.rom
      +
      +

      Where:

      +
        +
      • path_to_firmware - path to firmware, which should send to RTE,
      • +
      • firmware_file - the name of the firmware file, which should be sent + to RTE,
      • +
      • RTE_IP - IP address of the connected RTE.
      • +
      +
    2. +
    3. +

      Login to RTE via ssh or minicom.

      +
    4. +
    5. +

      Read the flash chip by executing the following command on RTE:

      +
      ./flash.sh read tmp/dump.rom
      +
      +
    6. +
    7. +

      If the reading was successful, the output from the command above should + contain the phrase Verifying flash... VERIFIED.

      +
    8. +
    9. +

      Write the flash chip by executing the following command on RTE:

      +
      ./flash.sh write /tmp/coreboot.rom
      +
      +
      +

      Do not interrupt the flashing procedure in any way (especially by +changing connections). It may cause hardware damage!

      +
      +
    10. +
    11. +

      If the reading was successful, the output from the command above should + contain the phrase Verifying flash... VERIFIED.

      +
    12. +
    +

    Device power status readout

    +

    To read the current power status use the following command:

    +
    cat /sys/class/gpio/gpio12/value
    +
    +

    Example output:

    +
      +
    • 1 means that the platform is turned on.
    • +
    • 0 means that the platform is turned off.
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/msi-z690/presale-assembly-and-validation/index.html b/transparent-validation/msi-z690/presale-assembly-and-validation/index.html new file mode 100644 index 00000000000..a9612d95568 --- /dev/null +++ b/transparent-validation/msi-z690/presale-assembly-and-validation/index.html @@ -0,0 +1,6104 @@ + + + + + + + + + + + + + + + + + + Presale assembly and validation - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Presale device assembly and validation

    +

    Introduction

    +

    This document describes the assembly procedure of the MSI PRO Z690-A DDR4 with +specified components in requirements.

    +

    Requirements

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    PartModel NameImage
    MotherboardMSI PRO Z-690A DDR4Motherboard
    CPUIntel Core i5-12600K, 3.7GCPU
    CoolingNoctua CPU NH-U12S Redux (w/ Noctua NM-i17xx-MP78 Mounting Kit)Cooler
    RAMKingston Fury Beast, DDR4, 4*8GB (32GB Total), 3600MHz, CL17RAM
    Power SupplySeasonic Focus PX 750W 80 Plus PlatinumPower Supply
    StorageSSD Intel 670p 512 GB M.2 2280 PCI-E x4 Gen3 NVMeStorage
    EnclosureSilentiumPC Armis AR1Enclosure
    +

    Additionally, you will need a regular Phillips screwdriver and thermal paste. +Try not to tighten all the elements to the maximum, as it will make disassembly +difficult. Remember that make all connections in the grounding strap.

    +

    Device assembly

    +

    Full set assembly

    +

    Section below describes the procedure of complete assembling of the +working station.

    +
      +
    1. Unpack all equipment.
    2. +
    3. +

      Place the motherboard in front of you, this is the component with which most + of the operations will be performed. It's best to put something softer under + the board so as not to damage it, e.g. during the installation of RAM + modules.

      +

      Motherboard

      +
    4. +
    5. +

      To install the CPU on the motherboard first, open the CPU socket:

      +

      Demontage CPU socket

      +
    6. +
    7. +

      Insert the processor carefully and tighten it with the dedicated mechanism:

      +

      Install CPU

      +
    8. +
    9. +

      To install the CPU cooler, the parts shown in the picture below are + necessary:

      +

      Items

      +
    10. +
    11. +

      Attach the black stand to the bottom of the motherboard, then apply and screw + down the remaining parts except the cooler itself and apply thermal paste. + After these steps, the CPU area should look like this:

      +

      CPU Cooler

      +
    12. +
    13. +

      Then attach the cooler from above by tightening the two screws. Most likely, + for this operation, it is necessary to dismantle the fan and restore it + after tightening the screws.

      +

      CPU Cooler 2

      +
    14. +
    15. +

      Install the memory module into the DIMM slots. To insert a single module, + open the latch on both sides. Then insert the RAM and gently press the + module downward at both ends of the module and the latch will close + automatically. Always insert memory modules in the DIMMA2 slot first.

      +

      Installed RAM

      +
    16. +
    17. +

      Install the M.2 solid-state drive (SSD) into the M.2 slot. Remove the two + screws from the cover and the one responsible for disk stabilization. Insert + the SSD into the M.2 slot and tighten the previously removed screws.

      +

      Install Storage

      +
    18. +
    19. +

      Take the enclosure of the computer and open one side as shown in the picture + below:

      +

      Open enclosure

      +
    20. +
    21. +

      Install the rear panel by inserting it from the inside of the enclosure + and pressing it lightly.

      +

      Rear panel

      +
    22. +
    23. +

      Insert the motherboard into the case but do not twist it, some pins are + hard to connect when the motherboard is screwed. The photo below shows the + slots that should be filled in the next steps.

      +

      Slots

      +
    24. +
    25. +

      Connect the fan from the CPU cooler to the slot marked I.

      +

      CPU cooler connection

      +
    26. +
    27. +

      Connect the cables from the front panel to the appropriately marked places:

      +

      Front Panel

      +

      A detailed description of the connection cable marked D can be found in +the Board manual +in section: JFP1, JFP2: Front Panel Connectors. +To verify correct connection of the cable marked D, you can compare them +to the pictures below:

      +

      Connection from the inside: +In_connection

      +

      Connection from the outside: +Out_connection

      +
    28. +
    29. +

      Connect the speaker to the slot marked before E:

      +

      Speaker

      +
    30. +
    31. +

      Screw the motherboard to the enclosure.

      +
    32. +
    33. +

      Connect the power supply to the motherboard using the cables marked RE25 for + connection to the G and H slots and the cable marked RJ21 to connect the + F slots.

      +

      Power Supply

      +
    34. +
    35. +

      Connect the fan built into the enclosure to the indicated place:

      +

      Fan

      +
    36. +
    37. +

      Bundle the cables so that they don't interfere with the fans or other + components.

      +
    38. +
    39. Close the case of the computer.
    40. +
    +

    Motherboard assembly only

    +

    Section below describes the procedure of assembling the motherboard.

    +

    To prepare the motherboard the following operations should be performed:

    +
      +
    1. Go through steps 1-8 from + Full set assembling section.
    2. +
    3. Go through 13th step from Full set assembling section.
    4. +
    5. Connect cable marked D to allows power on the device as described in + the 14th point of the + Full set assembling section.
    6. +
    7. Connect the power supply to the motherboard as described in the 17th point + of the Full set assembling section.
    8. +
    +

    Device validation

    +
      +
    1. Connect the device to the mains.
    2. +
    3. Power on the device with the button located on the front panel.
    4. +
    5. If all connections have been made correctly, the device should start and + the boot logo should be shown.
    6. +
    7. Install Dasharo firmware in accordance with + Initial Deployment - + the Migrating SMBIOS unique data chapter can be skipped.
    8. +
    9. Power on the device.
    10. +
    11. Boot to Linux system (Ubuntu is recommended).
    12. +
    13. +

      Open a terminal window and run the following command:

      +
      sudo dmidecode -t 0 | grep Version
      +
      +
    14. +
    15. +

      The output of the command above should be similar to: + Version: Dasharo (coreboot+UEFI) <version> where the version should + correspond to the version of the flashing binary used eg. v1.0.0.

      +
    16. +
    17. Check in the system that everything is working properly.
    18. +
    +

    Useful content

    +
      +
    • Building manual - documentation contains information on how to + build Dasharo compatible with the MSI PRO Z690-A DDR4.
    • +
    • Board manual - documentation contains detailed information about + the motherboard and its operations.
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/msi-z790/laboratory-assembly-guide/index.html b/transparent-validation/msi-z790/laboratory-assembly-guide/index.html new file mode 100644 index 00000000000..8ad845f6bd5 --- /dev/null +++ b/transparent-validation/msi-z790/laboratory-assembly-guide/index.html @@ -0,0 +1,6330 @@ + + + + + + + + + + + + + + + + + + Laboratory stand assembly guide - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Laboratory stand dedicated to MSI PRO Z790-P assembly guide

    +

    Introduction

    +

    This document describes the assembly procedure dedicated to the MSI PRO Z790-P +testing stand.

    +

    Prerequisites

    +

    The below table contains information about all elements which are needed to +create the testing stand.

    +
      +
    • MSI PRO Z790-P platform
    • +
    • RTE v1.1.0
    • +
    • Sonoff S20 type E
    • +
    • 4x standard female-female connection wire 2.54 mm raster
    • +
    • 7x standard female-female connection wire 2.54/2.00 mm raster
    • +
    • USB-UART converter with 4-wire cable
    • +
    • 4-pin header 2.54 mm raster
    • +
    +

    Pre-setup activities

    +

    The following subsections describe the method of preparing all the +components of the laboratory stand.

    +

    MSI PRO Z790-P

    +

    MSI PRO Z790-P platform should be prepared in accordance with the +Motherboard assembly +documentation.

    +

    RTE

    +

    RTE (acronym: Remote Testing Environment) should be prepared in accordance with +Quick start guide documentation dedicated +to the device.

    +

    Sonoff

    +

    The below section of the documentation is based on the +EPSHome documentation

    +
      +
    1. +

      Open the Sonoff case.

      +
    2. +
    3. +

      Check if the headers are soldered to the board. If not - 4 pin header + raster 2.54 mm should be soldered to the board in accordance with the below + images.

      +

      sonoff_without_header

      +

      sonoff_with_header

      +
    4. +
    5. +

      Connect the USB-UART converter to the USB port.

      +

      uart connection

      +
    6. +
    7. +

      Create a Sonoff configuration file. The file extension should be .yaml and + it should contain the device configuration.

      +

      Example configuration:

      +
      esphome:
      +  name: XXXXXX
      +  platform: ESP8266
      +  board: esp01_1m
      +
      +wifi:
      +  ssid: "XXXXXX"
      +  password: "XXXXXX"
      +  # manual_ip:
      +  #   # Set this to the IP of the ESP
      +  #   static_ip: 192.168.4.187
      +  #   # Set this to the IP address of the router. Often ends with .1
      +  #   gateway: 192.168.4.1
      +  #   # The subnet of the network. 255.255.255.0 works for most home networks.
      +  #   subnet: 255.255.255.0
      +  power_save_mode: none
      +
      +
      +  # # Enable fallback hotspot (captive portal) in case wifi connection fails
      +  ap:
      +    ssid: "Sonoff1 Fallback Hotspot"
      +    password: "123456789"
      +
      +
      +captive_portal:
      +
      +# Enable logging
      +logger:
      +
      +# Enable Home Assistant API
      +api:
      +
      +
      +ota:
      +
      +
      +binary_sensor:
      +- platform: gpio
      +  pin:
      +    number: GPIO0
      +    mode: INPUT_PULLUP
      +    inverted: True
      +  name: "Sonoff S20 Button"
      +  on_press:
      +    - switch.toggle: relay
      +- platform: status
      +  name: "Sonoff S20 Status"
      +
      +
      +switch:
      +- platform: gpio
      +  name: "Sonoff S20 Relay"
      +  pin: GPIO12
      +  id: relay
      +
      +output:
      +- platform: esp8266_pwm
      +  id: s20_green_led
      +  pin: GPIO13
      +  inverted: True
      +
      +light:
      +- platform: monochromatic
      +  name: "Sonoff S20 Green LED"
      +  output: s20_green_led
      +
      +web_server:
      +  port: 80
      +  reboot_timeout: 0s
      +
      +
    8. +
    9. +

      Run the docker container in the folder containing created .yaml + configuration file:

      +
      docker run --rm -v "${PWD}":/config --device=/dev/ttyUSB0 -p 6052:6052 -it esphome/esphome
      +
      +
    10. +
    11. +

      Open the browser and type into the web browser the following address:

      +
      http://localhost:6052/
      +
      +
    12. +
    13. +

      Put the device in flash mode. Putting the device in this mode should be done + in accordance with the + documentation.

      +
    14. +
    15. +

      Change the upload method from OTA to /dev/ttyUSB0. After this operation, + the new element with the name specified in esphome:name should be + displayed.

      +
    16. +
    17. +

      Select the option Upload. After clicking, the program should generate + the image, compile it and upload it to the device.

      +
    18. +
    19. +

      After successful upload replug the device to the USB (without the button + pressed) to get out of the flashing mode.

      +
    20. +
    21. +

      Open connection to the device in the PC terminal by typing:

      +
      sudo minicom -D /dev/ttyUSB0 -o -b 115200.
      +
      +
      +

      Note: /dev/ttyUSB0 is example device - check whether USB0 is the +correct one.

      +
      +
    22. +
    23. +

      Check if the device is responsible - whether network connectivity + information is generated.

      +
      +

      Note: The effective range for this device is only a few meters.

      +
      +
    24. +
    25. +

      Based on the minicom logs read the IP address assigned to the device.

      +
    26. +
    +

    Connections

    +

    The following sections describe how to enable all of the following features:

    +
      +
    • serial connection to the platform,
    • +
    • controlling power supply,
    • +
    • enabling basic power actions with the platform (power off/power on/reset),
    • +
    • external flashing with the RTE,
    • +
    • device power status readout.
    • +
    +

    Serial connection

    +
      +
    1. +

      Attach the jumpers in the RTE J16 header to enable header J18:

      + + + + + + + + + + + + + +
      Jumper position (TX)Jumper position (RX)
      EXT + COMEXT + COM
      +
    2. +
    3. +

      Connect the RTE J18 header to the platform JBD1 header as described in the + table:

      + + + + + + + + + + + + + + + + + +
      RTEMSI PRO Z790-P
      J18 pin 1 (GND)JBD1 pin 1 (pin closer to JBAT1)
      J18 pin 2 (RX)JBD1 pin 2 (pin further from JBAT1)
      +
      +

      Note: Pins on JBD1 are not described in the documentation. They have been +discovered experimentally. Pay attention to the connections.

      +
      +

      IMG +IMG

      +
    4. +
    +

    Power supply controlling

    +

    Connect SeaSonic FOCUS Plus Platinum to Sonoff.

    +

    Basic power operations enabling

    +

    Connect the RTE J11 header to the platform JFP1 header as described in the +table:

    + + + + + + + + + + + + + + + + + + + + + +
    RTEMsi Z790-P
    J11 pin 9JFP1 pin 6 (PWR_ON)
    J11 pin 8JFP1 pin 7 (RST)
    J15 pin 1 (GND)JFP1 pin 5 (GND)
    +

    IMG +IMG +IMG

    +

    External flashing enabling

    +

    Connect the RTE SPI header to the platform as described in the table:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    RTE SPI headerMSI Z790-P
    J7 pin 1 (Vcc)JTPM1 pin 1 (SPI Power)
    J7 pin 2 (GND)JTPM1 pin 7 (GND)
    J7 pin 3 (CS)JTPM1 pin 5 (RESERVED / BIOS SPI CS pin)
    J7 pin 4 (SCLK)JTPM1 pin 6 (SPI Clock)
    J7 pin 5 (MISO)JTPM1 pin 3 (MISO)
    J7 pin 6 (MOSI)JTPM1 pin 4 (MOSI)
    +
    +

    Note: external access to the flash chip is possible only from the JTPM +header. JTPM1 is a 2mm pitch header, you will need 2mm to 2.54mm +female-female dupont wires to connect to RTE.

    +
    +

    IMG +IMG

    +

    Device power status readout

    +

    Connect the RTE J1 header to the platform JFP1 header as shown in the picture +below:

    +

    IMG

    +

    The values ​​of R1, R2, V1 and V2 should meet the relationship according +to the formula R1/R2 = V2/V1. V1 cannot be greater than 3.3V (RTE property).

    +

    Complete Setup

    +

    After preparing all of the connections also three activities should be +performed to enable all of the test stand features:

    +
      +
    1. +

      Connect Sonoff to the mains:

      +

      IMG

      +
    2. +
    3. +

      Connect the RTE to the Internet by using the Ethernet cable.

      +
    4. +
    5. Connect the RTE to the mains by using the microUSB 5 V/2 A power supply.
    6. +
    +

    Complete setup should looks as follows:

    +

    Complete

    +

    Theory of operation

    +

    The following sections describe how to use all of the enabled features:

    +
      +
    • serial connection to the platform,
    • +
    • controlling power supply,
    • +
    • enabling basic power actions with the platform (power off/power on/reset),
    • +
    • external flashing with the RTE,
    • +
    • device power status readout.
    • +
    +

    Serial connection

    +

    The method of setting and using serial connection is described in the +Serial connection guide.

    +

    Power supply controlling

    +

    Power supply controlling (in this case: controlling the state of Sonoff) +should be performed based on the sonoff.sh script implemented in meta-rte +(OS image dedicated to the RTE platform).

    +
    +

    Note, that before using the above-mentioned script, it should be modified and +SONOFF_IP parameter should be set in accordance with obtained Sonoff IP address.

    +
    +

    To perform basic power operations use the below-described commands:

    +
      +
    1. +

      Turn on the power supply:

      +
      ./sonoff on
      +
      +
    2. +
    3. +

      Turn off the power supply:

      +
      ./sonoff on
      +
      +
    4. +
    +

    Basic power operations

    +

    Basic power operations should be performed based on the rte_ctrl script +implemented in meta-rte (OS image dedicated to the RTE platform). To perform +basic power operations use the below-described commands:

    +
      +
    1. +

      Turn on the platform:

      +
      rte_ctrl pon
      +
      +
    2. +
    3. +

      Turn off the platform:

      +
      rte_ctrl poff
      +
      +
    4. +
    5. +

      Reset the platform:

      +
      rte_ctrl reset
      +
      +
    6. +
    +
    +

    Note, that in order for the above commands to work properly, the platform +should be powered up: both Sonoff and the power supply must be turned on.

    +
    +

    External flashing

    +

    The external flashing procedure should be performed based on the scripts +implemented on the RTE platform. To perform the flashing operation reproduce, +the below-described steps:

    +
      +
    1. +

      By using scp put the requested Dasharo file to the RTE:

      +
      scp <path_to_firmware>/<firmware_file> root@<RTE_IP>:/tmp/coreboot.rom
      +
      +

      Where:

      +
        +
      • path_to_firmware - path to firmware, which should send to RTE,
      • +
      • firmware_file - the name of the firmware file, which should be sent + to RTE,
      • +
      • RTE_IP - IP address of the connected RTE.
      • +
      +
    2. +
    3. +

      Login to RTE via ssh or minicom.

      +
    4. +
    5. +

      Read the flash chip by executing the following command on RTE:

      +
      ./flash.sh read tmp/dump.rom
      +
      +
    6. +
    7. +

      If the reading was successful, the output from the command above should + contain the phrase Verifying flash... VERIFIED.

      +
    8. +
    9. +

      Write the flash chip by executing the following command on RTE:

      +
      ./flash.sh write /tmp/coreboot.rom
      +
      +
      +

      Do not interrupt the flashing procedure in any way (especially by +changing connections). It may cause hardware damage!

      +
      +
    10. +
    11. +

      If the reading was successful, the output from the command above should + contain the phrase Verifying flash... VERIFIED.

      +
    12. +
    +

    Device power status readout

    +

    To read the current power status use the following command:

    +
    cat /sys/class/gpio/gpio12/value
    +
    +

    Example output:

    +
      +
    • 1 means that the platform is turned on.
    • +
    • 0 means that the platform is turned off.
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/muxpi/basic-validation/index.html b/transparent-validation/muxpi/basic-validation/index.html new file mode 100644 index 00000000000..cc25118c69a --- /dev/null +++ b/transparent-validation/muxpi/basic-validation/index.html @@ -0,0 +1,6127 @@ + + + + + + + + + + + + + + + + + + Basic validation - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    muxPi board validation

    +
    +

    In case of any troubles, first it is recommended to read + comprehend Theory of Operations for muxPi + devices.

    +
    +

    Necessary components preparation

    +
      +
    • NanoPi
    • +
    • muxPi
    • +
    • ETH, microUSB<->USB cables, power supply (5V/2A Dc 5.5/2.1mm jack)
    • +
    • 2 SDcards (minimum 8GB each)
    • +
    • IDC-uSD adapter (DUT<->SD card)
    • +
    • SD card adapter (USB<->SD card)
    • +
    • Device bootable from SD card (e.g. RPI)
    • +
    +

    +

    NanoPi setup

    +
      +
    1. Prepare microSD card (minimum 8GB) for NanoPi NEO operating system.
    2. +
    3. Download and extract image - + link
    4. +
    5. Flash image into microSD card (Etcher + tool could be helpful)
    6. +
    +

    muxPi setup

    +

    +
      +
    1. Attach NanoPi to muxPi connectors.
    2. +
    3. Plug ETH cable to RJ45 NanoPi port.
    4. +
    5. Plug microUSB<->USB cable to muxPi and your machine.
    6. +
    7. +

      Plug in power supply. +

      +
    8. +
    9. +

      Make sure that jumpers are correctly set according to image:

      +

      +
    10. +
    11. +

      Connect to NanoPi using terminal:

      +
      sudo minicom -D /dev/ttyUSB0 -o -b 115200`
      +
      +
    12. +
    13. +

      Save ip address:

      +
      ifconfig
      +
      +
    14. +
    15. +

      Connect to NanoPi via ssh (with password: fa):

      +

      bash +ssh root@192.168.4.XXX

      +
    16. +
    17. +

      Or via serial connection.

      +
      +

      NOTE: Connecting with MuxPi through serial will automatically login as +non root user pi with password pi.

      +
      +
    18. +
    +

    Validation steps

    +

    1. Install WiringNP

    +
     git clone https://github.com/friendlyarm/WiringNP
    + cd WiringNP/
    + chmod 755 build
    + ./build
    +
    +
      +
    • verify installation:
    • +
    +
    gpio readall
    +
    +
      +
    • If your installation is successful the following messages will show up:
    • +
    +
     +-----+-----+----------+------+---+-NanoPi-NEO--+------+----------+-----+-----+
    + | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
    + +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
    + |     |     |     3.3V |      |   |  1 || 2  |   |      | 5V       |     |     |
    + |  12 |   8 |  GPIOA12 | ALT5 | 0 |  3 || 4  |   |      | 5V       |     |     |
    + |  11 |   9 |  GPIOA11 | ALT5 | 0 |  5 || 6  |   |      | 0v       |     |     |
    + | 203 |   7 |  GPIOG11 |  OFF | 0 |  7 || 8  | 0 | ALT5 | GPIOG6   | 15  | 198 |
    + |     |     |       0v |      |   |  9 || 10 | 0 | ALT5 | GPIOG7   | 16  | 199 |
    + |   0 |   0 |   GPIOA0 | ALT5 | 0 | 11 || 12 | 0 |  OUT | GPIOA6   | 1   | 6   |
    + |   2 |   2 |   GPIOA2 |  OFF | 0 | 13 || 14 |   |      | 0v       |     |     |
    + |   3 |   3 |   GPIOA3 |  OFF | 0 | 15 || 16 | 0 |  OFF | GPIOG8   | 4   | 200 |
    + |     |     |     3.3v |      |   | 17 || 18 | 0 |  OFF | GPIOG9   | 5   | 201 |
    + |  64 |  12 |   GPIOC0 | ALT4 | 0 | 19 || 20 |   |      | 0v       |     |     |
    + |  65 |  13 |   GPIOC1 | ALT4 | 0 | 21 || 22 | 0 | ALT5 | GPIOA1   | 6   | 1   |
    + |  66 |  14 |   GPIOC2 | ALT4 | 0 | 23 || 24 | 1 |  OUT | GPIOC3   | 10  | 67  |
    + +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
    + | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
    + +-----+-----+----------+------+---+-NanoPi-NEO--+------+----------+-----+-----+
    +
    + +-----+----NanoPi-NEO USB/Audio-+----+
    + | BCM | wPi |   Name   | Mode | V | Ph |
    + +-----+-----+----------+------+---+----+
    + |     |     |       5V |      |   | 25 |
    + |     |     |  USB-DP1 |      |   | 26 |
    + |     |     |  USB-DM1 |      |   | 27 |
    + |     |     |  USB-DP2 |      |   | 28 |
    + |     |     |  USB-DM2 |      |   | 29 |
    + |     |     |    IR-RX |      |   | 30 |
    + |  17 |  19 |  GPIOA17 |  OFF | 0 | 31 |
    + |     |     |  PCM/I2C |      |   | 32 |
    + |     |     |  PCM/I2C |      |   | 33 |
    + |     |     |  PCM/I2C |      |   | 34 |
    + |     |     |  PCM/I2C |      |   | 35 |
    + |     |     |       0V |      |   | 36 |
    + +-----+-----+----------+------+---+----+
    +
    + +-----+----NanoPi-NEO Debug UART-+----+
    + | BCM | wPi |   Name   | Mode | V | Ph |
    + +-----+-----+----------+------+---+----+
    + |   4 |  17 |   GPIOA4 | ALT5 | 0 | 37 |
    + |   5 |  18 |   GPIOA5 | ALT5 | 0 | 38 |
    + +-----+-----+----------+------+---+----+
    +
    +

    2. Cortex-M0 flashing

    +

    The second controllable unit on the muxPi board is embedded microcontroller +STM32 F030C6T6 from Cortex-M0 family. It is required to flash special binary +prepared by Tizen group (the code is not open yet, but this process is in +progress). To flash muxPi's microcontroller, follow steps below:

    +
      +
    1. Make sure that VDD jumper is left open.
    2. +
    3. Download binary file - +link.
    4. +
    5. Copy binary to nanoPi: scp <path-to-file> root@192.168.4.XXX:/root/
    6. +
    7. Update package lists (nanoPi): apt-get update
    8. +
    9. Install stm32flash utility (nanoPi): sudo apt-get install stm32flash
    10. +
    11. Export GPIO: gpio mode 3 out and gpio mode 7 out
    12. +
    13. Set Cortex-M0 to "Flashing mode": gpio write 7 1
    14. +
    15. Power up microcontroller: gpio write 3 1
    16. +
    17. Flash firmware: stm32flash -w /root/firmware-05.bin -v -g 0x0 /dev/ttyS2
    18. +
    19. Power off microcontroller: gpio write 3 0
    20. +
    21. Set Cortex-M0 to "Execution mode": gpio write 7 0
    22. +
    23. Power on microcontroller: gpio write 3 1
    24. +
    +

    From now on, muxPi's LCD should light on and display:

    +
        *  MuxPi  *
    +    HW: 1.0 SW: 0.5
    +
    +

    3. SD Adapter

    +
      +
    1. +

      Connect IDC-uSD adapter to the muxPI board:

      +

      +
    2. +
    3. +

      Insert the microSD card to microSD card slot accessible on the bottom side of + muxPi board.

      +
    4. +
    5. +

      To enable microSD card reader, connect to Cortex from MuxPi via minicom:

      +
      minicom -D /dev/ttyS2
      +
      +

      and enter in minicom following commands:

      +
      ts
      +
      +

      and then

      +
      dut
      +
      +
      +

      NOTE: Each command should return OK

      +
      +
    6. +
    7. +

      Connect IDC-uSD adapter to a SD card adapter plugged into your machine

      +
      +

      NOTE: You need to force IDC-uSD adapter to insert into SD card adapter

      +
      +
    8. +
    9. +

      (On your machine) Check if device is connected: dmesg -w +should help. You should also be able to read and write +data to uSD card from file manager.

      +
    10. +
    11. Flash image into microSD card (for RPI or other device +bootable form SD card).
    12. +
    13. Disconnect uSD adapter form a SD card adapter and connect +to the device (e.g. RPI).
    14. +
    15. Connect device to the power supply, now device should boot +via IDC-uSD adapter.
    16. +
    +

    4. Screening

    +
      +
    1. It is recommended to use screen program for communication:
    2. +
    3. Install screen: sudo apt-get install screen
    4. +
    5. Open connection (from muxPi): screen /dev/ttyS2 115200,cs8,ixon,ixoff
    6. +
    7. Write help and press Enter.
    8. +
    +

    Help output:

    +
    help --- This help
    +version --- Display version of the firmware
    +echo --- Get (no arguments) or set ('on' or 'off') echo on serial "console": echo [on|off]. The default value is on.
    +power --- Get (no arguments) or set ('on' or 'off') or switch off and on ('tick') power supply for DUT: power [on|off|tick]
    +hdmi --- Get (no arguments) or set ('on' or 'off') HDMI HOTPLUG pin: hdmi [on|off]
    +dyper --- Get (no second argument) or set ('on' or 'off') DyPer state: dyper 1|2 [on|off]
    + mux --- Connect microSD card to external connector (DUT) or card reader (ts): mux [dut|ts]
    + dut --- Connect microSD card and power to DUT: dut
    +  ts --- Connect microSD card and power to TS: ts
    + led --- Get (no second or third argument) or set ('R G B') color of led (1 | 2), ex: led 1 255 0 255
    + clr --- Clear oled display
    +text --- Print text on the OLED display: text x y color content
    +draw --- Draw an object on the OLED display: draw object x1 y1 [x2 y2], objects are:
    +         - point x y color - draws one point at given coordinates
    +         - line x1 y1 x2 y2 color - draws line between given coordinates
    +         - rectangle left top width height color - draws line between given coordinates
    +         - circle x y radius color - draws line between given coordinates
    +color must be 'on', 'off' or 'inv'
    + adc --- Print current adc value of all (if no arguments are given) or one specified channel, ex: adc 1
    +voltage --- Print current voltage [mV] of all (if no arguments are given) or one specified channel, ex: voltage 1
    +current --- Print current current [mA] being consumed by DUT
    +lthor --- Get (no second argument) or set state of lthor control signals:
    +         - lthor switch [usb|uart] - redirect DUT's USB wires to NanoPi's 'usb' or 'uart'
    +         - lthor id [usb|uart] - switch DUT's USB to 'usb' or 'uart' mode
    +         - lthor vbus [on|off] - switch DUT's VBUS 'on' or 'off'
    +         - lthor combo [usb|uart] - make DUT and MuxPi USB work in 'usb' or 'uart' mode - no get function
    +
    + key --- Get current state of given key or both if no key number is given: key [1|2]
    +uart --- Get current value of UART voltage or set if new value is given [in millivolts]
    +
    +
    +

    NOTE: help might not display anything. Then try to use minicom.

    +
    +

    Minicom quick guide:

    +
      +
    1. Install minicom: sudo apt-get install minicom
    2. +
    3. Connect via minicom: sudo minicom -D /dev/ttyS2 -o -b 115200
    4. +
    5. +

      Type: help

      +
      +

      NOTE: If output is the same as above then basic validation for muxPi is +done.

      +
      +
    6. +
    +
    +

    Images source: Wiki Tizen

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/muxpi/theory-of-operations/index.html b/transparent-validation/muxpi/theory-of-operations/index.html new file mode 100644 index 00000000000..69eab1492b8 --- /dev/null +++ b/transparent-validation/muxpi/theory-of-operations/index.html @@ -0,0 +1,6406 @@ + + + + + + + + + + + + + + + + + + Theory of Operations - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    MuxPi - Theory of Operations

    +

    Block diagram

    +

    +

    muxPi setup

    +

    NanoPi NEO

    +

    Preparation of the muxPi's "heart":

    +
      +
    1. Prepare microSD card (minimum 8GB) for NanoPi NEO operating system.
    2. +
    3. Download and extract image - link
    4. +
    5. Flash image into microSD card (Etcher tool could be helpful)
    6. +
    7. Insert card to NanoPi microSD slot.
    8. +
    9. Attach NanoPi to muxPi connectors.
    10. +
    11. Plug Ethernet cable to RJ45 NanoPi port.
    12. +
    +

    Serial communication

    +

    There are two methods to setup serial communication with muxPi:

    +
      +
    • +

      with microUSB<->USB cable

      +

      +
    • +
    • +

      with UART/USB converter

      +

      Attach USB/UART converter to muxPi's left addon female header (GND, + DBG UART RX, DBG UART TX on pinout image below):

      +

      +

      and plug USB connector to the computer. Next, open connection in PC +terminal by typing:

      +
      sudo minicom -D /dev/ttyUSB0 -o -b 115200.
      +
      +
      +

      /dev/ttyUSB0 is example device - check whether USB0 is the correct one

      +
      +
    • +
    +

    Jumpers configuration

    +

    +
      +
    • UART - pins Vloc & VCC - if jumped then internal voltage generator is + used as voltage reference for data lines and powers up target device. If + open then voltage reference for data lines comes from target device and + internal voltage generator is unused.
    • +
    • +

      USB/ETH - determines what USB data lines of one USB HUB are connected to. If + first two pins are jumped then USB lines are connected to add-on connector. + If last two pins are jumped then these lines are connected tu USB<->ETH + converter. If none of the pins are jumped then the only connection is the + upper socket of double connector.

      +
      +

      NOTE: The upper socket of double USB-A connector must be left empty if +USB<->ETH is selected or add-on connector is selected and something is +connected to these data lines on the addon! +NOTE: Both jumpers must be placed in the same position!

      +
      +
    • +
    • +

      VDD - if this pins are jumped then the VDD and 3V3 are always on. If this is + left open then VDD and 3V3 are controlled by NanoPi. The usage example is + setting value of USB ID potentiometer (which is located underneath NanoPi). + But when NanoPi NEO is removed there is no way to turn on power for + microcontroller (that is when VDD jumper is helpful).

      +
      +

      NOTE: If there is no particular need then leave this jumper open.

      +
      +
    • +
    +

    Power supply

    +

    To power on MuxPi with NanoPi attached, plug the 5V/2A DC 5.5/2.1mm power supply +jack to the CON1 muxPi's connector. Power consumption of MuxPi should be less +then 1A assuming no addons connected.

    +

    +

    IP address

    +

    To check which IP address has been assigned, type in terminal: ifconfig.

    +

    OPTIONAL STEP: +To set static IP, create the following file:

    +
    sudo vi /etc/NetworkManager/NetworkManager.conf
    +
    +

    Edit NetworkManger.conf and set the value of "managed" under "ifupdown" to +false:

    +
    [ifupdown]
    +managed=false
    +
    +

    Add network setting to /etc/network/interfaces:

    +
    sudo vi /etc/network/interfaces
    +
    +

    Here is sample of /etc/network/interfaces:

    +
    # The loopback network interface
    +auto lo
    +iface lo inet loopback
    +
    +# network interface not managed by Network Manager
    +allow-hotplug eth0
    +iface eth0 inet static
    +address 192.168.4.XXX
    +netmask 255.255.255.0
    +gateway 192.168.4.1
    +dns-nameservers 192.168.4.1
    +
    +

    Restart the whole device:

    +
    reboot
    +
    +

    Now you should be able to connect to device through ssh:

    +
    ssh root@192.168.4.XXX
    +
    +

    with the password: fa

    +

    Install WiringNP

    +

    Connect to NanoPi NEO through ssh (serial connection automatically login to non +root user pi), then type:

    +
    git clone https://github.com/friendlyarm/WiringNP
    +cd WiringNP/
    +chmod 755 build
    +./build
    +
    +

    Verify installation:

    +
    gpio readall
    +
    +

    If your installation is successful the following messages will show up:

    +
     +-----+-----+----------+------+---+-NanoPi-NEO--+------+----------+-----+-----+
    + | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
    + +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
    + |     |     |     3.3V |      |   |  1 || 2  |   |      | 5V       |     |     |
    + |  12 |   8 |  GPIOA12 | ALT5 | 0 |  3 || 4  |   |      | 5V       |     |     |
    + |  11 |   9 |  GPIOA11 | ALT5 | 0 |  5 || 6  |   |      | 0v       |     |     |
    + | 203 |   7 |  GPIOG11 |  OFF | 0 |  7 || 8  | 0 | ALT5 | GPIOG6   | 15  | 198 |
    + |     |     |       0v |      |   |  9 || 10 | 0 | ALT5 | GPIOG7   | 16  | 199 |
    + |   0 |   0 |   GPIOA0 | ALT5 | 0 | 11 || 12 | 0 |  OUT | GPIOA6   | 1   | 6   |
    + |   2 |   2 |   GPIOA2 |  OFF | 0 | 13 || 14 |   |      | 0v       |     |     |
    + |   3 |   3 |   GPIOA3 |  OFF | 0 | 15 || 16 | 0 |  OFF | GPIOG8   | 4   | 200 |
    + |     |     |     3.3v |      |   | 17 || 18 | 0 |  OFF | GPIOG9   | 5   | 201 |
    + |  64 |  12 |   GPIOC0 | ALT4 | 0 | 19 || 20 |   |      | 0v       |     |     |
    + |  65 |  13 |   GPIOC1 | ALT4 | 0 | 21 || 22 | 0 | ALT5 | GPIOA1   | 6   | 1   |
    + |  66 |  14 |   GPIOC2 | ALT4 | 0 | 23 || 24 | 1 |  OUT | GPIOC3   | 10  | 67  |
    + +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
    + | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
    + +-----+-----+----------+------+---+-NanoPi-NEO--+------+----------+-----+-----+
    +
    + +-----+----NanoPi-NEO USB/Audio-+----+
    + | BCM | wPi |   Name   | Mode | V | Ph |
    + +-----+-----+----------+------+---+----+
    + |     |     |       5V |      |   | 25 |
    + |     |     |  USB-DP1 |      |   | 26 |
    + |     |     |  USB-DM1 |      |   | 27 |
    + |     |     |  USB-DP2 |      |   | 28 |
    + |     |     |  USB-DM2 |      |   | 29 |
    + |     |     |    IR-RX |      |   | 30 |
    + |  17 |  19 |  GPIOA17 |  OFF | 0 | 31 |
    + |     |     |  PCM/I2C |      |   | 32 |
    + |     |     |  PCM/I2C |      |   | 33 |
    + |     |     |  PCM/I2C |      |   | 34 |
    + |     |     |  PCM/I2C |      |   | 35 |
    + |     |     |       0V |      |   | 36 |
    + +-----+-----+----------+------+---+----+
    +
    + +-----+----NanoPi-NEO Debug UART-+----+
    + | BCM | wPi |   Name   | Mode | V | Ph |
    + +-----+-----+----------+------+---+----+
    + |   4 |  17 |   GPIOA4 | ALT5 | 0 | 37 |
    + |   5 |  18 |   GPIOA5 | ALT5 | 0 | 38 |
    + +-----+-----+----------+------+---+----+
    +
    +

    Cortex-M0 flashing

    +

    The second controllable unit on the muxPi board is embedded microcontroller +STM32 F030C6T6 from Cortex-M0 family. It is required to flash special binary +prepared by Tizen group (the code is not open yet, but this process is in +progress). To flash muxPi's microcontroller, follow steps below:

    +
      +
    1. Make sure that VDD jumper is left open.
    2. +
    3. Download binary file - link
    4. +
    5. Copy binary to nanoPi: scp <path-to-file> root@192.168.4.XXX:/root/
    6. +
    7. Update package lists (nanoPi): apt-get update
    8. +
    9. Install stm32flash utility (nanoPi): sudo apt-get install stm32flash
    10. +
    11. Export GPIO: gpio mode 3 out and gpio mode 7 out
    12. +
    13. Set Cortex-M0 to "Flashing mode": gpio write 7 1
    14. +
    15. Power up microcontroller: gpio write 3 1
    16. +
    17. Flash firmware: stm32flash -w firmware-05.bin -v -g 0x0 /dev/ttyS2
    18. +
    19. Power off microcontroller: gpio write 3 0
    20. +
    21. Set Cortex-M0 to "Execution mode": gpio write 7 0
    22. +
    23. Power on microcontroller: gpio write 3 1
    24. +
    +

    From now on, muxPi's LCD should light on and display:

    +
    *  MuxPi  *
    +HW: 1.0 SW: 0.5
    +
    +

    Software installation

    +
    +

    NOTE: It is recommended to cross-compile muxPi's software on your host machine

    +
    +

    Building using docker

    +

    Prerequisites: Docker, Make.

    +
      +
    1. Clone repository: git clone https://github.com/SamsungSLAV/muxpi.git.
    2. +
    3. Change directory: cd muxpi/sw/nanopi.
    4. +
    5. Build muxPi software: make docker-build
    6. +
    +

    Resulting binaries will be in bin directory.

    +

    Building from source

    +

    Prerequisites: git, go (1.10+)

    +
      +
    1. Go get it: go get github.com/SamsungSLAV/muxpi
    2. +
    3. Change directory: cd $GOPATH/src/github.com/SamsungSLAV/muxpi/sw/nanopi
    4. +
    5. Download dependencies: go get ./...
    6. +
    7. +

      Build binaries:

      +
      mkdir -p bin
      +GOARCH=arm GOOARM=7 GOOS=linux go build -o bin/stm ./cmd/stm/
      +GOARCH=arm GOOARM=7 GOOS=linux go build -o bin/fota ./cmd/fota/
      +
      +
    8. +
    +

    Install muxpi-power

    +

    muxpi-power - tool for controlling power supply for MuxPi's main board.

    +
      +
    1. +

      Copy muxpi-power files (change XXX to proper values):

      +
      scp power/muxpi-power root@192.168.4.XXX:/usr/bin
      +scp power/systemd/muxpi-power.service root@192.168.4.XXX:/etc/systemd/system
      +
      +
    2. +
    3. +

      On your MuxPi device, enable and start muxpi-power service:

      +
      systemctl enable muxpi-power.service
      +systemctl start muxpi-power.service
      +
      +
    4. +
    +

    Install stm

    +

    stm - tools/libs for communicating with STM32F030 microcontroller.

    +
      +
    1. +

      Copy stm binary and systemd files (change XXX to proper values):

      +
      scp bin/stm_armv7 root@192.168.4.XXX:/usr/bin/stm
      +scp stm/systemd/stm.service root@192.168.4.XXX:/etc/systemd/system
      +scp stm/systemd/stm-user.socket root@192.168.4.XXX:/etc/systemd/system
      +scp stm/systemd/stm.socket root@192.168.4.XXX:/etc/systemd/system
      +scp stm/stm root@192.168.4.XXX:/usr/local/bin/stm
      +
      +
    2. +
    3. +

      On your MuxPi device - create group stm and add your user:

      +
      groupadd stm
      +usermod -aG stm root
      +
      +
    4. +
    5. +

      On your MuxPi device - enable stm sockets:

      +
      systemctl daemon-reload
      +systemctl enable stm.socket stm-user.socket
      +systemctl start stm.socket stm-user.socket
      +
      +
    6. +
    +

    Install fota

    +

    fota - tools/libs for flashing devices - usually microSD card.

    +
      +
    1. +

      Copy fota binary to MuxPi device (change XXX to proper values):

      +
      scp bin/fota_armv7 root@192.168.4.XXX:/usr/bin/fota
      +
      +
    2. +
    3. +

      On your MuxPi device - create a symlink from /usr/local/bin/fota to +/usr/bin/fota/. Only /usr/local/bin/fota/ should be used by software +interfacing with MuxPi. This allows to swap fota implementation to your +preferred tool:

      +
      ln -s /usr/bin/fota /usr/local/bin/fota
      +
      +
    4. +
    +

    DUT setup

    +

    DUT power supply

    +

    MuxPi is capable of:

    +
      +
    • power switching on/off
    • +
    • current measurement
    • +
    +

    Power switching - it can switch power supply up to 5A and 250VAC. One line is +connected directly and one is connected through relay.

    +

    Current measurement - It is able to measure up to -/+5A and is galvanically +isolated from the rest of components thanks to use of Hall effect current sensor +ACS712ELCTR-05B-T. It is connected to unswitchable power line. The current +sensor is bypassed with 3 0R resistors that can be populated if current sensor +is not needed. These resistors must not be populated if current measurement is +required.

    +

    +

    UART connections

    +

    muxpi-connectors

    +

    muxpi-uart

    +
      +
    • GND - digital ground of MuxPi board
    • +
    • N.C. - not connected
    • +
    • Vloc - local voltage - voltage may be generated internally on MuxPi if the + DUT, or anything else we are connecting to, has not power pin. Nn such case + voltage generator must be set to desired value and activated. Command "uart + 3300" must be sent to Cortex-M0, where 3300 is desired voltage given in + millivolts. The voltage range is from 0 to 5000mv. Pins Vloc an VCC must + be connected each other. Typical jumper is a perfect connector for this + purpose. Vloc may be also used to power up additional converter RS232C. For + example if converter to RS232C (+/-12v) must be used then it may be powered + from Vloc pin.
    • +
    • VCC - power of DUT. If dut has no such power pin then it must be connected +to Vloc and vloc must be configured properly as stated above.
    • +
    • DUT RX - receiver data line in the DUT - through this line MuxPi sends data +to the DUT
    • +
    • DUT TX - transmitter data line in the DUT - from this line MuxPi reads data +form the DUT
    • +
    • DUT CTS - Clear To Send - hardware handshake
    • +
    • DUT RTS - Ready To Send - hardware handshake
    • +
    +

    Example configuration for OrangePi (DUT) uart connection:

    +
      +
    1. Set 3.3V Vloc (/dev/ttyS2 terminal): uart 3300
    2. +
    3. Attach UART jumper (Vloc and Vcc).
    4. +
    5. Connect GND, RX and TX (without crossing).
    6. +
    7. Open connection: screen /dev/ttyS1 115200,cs8,ixon,ixoff
    8. +
    +
    +

    NOTE: RX, TX, XTS, RTS are crossed on the board so you don't need + to cross the wires by yourself. +NOTE: A device powered from Vloc mustn't draw more than 50mA of current.

    +
    +

    Add-ons

    +

    Add-ons headers are extensions for attaching new shields or simply using NanoPi +and CortexM0 interfaces:

    +

    +
      +
    • 5V - power supply - not switchable - always present
    • +
    • 3V3 - switchable (controlled by NanoPi) 3.3V power supply
    • +
    • I2C0 SDA - I2C0 SDA line connected to NanoPi
    • +
    • I2C0 SCL - I2C0 SCL line connected to NanoPi
    • +
    • DBG UART TX - UART0 (debug) of NanoPi
    • +
    • DBG UART RX - UART0 (debug) of NanoPi
    • +
    • USB B+/-, USB A+/- USB host lines connected to NanoPi through USB HUB
    • +
    • GND - ground lines
    • +
    • N.C. - not connected
    • +
    +

    +
      +
    • SPI0 CLK - SPI0 clock line connected to NanoPi
    • +
    • SPI0 MOSI - SPI0 "master output slave input" line connected to NanoPi
    • +
    • SPI0 CS - SPI0 "chip select" line connected to NanoPi
    • +
    • SPI0 MISO - SPI0 "master input slave output" line connected to NanoPi
    • +
    • PI GPIO 1,2,3 - GPIO (General Purpose Input/Output) connected to NanoPi NEO. + Ports PG11, PL11, PA17 respectively.
    • +
    • ST GPIO 1,2,3 - GPIO connected to Cortex-M0 microcontroller. Ports PB3, PB4, + PB5 of STM32F03C6T6 respectively.
    • +
    • ADC1,2 - analog inputs connected to analog to digital converter of Cortex-M0 + microcontroller. Ports PA1, PA2 respectively. Voltage range of this input is 0 + to 3.3V. This lines are not buffered in any way so attention must paid when + dealing with them.
    • +
    • GND - ground lines
    • +
    +
    +

    NOTE: PI GPIO 1 has additional special function. It is connected to Cortex-M0 + Boot0 pin which enables firmware download mode during microcontroller boot. + 1 - enables this mode while 0 disables it. So it is useless as GPIO when + the microcontroller is being booted.

    +
    +

    DyPers

    +

    +

    Dyper is a small, electromagnetic relay which is controllable by software. There +are 2 dypers on MuxPi board. Each of them has two channels. Both channels are +switched at the same time with the same command. So both of them can be on and +both can be off but there is no way to turn one on and one off. They can be +controlled by CortexM0 - examples here.

    +

    ETH and USB

    +

    ETH and upper USB of double USB socket share the same USB channel from USB HUB. +Jumpers located at the rear side of double USB connector allow to disconnect +this USB from ETH and connect to add-on connector. Details on this topic are +covered in jumpers section.

    +

    +

    USB-M

    +

    This is USB connector dedicated to mobile devices from Samsung company. This +connector has controllable Vbus line and also controllable ID line.

    +

    +

    More information about this type of interface, it's capabilities and example of +flashing smartphone can be found here.

    +

    SD Adapter

    +

    This connector is used to connect microSD card, put into MuxPi, to a DUT.

    +

    +

    This connector requires IDC-uSD cable adapter:

    +

    +

    Target microSD card must be attached to microSD card reader accessible on bottom +side of muxPi board.

    +

    To enable microSD card reader, connect to Cortex from MuxPi via minicom:

    +
    minicom -D /dev/ttyS2
    +
    +

    and enter in minicom following commands:

    +
    ts
    +
    +

    and then:

    +
    dut
    +
    +

    Each command should return OK

    +

    After doing this you can connect the uSD's end of the cable adapter to the +external card reader and check if it is correctly recognized by PC. You should +also be able to run the microcontroller from the card attached to MuxPi if the +card contains appropriate OS.

    +

    Interacting with muxPi

    +

    Connection with NanoPi

    +

    User can simply open SSH connection by (password: fa):

    +

    ssh root@<muxpi-ip-address>

    +
      +
    • or use serial connection mentioned here
    • +
    +
    +

    NOTE: Connecting with MuxPi through serial will automatically login as non + root user pi with password pi.

    +
    +

    User interface

    +

    +

    Features operable directly via NanoPi GPIOs:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    #Pin (board)#WiringNPDescriptionLow state "0"High state "1"
    121LED1LED offLED on
    132LED2LED offLED on
    153Power (Cortex m0)Power offPower on
    77Boot (Cortex m0)Execution modeFlashing mode
    +
    +

    NOTE: Initially, above GPIOs are not exported. Set GPIOs mode with gpio mode + <#WiringNP> out.

    +
    +

    Example LED1 control:

    +
      +
    • LED1 on: gpio write 1 1
    • +
    • LED1 off: gpio write 1 0
    • +
    +

    Example of flashing Cortex-M0 is described here.

    +

    The microcontroller is connected to NanoPi NEO with UART. This UART is connected +to third UART of NanoPi - /dev/ttyS2. The port is configured to 115200,8,N1 and +cannot be changed without modification of the firmware. The protocol is text +based, simple and human readable. Each command has to be ended with 'n' or 'r' +character. Each command is confirmed with 'OK' string or error string.

    +

    It is recommended to use screen program for communication:

    +
      +
    1. Install screen: sudo apt-get install screen
    2. +
    3. Open connection (from muxPi): screen /dev/ttyS2 115200,cs8,ixon,ixoff
    4. +
    5. Write help and press Enter.
    6. +
    +

    Features operable through Cortex-M0 microcontroller (help output):

    +
    help --- This help
    +version --- Display version of the firmware
    +echo --- Get (no arguments) or set ('on' or 'off') echo on serial "console": echo [on|off]. The default value is on.
    +power --- Get (no arguments) or set ('on' or 'off') or switch off and on ('tick') power supply for DUT: power [on|off|tick]
    +hdmi --- Get (no arguments) or set ('on' or 'off') HDMI HOTPLUG pin: hdmi [on|off]
    +dyper --- Get (no second argument) or set ('on' or 'off') DyPer state: dyper 1|2 [on|off]
    + mux --- Connect microSD card to external connector (DUT) or card reader (ts): mux [dut|ts]
    + dut --- Connect microSD card and power to DUT: dut
    +  ts --- Connect microSD card and power to TS: ts
    + led --- Get (no second or third argument) or set ('R G B') color of led (1 | 2), ex: led 1 255 0 255
    + clr --- Clear oled display
    +text --- Print text on the OLED display: text x y color content
    +draw --- Draw an object on the OLED display: draw object x1 y1 [x2 y2], objects are:
    +         - point x y color - draws one point at given coordinates
    +         - line x1 y1 x2 y2 color - draws line between given coordinates
    +         - rectangle left top width height color - draws line between given coordinates
    +         - circle x y radius color - draws line between given coordinates
    +color must be 'on', 'off' or 'inv'
    + adc --- Print current adc value of all (if no arguments are given) or one specified channel, ex: adc 1
    +voltage --- Print current voltage [mV] of all (if no arguments are given) or one specified channel, ex: voltage 1
    +current --- Print current current [mA] being consumed by DUT
    +lthor --- Get (no second argument) or set state of lthor control signals:
    +         - lthor switch [usb|uart] - redirect DUT's USB wires to NanoPi's 'usb' or 'uart'
    +         - lthor id [usb|uart] - switch DUT's USB to 'usb' or 'uart' mode
    +         - lthor vbus [on|off] - switch DUT's VBUS 'on' or 'off'
    +         - lthor combo [usb|uart] - make DUT and MuxPi USB work in 'usb' or 'uart' mode - no get function
    +
    + key --- Get current state of given key or both if no key number is given: key [1|2]
    +uart --- Get current value of UART voltage or set if new value is given [in millivolts]
    +
    +
    +

    Images source: Wiki Tizen

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/pikvm/assembly-and-validation/index.html b/transparent-validation/pikvm/assembly-and-validation/index.html new file mode 100644 index 00000000000..69607bfc513 --- /dev/null +++ b/transparent-validation/pikvm/assembly-and-validation/index.html @@ -0,0 +1,6124 @@ + + + + + + + + + + + + + + + + + + Assembly and validation - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Presale device assembly and validation

    +

    Introduction

    +

    This document describes the assembly procedure of the PiKVM (device based on +Raspberry Pi 4 or Raspberry Pi Zero 2W) with components specified in +requirements.

    +

    Requirements

    +
    +

    Note that the PiKVM build might be basing on two types of Raspberry Pi: RPi 4 + or RPi Zero 2W.

    +
    +

    Hardware components necessary to build PiKVM on RPi Zero 2W:

    +
      +
    • Raspberry Pi Zero 2W,
    • +
    • microSD card 16 GB,
    • +
    • USB-A 5 V 3.1 A charger (female socket),
    • +
    • HDMI to CSI-2 bridge,
    • +
    • Raspberry Pi Zero Camera Cable,
    • +
    • HDMI-HDMI cable,
    • +
    • USB A - micro USB cable (male, male),
    • +
    • Y-splitter cable.
    • +
    • (Optional) UART -> USB converter
    • +
    +

    Hardware components necessary to build PiKVM on RPi 4:

    +
      +
    • Raspberry Pi 4,
    • +
    • microSD card 16 GB,
    • +
    • USB-A 5 V 3.1 A charger (female socket),
    • +
    • HDMI to CSI-2 bridge,
    • +
    • HDMI-HDMI cable,
    • +
    • USB A - USB C cable,
    • +
    • Y-splitter cable.
    • +
    • (Optional) UART -> USB converter
    • +
    +

    Device assembly

    +

    The following section of the documentation shows the assembly procedure for +PiKVM including setting up a WiFi connection and methods for reading device IP.

    +

    Set based on RPi Zero 2W preparation

    +

    The section below describes the method of preparing PiKVM hardware based on +RPI Zero 2W.

    +
      +
    1. +

      Connect SD card and HDMI to CSI-2 bridge with camera cable:

      +

      Connections

      +
    2. +
    3. +

      Block USB power from device under test by preparing USB cable:

      +

      USB

      +
    4. +
    5. +

      Connect HDMI cable from the device under test to HDMI -> CSI-2 bridge.

      +
    6. +
    7. Connect the USB splitter to the Raspberry Pi micro USB port.
    8. +
    9. Connect one side of the splitter to USB-A 5 V 3.1 A charger.
    10. +
    11. Connect other side to device under test via USB cable with blocked power.
    12. +
    +

    Set based on RPi 4 preparation

    +

    To build PiKVM on RPi 4, use the +RPI 0 set documentation and replace the cable for +connecting to the RPi and the cable for connecting with the CSI-2 bridge.

    +

    OS image building and flashing

    +
      +
    1. +

      Prepare the OS in accordance with the +PiKVM Handbook.

      +
    2. +
    3. +

      Flash the SD card using bmaptool or balenaEtcher.

      +
        +
      • to do this by balenaEtcher go to the producer site + and follow his procedure on how to download and flash an SD card.
      • +
      • +

        to do this by bmaptool reproduce the following steps:

        +
          +
        • +

          install bmaptool by opening the terminal and typing the following + command:

          +
          sudo apt install bmap-tools
          +
          +
        • +
        • +

          create the bmap by typing the following command:

          +
          bmaptool create /path/to/your/image > /path/where/you/want/bmap/file/saved/bmapfilename.bmap
          +
          +
        • +
        • +

          flash image to the SD card by typing the following command:

          +
          sudo bmaptool copy --bmap ~/path/where/your/bmap/file/is/located /path/where/your/image/is/located /path/to/memory/device
          +
          +
        • +
        +
      • +
      +
    4. +
    5. +

      Insert the flashed SD card into the SD card slot on the PiKVM.

      +
    6. +
    +

    Set up WiFi

    +

    The section below describes the method of setting up a WiFi connection for the +PiKVM. This section is dedicated especially to the PiKVMs based on RPi Zero 2W, +which is not equipped with an Ethernet port.

    +
      +
    1. +

      Mount the first partition of the memory card.

      +
    2. +
    3. +

      Edit or make the pikvm.txt file in the following convention:

      +
      FIRSTBOOT=1
      +WIFI_ESSID="name"
      +WIFI_PASSWD="password"
      +
      +
      +

      Note: Do not remove line FIRSTBOOT=1 or FIRST_BOOT-1 line. It may + occur with troubles with the device starts.

      +
      +
    4. +
    5. +

      Unmount the first partition of the memory card.

      +
    6. +
    +
    +

    Note: In some countries, in which WiFi channel 13 is in use, the device + might not connect to the WiFi. To prevent this, the router should be + configured properly: channels 12-14 or Auto Scan mode should be disabled.

    +
    +

    Read IP address

    +

    The section below describes the known methods of reading PiKVM IP.

    +
      +
    1. +

      First option: from os repository run the following command:

      +
      make scan
      +
      +

      Example output:

      +
      .
      +.
      +.
      +===== Toolbox image is ready =====
      +===== Searching for Pis in the local network =====
      +docker run \
      +        --rm \
      +        --tty \
      +        --net host \
      +    pi-builder-arm-toolbox arp-scan --localnet | grep -Pi "\s(b8:27:eb:|dc:a6:32:)" || true
      +192.168.4.13    dc:a6:32:aa:aa:aa   Raspberry Pi Trading Ltd
      +
      +
    2. +
    3. +

      Second option: open the web interface of your router and find the list of + issued IP addresses. Localization of the mentioned list depends on the + router model.

      +
    4. +
    5. +

      Third option:

      +
        +
      • +

        solder pins for serial output as on images below:

        +

        Pins +Schematics

        +
      • +
      • +

        Check Raspberry Pi Zero2W IP by booting to system and reading + information via serial (eg.) UART -> USB converter.

        +
      • +
      +
    6. +
    +

    Device validation

    +
      +
    1. Connect the device to the mains.
    2. +
    3. Login to RTE via ssh (by using earlier obtained IP address) or + minicom (by using USB-UART converter with 3 wire cables).
    4. +
    +

    FullHD stream

    +

    In order to enable FullHD stream (1920x1080) instead of 1200x720. One of the +reasons to enable FullHD is that certain proprietary BIOSes implement a GUI +setup which scales well only for Full HD or higher resolutions (in extreme +cases it can even crash if lower than FullHD resolution is used).

    +

    To enable FullHD resolution, one has to replace the EDID on PiKVM. To do so:

    +
      +
    1. Remount the filesystem to RW if necessary using rw command.
    2. +
    3. +

      Save the follow HEX to /root/edid.hex:

      +
      00FFFFFFFFFFFF005262888800888888
      +1C150103800000780AEE91A3544C9926
      +0F505425400001000100010001000100
      +010001010101D32C80A070381A403020
      +350040442100001E7E1D00A050001940
      +3020370080001000001E000000FC0050
      +492D4B564D20566964656F0A000000FD
      +00323D0F2E0F000000000000000001C4
      +02030400DE0D20A03058122030203400
      +F0B400000018E01500A0400016303020
      +3400000000000018B41400A050D01120
      +3020350080D810000018AB22A0A05084
      +1A3030203600B00E1100001800000000
      +00000000000000000000000000000000
      +00000000000000000000000000000000
      +00000000000000000000000000000045
      +
      +
    4. +
    5. +

      Execute: kvmd-edidconf --edid=/root/edid.hex --apply

      +
    6. +
    7. Execute: kvmd-edidconf --import=/root/edid.hex
    8. +
    9. Switch the filesystem back to RO using ro command.
    10. +
    +

    When PiKVM is connected to the platform, the BIOS or OS should initialize the +display with 1920x1080 resolution.

    +

    Where to buy?

    +

    The PiKVM is available in our online shop.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/pikvm/images/camera_cable_setup.jpg b/transparent-validation/pikvm/images/camera_cable_setup.jpg new file mode 100644 index 00000000000..ad427ce4516 Binary files /dev/null and b/transparent-validation/pikvm/images/camera_cable_setup.jpg differ diff --git a/transparent-validation/pikvm/images/pin_schem.jpg b/transparent-validation/pikvm/images/pin_schem.jpg new file mode 100644 index 00000000000..0eea79cb069 Binary files /dev/null and b/transparent-validation/pikvm/images/pin_schem.jpg differ diff --git a/transparent-validation/pikvm/images/soldered_pins.jpg b/transparent-validation/pikvm/images/soldered_pins.jpg new file mode 100644 index 00000000000..4d5f4988dfb Binary files /dev/null and b/transparent-validation/pikvm/images/soldered_pins.jpg differ diff --git a/transparent-validation/pikvm/images/usb_cable.jpg b/transparent-validation/pikvm/images/usb_cable.jpg new file mode 100644 index 00000000000..a5b8bf0afe7 Binary files /dev/null and b/transparent-validation/pikvm/images/usb_cable.jpg differ diff --git a/transparent-validation/rte/introduction/index.html b/transparent-validation/rte/introduction/index.html new file mode 100644 index 00000000000..6f729a353cb --- /dev/null +++ b/transparent-validation/rte/introduction/index.html @@ -0,0 +1,5979 @@ + + + + + + + + + + + + + + + + + + Introduction - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    RTE Introduction

    +

    RTE is +certified Open Source Hardware, +so based on published +schematics +you can build and modify PCB yourself.

    +

    RTE is a hat designed for Orange Pi Zero board which runs specially crafted +Linux distribution using the Yocto Project. RTE boards are used for controlling +Device Under Test fully remotely through the network interface. Most common +applications are:

    +
      +
    • debugging tasks,
    • +
    • flashing firmware,
    • +
    • controlling GPIOs
    • +
    • power management for Device Under Test.
    • +
    +

    +

    Where to buy?

    +

    RTE can be also bought in our 3mdeb shop.

    +

    Full Remote Testing Environment set includes:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CategoryDescriptionQuantity
    shieldRemote Testing Environment v1.1.01
    control unitOrange Pi Zero 256MB RAM version1
    power supplyMicroUSB 5V/2A1
    storageSanDisk 16GB microSD card (with preinstalled compatible system)1
    clipPomona 8-pin SOIC clip for Device Under Test SPI interface1
    cablesstandard female-female connection wire 2.56mm raster8
    cablesIDC 8-pin wires for Device Under Test SPI interface1
    cablesDC Jack - DC Jack power cable for Device Under Test1
    cablesRS232 D-Sub 9P/9P cable for serial communication1
    jumpersjumper for UART OUTPUT SELECT header2
    spacersPolyamide M3 spacers and bolts4
    +

    Why choose 3mdeb RTE?

    +
      +
    • +

      high accessibility and flexibility

      +
      +

      test your device from any location.

      +
      +
    • +
    • +

      efficiency

      +
      +

      simplify validation: write one script and run it on unlimited platforms. + Don’t repeat yourself!

      +
      +
    • +
    • +

      independent development

      +
      +

      open hardware license: modify, upgrade and set it as you like. All blueprints + are at your disposal.

      +
      +
    • +
    • +

      instant setup

      +
      +

      intuitive connection: you do not need to be a certified engineer.

      +
      +
    • +
    • +

      automation

      +
      +

      time is money: let the machine do all the work for you

      +
      +
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/rte/revision-history/index.html b/transparent-validation/rte/revision-history/index.html new file mode 100644 index 00000000000..2658e0a2c79 --- /dev/null +++ b/transparent-validation/rte/revision-history/index.html @@ -0,0 +1,6113 @@ + + + + + + + + + + + + + + + + + + Revision History - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Revision history

    +

    v1.1.0

    +
      +
    • added Open hardware logo
    • +
    • added SW1 reset button
    • +
    • added D5 relay state LED indicator
    • +
    • added J16 2x3pin UART OUTPUT SELECT header
    • +
    • added J18 1x2pin UART1 header
    • +
    • added 1.8V stabilizer
    • +
    • populated SPI Vcc pin
    • +
    • modified capacitors near MAX3232 SOIC
    • +
    • reduced OC buffers GPIO header (J11) from 12 to 9 pin
    • +
    • eliminated issue with J6 USB port (unreliable detection of USB devices)
    • +
    +

    v1.0.0

    +
      +
    • added RoHS logo
    • +
    • added Crossed Wheelie Bin logo
    • +
    • modified footprints of the pin headers
    • +
    +

    v0.5.3

    +
      +
    • enlarged added holes
    • +
    +

    v0.5.2

    +
      +
    • modified I2C GPIO expander outputs connections (now 4 of them are connected to + the dedicated header)
    • +
    • modified version number on board
    • +
    • removed SPI header for APU recovery with output pin role information labels
    • +
    • removed 7 and 8 pin of SPI header with GPIO expander connection
    • +
    +

    v0.5.1

    +
      +
    • added micro USB connector for power supply
    • +
    • added 5 V power supply pins
    • +
    • added SPI connector for APU SPI recovery
    • +
    • added fiducials on the bottom layer
    • +
    • added pins information labels
    • +
    • modified relay control system elements placement
    • +
    • modified SPI connector for APU paths placement
    • +
    • modified project text descriptions
    • +
    • removed 2 pin GPIO expander connector
    • +
    +

    v0.5

    +
      +
    • added 5 V power supply signal diode (red) + limiting current resistor
    • +
    • added 3.3 V power supply signal diode (orange) + limiting current resistor
    • +
    • relay NO/NC connection switched to the previous configuration
    • +
    • switched SPI1_MISOwith SPI1_MOSI output
    • +
    • mirrored RS232 socket pads
    • +
    • removed I2C pull-up resistors
    • +
    +

    v0.3.6

    +
      +
    • relay NO/NC connection switched
    • +
    +

    v0.3.5

    +
      +
    • enlarged the hole diameter by 0.1 mm
    • +
    +

    v0.3.4

    +
      +
    • added 3mdeb logo and board name on PCB
    • +
    • modified elements marks placing
    • +
    +

    v0.3.3

    +
      +
    • added SPI output IO pins connection with GPIO
    • +
    • added PCB mechanical schematic
    • +
    • added I2C INT pins connection
    • +
    • added mounting holes
    • +
    • added fiducials
    • +
    • modified MOSFET transistor pinout numeration
    • +
    • modified USB footprint from horizontal to vertical
    • +
    • modified I2C GPIO expander with OC buffers connection
    • +
    +

    v0.3.2

    +
      +
    • added mounting holes
    • +
    • modified relay pinout
    • +
    • removed I2C to GND connection
    • +
    +

    v0.3.1

    +
      +
    • modified power supply from 5V to 3V3 for I2C bus MCP23017, and MAX3232
    • +
    • removed capacitors connected to the I2C bus
    • +
    +

    v0.3

    +
      +
    • added I2C bus with output header
    • +
    • added MCP23017 I2C GPIO expander
    • +
    • added second SN74LS06 OC buffer
    • +
    • added relay with required neighboring items
    • +
    • added MAX3232 RS232 electrical level changer
    • +
    • added RS232 socket
    • +
    • added GPIO output header for pins unused to OC buffer control
    • +
    • modified some of input pins connection
    • +
    • removed ARK joint for the relay module
    • +
    • removed header for relay module control
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/rte/v1.1.0/flashing-guide/index.html b/transparent-validation/rte/v1.1.0/flashing-guide/index.html new file mode 100644 index 00000000000..12550287135 --- /dev/null +++ b/transparent-validation/rte/v1.1.0/flashing-guide/index.html @@ -0,0 +1,5985 @@ + + + + + + + + + + + + + + + + + + Flashing Guide - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Flashing guide

    +

    This document describes how to set up external flashing for the devices using +RTE.

    +

    NS5x/7x 12th Generation

    +

    Prerequisites

    + +

    Flashing

    +
      +
    1. Unscrew the bottom cover of the laptop.
    2. +
    3. +

      Disconnect the battery

      +
      +

      All power must be removed from the laptop during flashing.

      +
      +

      +
    4. +
    5. +

      Localize the flash chip.

      +

      +
    6. +
    7. +

      Take the WSON8 probe and locate the white dot on the needles side. The dot + indicates the first reference pin that should be connected to the pin on the + flash chip also marked with a dot.

      +

      +
    8. +
    9. +

      Connect the cables coming out from the WSON8 probe to the + SPI header according to the pictures and table + below.

      +
        +
      • Top view of flash chip:
      • +
      +

      +
        +
      • +

        Table with all required connections:

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        RTE SPI headerFlash Chip
        VccVCC
        CSCS#
        MISO (SO)SO (IO1)
        GNDVSS
        SCLKSCLK
        MOSI (SI)SI
        +
        +

        Note: both the SPI header and the WSON8 probe have 8-pin headers. +Pins marked as NC on the RTE board and as IO2 and IO3 on the flash chip +do not require a connection.

        +
        +
      • +
      • +

        Example connection appearance:

        +
      • +
      +

      +
    10. +
    11. +

      Put the flash script on RTE:

      +
      +

      The next steps require the device with Linux OS, it is possible to do this +on e.g. Windows, but the procedure will be different.

      +
      +
        +
      1. +

        Open the terminal and run the following commands:

        +
        git clone https://github.com/3mdeb/RteCtrl.git
        +cd RteCtrl/scripts/
        +
        +
      2. +
      3. +

        Use scp to transfer flash script, in places marked with XX enter the + RTE IP address, which you can check with the command ip a:

        +
        scp flash.sh root@XX.XX.XX.XX:/home/root/
        +
        +
      4. +
      +
    12. +
    13. +

      Login to RTE via ssh or minicom.

      +
    14. +
    15. Connect and hold the WSON8 probe to the flash chip.
    16. +
    17. +

      Read the flash chip by executing the following command on RTE:

      +
      ./flash.sh read dump.rom
      +
      +
    18. +
    19. +

      If the reading was successful, the output from the command above should + contain the phrase Verifying flash... VERIFIED.. Only after the entire + script has been executed, the WSON8 probe can be disconnected.

      +
    20. +
    21. Connect and hold again the WSON8 probe to the flash chip.
    22. +
    23. +

      Write the flash chip by executing the following command on RTE:

      +
      ./flash.sh write coreboot.rom
      +
      +
    24. +
    25. +

      If the writing was successful, the output from the command above should + contain the phrase Verifying flash... VERIFIED.. Only after the entire + script has been executed, the WSON8 probe can be disconnected.

      +
    26. +
    27. Reconnect the battery and screw in the bottom cover.
    28. +
    29. Power on the device. If the platform is booting up and basic functionalities + are working, the entire procedure was successful.
    30. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/rte/v1.1.0/quick-start-guide/index.html b/transparent-validation/rte/v1.1.0/quick-start-guide/index.html new file mode 100644 index 00000000000..598c6b87f67 --- /dev/null +++ b/transparent-validation/rte/v1.1.0/quick-start-guide/index.html @@ -0,0 +1,5960 @@ + + + + + + + + + + + + + + + + + + Quick Start Guide - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Quick start guide

    +

    The canonical example of RTE usage is hooking it to some hardware for SPI +flashing, power control and serial logs gathering. This document describes the +common preparation of RTE without listed functions.

    +

    +

    Prerequisites

    +
      +
    • RTE board + (this document is based on v1.1.0)
    • +
    • Micro-USB 5V 2.5A power supply
    • +
    • Orange Pi
    • +
    • SD card
    • +
    • Ethernet cable
    • +
    • USB-UART converter with 3 wire cables
    • +
    • Ubuntu (based on 22.04)
    • +
    +

    Preparation of RTE

    +
      +
    1. Download the latest version of the RTE image from the + meta-rte repository.
    2. +
    3. +

      Flash the SD card using bmaptool or balenaEtcher.

      +
        +
      1. to do this by balenaEtcher go to the producer site + and follow his procedure on how to download and flash an SD card.
      2. +
      3. +

        to do this by bmaptool reproduce the following steps:

        +
          +
        1. +

          install bmaptool by opening the terminal and typing the following + command:

          +
          sudo apt install bmap-tools
          +
          +
        2. +
        3. +

          create the bmap by typing the following command:

          +
          bmaptool create /path/to/your/image > /path/where/you/want/bmap/file/saved/bmapfilename.bmap
          +
          +
        4. +
        5. +

          flash image to the SD card by typing the following command:

          +
          sudo bmaptool copy --bmap ~/path/where/your/bmap/file/is/located /path/where/your/image/is/located /path/to/memory/device
          +
          +
        6. +
        +
      4. +
      +
    4. +
    5. +

      Insert Orange Pi into RTE.

      +
    6. +
    7. Insert SD card into Orange Pi.
    8. +
    9. Connect the ethernet cable to Orange Pi.
    10. +
    11. +

      Plug the USB-UART converter into your computer and connect its pins with + RTE J2 Header. (you may need a + USB extension cable)

      + + + + + + + + + + + + + + + + + + + + + +
      UART ConverterRTE J2 Header
      GNDGND
      TXDRX
      RXDTX
      +
    12. +
    13. +

      Open the serial connection with RTE from your PC using a previously connected + USB-UART converter by executing the following command:

      +
      sudo minicom -D /dev/ttyUSB<x>
      +
      +
      +

      Substitute <x> with the device number corresponding to your USB-UART +Converter for example /dev/ttyUSB0. The dmesg command allows to +identify the latest connected devices.

      +
      +
    14. +
    15. +

      Plug the power supply into the RTE J17 Micro-USB slot.

      +
    16. +
    17. Login into the device by using the default credentials:
        +
      • Login: root
      • +
      • Password: meta-rte
      • +
      +
    18. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/rte/v1.1.0/reference-os/index.html b/transparent-validation/rte/v1.1.0/reference-os/index.html new file mode 100644 index 00000000000..ef03487ac78 --- /dev/null +++ b/transparent-validation/rte/v1.1.0/reference-os/index.html @@ -0,0 +1,5810 @@ + + + + + + + + + + + + + + + + + + RTE Reference OS - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo RTE Reference OS

    +

    Our specially crafted operating system fully customized for Remote Testing +Environment platform aspects. meta-rte is based on open-source project - +Yocto Project used for building Linux-based systems regardless of the +hardware architecture. meta-rte has most mandatory tools and dependencies +required for everyday debugging task with various range of hardware. RTE running +meta-rte is ready to use completely out of the box, without the need for +additional laborious configuration.

    +

    Moreover, open-source solutions such as the Yocto Project and meta-rte +provides possibility to rebuild the whole system strictly for the end users +requirements, making the whole set more universal with endless applications!

    +

    More information can be found in meta-rte repository

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/rte/v1.1.0/serial-port-connection-guide/index.html b/transparent-validation/rte/v1.1.0/serial-port-connection-guide/index.html new file mode 100644 index 00000000000..106c151555e --- /dev/null +++ b/transparent-validation/rte/v1.1.0/serial-port-connection-guide/index.html @@ -0,0 +1,5934 @@ + + + + + + + + + + + + + + + + + + Serial Port Connection Guide - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Serial port connection guide

    +

    This document describes how to set up a serial connection between RTE and +another device.

    +

    Prerequisites

    +
      +
    • Prepared RTE
    • +
    • Two jumpers
    • +
    • Choose one of the following cables depending on the connectivity to your + platform:
        +
      • RS232<->RJ45 cable,
      • +
      • RS232<->RS232 cable,
      • +
      • USB<->RS232 cable,
      • +
      • micro-USB<->USB cable,
      • +
      • 3-wire cable.
      • +
      +
    • +
    +

    Setting serial connection

    +
      +
    1. +

      Put the two jumpers on + RTE J16 Header:

      +
        +
      1. For the RS232 port, they join COM and RS232 rows both on RX and TX + columns.
      2. +
      3. For the UART port (only during using a 3-wire cable), they join COM and + EXT rows both on RX and TX columns.
      4. +
      5. For the micro-USB-USB cable, jumpers aren't required.
      6. +
      +
    2. +
    3. +

      Connect the RTE header (J14 or J18) with the device serial port. Use the + cable according to the DUT specification:

      +
        +
      1. DUT has a serial port -> needs to use an RS232<->RS232 cable.
      2. +
      3. DUT has the debug port in the form of the RJ45 -> needs to use an + RS232<->RJ45 cable.
      4. +
      5. DUT has the debug port in the form of the USB -> needs to use an + RS232<->USB cable.
      6. +
      7. DUT has the debug port in the form of the micro-USB -> needs to use a + micro-USB<->USB cable.
      8. +
      9. DUT doesn't have a port but has pins for serial connection on the board + -> need to use a 3-wire cable.
      10. +
      +
    4. +
    5. +

      Connect with RTE via ssh or minicom. To connect via ssh is required to + know RTE IP and connection to the internet on both sides. While using a + minicom there is a need to use the USB-UART converter.

      +
    6. +
    7. +

      There are two ways to open a serial connection:

      +
        +
      1. +

        Telnet - by executing the following command:

        +
        telnet 192.168.X.X 13541
        +
        +
        +

        To configure telnet connections, update the file /etc/ser2net.conf +using vim. Then reboot the RTE to apply the changes. The dmesg +command allows to identify the latest connected devices.

        +
        +
      2. +
      3. +

        Minicom - by executing the following command:

        +
        minicom -D /dev/ttyS1 -o -b 115200
        +
        +
        +

        Replace ttyS1 with ttyUSB0 while using micro-USB-USB cable.

        +
        +
      4. +
      +
    8. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/rte/v1.1.0/specification/index.html b/transparent-validation/rte/v1.1.0/specification/index.html new file mode 100644 index 00000000000..0dfc1bfaa4b --- /dev/null +++ b/transparent-validation/rte/v1.1.0/specification/index.html @@ -0,0 +1,6458 @@ + + + + + + + + + + + + + + + + + + Specification - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    RTE elements

    +

    +
      +
    • UART0 header - 1x3 Orange Pi Zero system debug output and console + (pins: RX, TX, GND).
    • +
    • SPI header - 2x4 standard 2.5mm IDC compatible header with all necessary + signals to flash SPI chips.
    • +
    • Orange Pi Zero GPIO - 1x3 GPIO pin header directly connected to Orange Pi + zero platform.
    • +
    • I2C header - 1x4 populated pins: 3.3V, SCK, SDA, GND.
    • +
    • OC buffers output - 1x12 GPIO pin header connected to Open Collector buffers.
    • +
    • DUT power control connectors - 2x DC jack 5.5/2.1mm female connectors for + a Device Under Test power supply controlled directly through the relay.
    • +
    • Reset button - Simple switch to reset RTE
    • +
    • RS232 - DB9 male connector for RS232 communication with a hardware flow control.
    • +
    • UART output select header 2x3 UART OUTPUT SELECT header destined for + selecting serial output between UART1 header and DB9 RS232 connector.
    • +
    • UART1 header - 1x3 UART header for 3V3 serial communication with DUT + (pins: RX, TX, GND).
    • +
    • 2x USB connectors - Connect additional storages, external flash + programmers, USB-RS232 or USB-UART converters.
    • +
    • 5V header - 1x2 5V output populated pins: 5V, GND.
    • +
    • expander GPIO - 1x4 GPIO pin header connected to GPIOs expander with no + OC buffers.
    • +
    • Relay - Controls Device Under Tests power supply
    • +
    • micro USB connector - Connector for powering up RTE and OrangePi Zero + setup.
    • +
    +

    Product features

    +

    Key features

    +
      +
    • Cheaper and more feature-rich in comparison to other products
    • +
    • Ultra-fast SPI flashing (16MHz)
    • +
    • In-Circuit Programming (program onboard SPI Flash)
    • +
    • Pomona connector to work with Serial Flash soldered on board
    • +
    • Two logic levels SPI (1.8V and 3.3V)
    • +
    • Remote power control over the target device
    • +
    • Open Hardware
    • +
    • Open Source software attached
    • +
    • Open Source REST API controller
    • +
    • Cost-free future software improvements
    • +
    +

    RteCtrl: Web interface

    +

    +

    RteCtrl is a REST API controller used for RTE board. It comes with meta-rte +operating system and starts automatically on port 8000 without the necessity +of additional configuration. REST API dashboard can be reached through the +Internet browser and provides a possibility to:

    +
      +
    • control Device Under Test power supply (coldboot and warmboot)
    • +
    • reset Device Under Test platform
    • +
    • flash Device Under Test firmware +More information can be found at RteCtrl repository
    • +
    +
    +

    DISCLAIMER: Before starting the flashing procedure through REST API console, + make sure that appropriate SPI logic levels are set accordingly to + SPI section.

    +
    +

    Specification

    +

    GPIO header (1)

    +

    First GPIO header (J1) is a 1x3 pin header straight type 2.54mm pitch. It is +derived directly from Orange Pi GPIOs for general use. By default, these GPIOs +are set to INPUT mode.

    +

    Maximum voltage for all data signals: 3.3 V.

    +

    + + + + + + + + + + + + + + + + + + + + + +
    DescriptionPin #
    GPIO121
    GPIO112
    GPIO63
    +

    +

    GPIO header (2)

    +

    Second GPIO header (J10) is a 1x4 pin header straight type 2.54mm pitch. It is +derived from GPIO expander on RTE board. They are accessible for general use. By +default, these GPIOs are set to INPUT mode.

    +

    Maximum voltage for all data signals: 3.3 V. +Expander GPIO: 25 mA maximum output current.

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    DescriptionPin #
    GPIO4001
    GPIO4012
    GPIO4023
    GPIO4034
    +

    +

    GPIO header (3)

    +

    Third GPIO header (J11) is a 1x9 pin header straight type 2.54mm pitch. It is +derived from GPIO expander on RTE board with an additional connection to OC +(Open Collector) buffers. By default, these GPIOs are set to OUTPUT mode.

    +

    Maximum voltage for all data signals: 3.3 V. +OC buffers: 40 mA maximum output current.

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DescriptionPin #
    GPIO4071
    GPIO4152
    GPIO4143
    GPIO4084
    GPIO4095
    GPIO4106
    GPIO4117
    GPIO4128
    GPIO4139
    +

    +

    I2C header

    +

    I2C header (J9) is 1x4 pin header straight type 2.54mm pitch. It is used to +rather low-speed applications such as reading sensors or accessing DACs and ADCs.

    +

    Maximum voltage for all data signals: 3.3 V.

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    DescriptionPin #
    3V31
    SCK2
    SDA3
    GND4
    +

    +

    SPI header

    +

    SPI header (J7) is a 2x4 pin header straight type 2.54mm pitch. It is used to +control the application SPI flash with a minimal set of connections.

    +

    Maximum voltage for all data signals: 3.3 V.

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DescriptionPin #Pin #Description
    Vcc12GND
    CS34SCLK
    MISO (SO)56MOSI (SI)
    ISP78NC
    +

    +

    Revision v1.1.0 features new possibilities for SPI configuration:

    +
      +
    • SPI Vcc pin has been populated - power is now supplied to the SPI Vcc +connector and can be enabled/disabled on demand:
    • +
    +

    + + + + + + + + + + + + + + + + + +
    GPIO406 (OC_OUT1) stateSPI Vcc
    0 - lowdisabled (by default)
    1 - highenabled
    +

    +
      +
    • user can choose the voltage level for Vcc SPI - either 1.8V or 3.3 V:
    • +
    +

    + + + + + + + + + + + + + + + + + +
    GPIO405 (OC_OUT2) stateSPI Vcc voltage level
    0 - low1.8 V (by default)
    1 - high3.3 V
    +

    +
      +
    • user can enable/disable SPI lines (some platforms have problems when booting + with SPI wires connected):
    • +
    +

    + + + + + + + + + + + + + + + + + +
    GPIO404 (OC_OUT3) stateSPI lines (MOSI/MISO/CS/SCLK)
    0 - lowdisabled (by default)
    1 - highenabled
    +

    +

    UART OUTPUT SELECT header

    +

    UART OUTPUT SELECT header (J16) is a 2x3 pin header straight type 2.54mm pitch. +It is used for enabling serial communication output: RS232 DB9 port (J14) or +UART1 header (J18). If jumpers are not attached, serial ports are disabled.

    +

    + + + + + + + + + + + + + + + + + + + + +
    Jumper position (TX)Jumper position (RX)Serial communication enabled
    RS232 + COMRS232 + COMRS232 DB9 port (J14)
    EXT + COMEXT + COM3.3V UART1 header (J18)
    +

    +

    RS232 connector

    +

    RS232 connector (J14) is a DB9 male 9 pin connector for serial communication +between Remote Testing Environment and Device Under Test platform. It supports +a hardware flow control. RS232 connector can be enabled/disabled according to +UART OUTPUT SELECT section.

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Pin #SignalDescription
    1DCDData Carrier Detect
    2RXDReceive Data
    3TXDTransmit Data
    4DTRData Terminal Ready
    5GNDSignal Ground
    6DSRData Set Ready
    7RTSRequest to Send
    8CTSClear to Send
    9RIRing Indicator
    +

    +

    UART0 header

    +

    UART0 header (J2) is a 1x3 pin header straight type 2.54mm pitch. It is +derived from Orange Pi Zero serial debug UART for debugging and serial +communication purposes.

    +

    Maximum voltage for all data signals: 3.3 V.

    +

    + + + + + + + + + + + + + + + + + + + + + +
    DescriptionPin #
    GND1
    RX2
    TX3
    +

    +

    UART1 header

    +

    UART1 header (J18) is a 1x3 pin header straight type 2.54mm pitch. It is used +for serial communication with DUT. UART1 header can be enabled/disabled +according to UART OUTPUT SELECT section.

    +

    Maximum voltage for all data signals: 3.3 V.

    +

    + + + + + + + + + + + + + + + + + + + + + +
    DescriptionPin #
    GND1
    RX2
    TX3
    +

    +

    Power output header

    +

    Power output header (J15) is 1x2 pin header straight type 2.54mm pitch. It is +used for additional 5V or ground pin connections with various devices.

    +

    + + + + + + + + + + + + + + + + + +
    DescriptionPin #
    5V1
    GND2
    +

    +

    DC jack

    +

    Two DC Jacks (J12 and J13) are 5.5/2.1mm female plug connectors used for +Device Under Test power supply. The output from DC Jacks is controlled through a +relay. There is no matter whether J12 or J13 plug is input/output for power +supply.

    +

    Relay

    +

    Relay (K1) is a mechanical switch for controlling Device Under Test power +supply.

    +

    Technical reference:

    +
      +
    • 1 Form C (1PDT) contact arrangement
    • +
    • 5 V coil nominal voltage
    • +
    • 70 Ohms nominal resistance
    • +
    • 72 mA nominal current
    • +
    • 24 VDC maximal input voltage
    • +
    • 10 A maximal input voltage
    • +
    • Expected relay life: 100 000 operations
    • +
    +

    Relay state is indicated by LED (D5) located near relay and can be controlled +via meta-rte operating system through GPIO199:

    +

    + + + + + + + + + + + + + + + + + + + + +
    GPIO199 stateRelay stateD5 LED state
    0OFFOFF
    1ONON
    +

    +

    USB connectors

    +

    USB connectors (J6, J8) available on RTE are additional USB type A ports +derived from Orange Pi Zero header. They can be used for storage extension, +serial communication through various adapters or USB programmer extension.

    +

    microUSB connector

    +

    The micro USB connector (J17) is a USB B micro socket for powering up RTE and +OrangePi Zero setup. It is required to use a 5V/2A power adapter. There is no +difference whether the user plugs the power supply to the micro USB connector +located on RTE board or use OrangePi Zero original socket.

    +

    Reset button

    +

    Reset button (SW1) located near relay is used for resetting the RTE itself.

    +

    How to set GPIO states to flash SPI?

    +
      +
    1. +

      Set proper SPI Vcc Voltage:

      +

      Adequate Vcc voltege is necessary for successful flash procedure. If it will +be to low chip will not recognize any signals, if too high chip will be +damaged.

      +
      echo 0 > /sys/class/gpio/gpio405/value
      +
      +

      Or when flash chip operates on 3.3V:

      +
      echo 1 > /sys/class/gpio/gpio405/value
      +
      +
    2. +
    3. +

      Enable SPI Vcc:

      +
      echo 1 > /sys/class/gpio/gpio406/value
      +
      +
    4. +
    5. +

      Enable SPI signals:

      +
      echo 1 > /sys/class/gpio/gpio404/value
      +
      +
    6. +
    7. +

      Flash SPI chip:

      +
      flashrom -w /path/to/coreboot.rom -p linux_spi:dev=/dev/spidev1.0,spispeed=16000
      +
      +
    8. +
    9. +

      When done, change back all states:

      +
      echo 0 > /sys/class/gpio/gpio405/value
      +
      +echo 0 > /sys/class/gpio/gpio406/value
      +
      +echo 0 > /sys/class/gpio/gpio404/value
      +
      +
    10. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/sd-wire/getting-started/index.html b/transparent-validation/sd-wire/getting-started/index.html new file mode 100644 index 00000000000..a47c433869f --- /dev/null +++ b/transparent-validation/sd-wire/getting-started/index.html @@ -0,0 +1,5811 @@ + + + + + + + + + + + + + + + + + + Getting started - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    SDWire is a small board with two features

    +
      +
    • SD card reader
    • +
    • SD card MUX
    • +
    +

    SDWire allows to flash SD card connected to the DUT (Device Under Test), +without physical contact with the device. There is only one micro USB socket for +connecting to host PC. Both USB mass storage and MUX control are served through +the same USB connection.

    +

    The PCB board is designed in such way that it fits into micro SD card slots. +Thanks to this, there is no need for special cables with a micro SD +adapter, like in the muxPi product.

    +

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/sd-wire/specification/index.html b/transparent-validation/sd-wire/specification/index.html new file mode 100644 index 00000000000..525a71c09cc --- /dev/null +++ b/transparent-validation/sd-wire/specification/index.html @@ -0,0 +1,5864 @@ + + + + + + + + + + + + + + + + + + Specification - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware design

    +

    Design of this board is based on SD MUX. SDWire +does not have power switch or USB switch but has built in USB SD card reader. SD +card multiplexer itself is exactly the same in both devices.

    +

    There are four LEDs on the board:

    +
    red - power presence from USB
    +blue - USB reader activity
    +blue - card connected to TS (Test Server)
    +green - card connected to DUT (Device Under Test)
    +
    +

    All LEDs are present on both sides of the board to make them visible no matter +which side of the board will be facing you.

    +

    LED positions are showed in the image below.

    +

    +

    Source: wiki.tizen.org

    +

    PCB elements and scheme

    +

    +

    +

    +

    Source: wiki.tizen.org

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/transparent-validation/sd-wire/usage-validation/index.html b/transparent-validation/sd-wire/usage-validation/index.html new file mode 100644 index 00000000000..6062a7b179d --- /dev/null +++ b/transparent-validation/sd-wire/usage-validation/index.html @@ -0,0 +1,6142 @@ + + + + + + + + + + + + + + + + + + Usage - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    SDWire usage

    +

    Environment preparation

    +

    SDWire has dedicated software which is a simple tool meant to control the +hardware. Source code of the tool is published on tizen git server. +This is simple to use, command-line utility software written in C and based on +open-source libFTDI library.

    +

    To prepare the environment reproduce the following steps:

    +
      +
    1. +

      Clone the repository:

      +
      git clone https://git.tizen.org/cgit/tools/testlab/sd-mux
      +
      +
    2. +
    3. +

      Install all needed dependencies:

      +

      Ubuntu/Debian:

      +
      sudo apt-get install libftdi1-dev libpopt-dev cmake
      +
      +

      Fedora/Red Hat:

      +
      sudo dnf install libftdi-devel popt-devel cmake gcc gcc-c++
      +
      +
    4. +
    5. +

      Enter into sd-mux project directory and reproduce the following steps to + build project:

      +
        +
      • open directory in terminal
      • +
      • +

        create 'build' directory by the following command:

        +
        mkdir build
        +
        +
      • +
      • +

        enter into 'build' directory by the following command:

        +
        cd build
        +
        +
      • +
      • +

        run the following commands one by one:

        +
        cmake ..
        +make
        +
        +
      • +
      +
    6. +
    7. +

      In the above-described directory (sd-mux/build) run the following command to + build binary:

      +
      sudo make install
      +
      +

      Note, that the above-described command installs binary into '/usr/local/bin'. +If you want to install files in directory rather than the default one add an +argument to cmake command:

      +
      cmake -DCMAKE_INSTALL_PREFIX=/usr ..
      +
      +

      Then it is obligatory to run again the following commands:

      +
      make
      +make install
      +
      +
    8. +
    +

    First use

    +
    +

    The following procedure should be performed not only before the first use of +the device, but also as the presale validation procedure!

    +
    +

    Hardware requirements:

    +
      +
    • SDWire
    • +
    • SD card
    • +
    • DUT (Device Under Test) bootable from SD card (for example: RPI, Orange PI + etc.)
    • +
    • DUT power supply
    • +
    • Micro-USB --> USB cable
    • +
    • TS (Test Server) - in most cases personal computer with prepared environment.
    • +
    +

    To perform first use (assuming Raspberry Pi platform as a DUT) procedure +reproduce the following steps:

    +
      +
    1. Prepare environment in accordance with this + section.
    2. +
    3. Insert SD card to the SDWire.
    4. +
    5. Put SDWire into the DUT (Device Under Test).
    6. +
    7. Prepare a micro USB --> USB cable. It will be used to connect SDWire to TS + (Test Server).
    8. +
    9. +

      Check whether SDWire is configured by reproducing the following steps:

      +
        +
      • +

        run in TS terminal the following command:

        +
        dmesg -w
        +
        +
      • +
      • +

        connect the SDWire to your machine using micro-USB --> USB cable.

        +
      • +
      • +

        after connecting your dmesg output should looks like this:

        +
        (...)
        +[73278.307591] usb-storage 3-1.1:1.0: USB Mass Storage device detected
        +[73278.307823] scsi host6: usb-storage 3-1.1:1.0
        +[73278.384925] usb 3-1.2: new full-speed USB device number 45 using xhci_hcd
        +[73278.492025] usb 3-1.2: New USB device found, idVendor=0403, idProduct=6015, bcdDevice=10.00
        +[73278.492027] usb 3-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
        +[73278.492028] usb 3-1.2: Product: FT200X USB I2C
        +[73278.492029] usb 3-1.2: Manufacturer: FTDI
        +[73278.492030] usb 3-1.2: SerialNumber: DB007V7V
        +(...)
        +
        +
      • +
      • +

        open new terminal window and run the following command:

        +
        sudo  sd-mux-ctrl --list
        +
        +

        If output looks like below, it means that SDWire is configured and ready +to use. Now, you can go to point 6 in this section.

        +
        Number of FTDI devices found: 1
        +Dev: 0, Manufacturer: SRPOL, Serial: sd-wire_11, Description: sd-wire
        +
        +

        Otherwise, if output shows no devices (like in the example below):

        +
        Number of FTDI devices found: 0
        +
        +

        you have to configure SDWire:

        +
        sudo sd-mux-ctrl --device-serial=DB007V7V --vendor=0x0403 --product=0x6015 --device-type=sd-wire --set-serial=sd-wire_11
        +
        +

        where:

        +
        --device-serial=<SerialNumber> (from dmesg output)
        +
        +--vendor=0x<idVendor> (from dmesg output)
        +
        +--product=0x<idProduct> (from dmesg output)
        +
        +--set-serial=<New serial device>
        +
        +

        After above-desribed procedure check again if SDWire is properly +configured:

        +
        sudo  sd-mux-ctrl --list
        +
        +

        Should output:

        +
        Number of FTDI devices found: 1
        +Dev: 0, Manufacturer: SRPOL, Serial: sd-wire_11, Description: sd-wire
        +
        +
      • +
      +
    10. +
    11. +

      Connect SD card to the TS (Test Server):

      +
      sudo sd-mux-ctrl --device-serial=sd-wire_11 --ts
      +
      +
    12. +
    13. +

      Flash the SD card using bmaptool or balenaEtcher.

      +
        +
      • download the OS image for the target DUT - link for RPi image
      • +
      • to do this by balenaEtcher go to the producer site +and follow his procedure how to download and flash SD card
      • +
      • +

        to do this by bmaptool reproduce the following steps:

        +
          +
        • +

          install bmaptool by opening terminal and typing the following command:

          +
          sudo apt install bmap-tools
          +
          +
        • +
        • +

          create the bmap by typing the following command:

          +
          bmaptool create /path/to/your/image > /path/where/you/want/bmap/file/saved/bmapfilename.bmap
          +
          +
        • +
        • +

          flash image to the SD card by typing the following command:

          +
          sudo bmaptool copy --bmap ~/path/where/your/bmap/file/is/located /path/where/your/image/is/located /path/to/memory/device
          +
          +
        • +
        +
      • +
      +
    14. +
    15. +

      Connect SD card to the DUT using sd-mux-ctrl:

      +
      sudo sd-mux-ctrl --device-serial=sd-wire_11 --dut
      +
      +
    16. +
    17. +

      Connect power supply to the DUT and check if it boots properly from newly + burned image.

      +
    18. +
    +

    Everyday use scenario

    +
      +
    1. Disconnect power supply from the DUT (Device Under Test).
    2. +
    3. Disconnect micro SD card from the DUT.
    4. +
    5. Connect micro SD card to the TS (Test Server) using card reader.
    6. +
    7. Flash the SD card.
    8. +
    9. Connect SD card to the DUT.
    10. +
    11. Connect power supply to the DUT.
    12. +
    13. Boot DUT from new image.
    14. +
    +

    Using SDWire there is no need to disconnect SD card from DUT.

    +

    SDWire with RTE use scenario

    +
      +
    1. Insert SD card to the SDWire.
    2. +
    3. Insert SDWire into the DUT and connect it to the TS with micro-USB --> USB + cable.
    4. +
    5. Connect RTE power control connectors to the DUT (RTE here is + optional but highly recommended for remote work, because it helps with + automated and remote power control of the connected device).
    6. +
    7. +

      Check serial no. of SDWire:

      +
      sudo  sd-mux-ctrl --list
      +
      +

      Output:

      +
      Number of FTDI devices found: 1
      +Dev: 0, Manufacturer: SRPOL, Serial: sd-wire_11, Description: sd-wire
      +
      +
    8. +
    9. +

      Disconnect power supply using RTE.

      +
    10. +
    11. +

      Connect SD card to the TS (using sd-mux-ctrl)

      +
      sudo sd-mux-ctrl --device-serial=sd-wire_11 --ts
      +
      +
    12. +
    13. +

      Flash the SD card using bmaptool or balenaEtcher as described in the + First use section

      +
    14. +
    15. +

      Connect SD card to the DUT (using sd-mux-ctrl)

      +
      sudo sd-mux-ctrl --device-serial=sd-wire_11 --dut
      +
      +
    16. +
    17. +

      Connect power supply using RTE.

      +
    18. +
    19. +

      DUT should boot from freshly burned SD card.

      +
      +

      Command sudo sd-mux-ctrl --device-serial=sd-wire_11 --status returns +information if SDWire is connected to DUT or TS.

      +
      +
        ~ sudo sd-mux-ctrl --device-serial=sd-wire_11 --status
      +SD connected to: TS
      +
      +

      At the moment RTE does not support sd-mux-ctrl, so SDWire must be controlled +from configured TS (Test Server).

      +
    20. +
    +
    +

    References & Projects:

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/index.html b/unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/index.html new file mode 100644 index 00000000000..591bb0497ff --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/100-coreboot-base-port/index.html @@ -0,0 +1,6095 @@ + + + + + + + + + + + + + + + + + + Coreboot Base Port - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo: coreboot base port

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Connect to the UART debug interface and open a serial console.
    4. +
    +

    CBP001.001 Boot into coreboot stage bootblock

    +

    Test description

    +

    This test aims to verify that DUT during booting procedure reaches +stage bootblock. The bootblock is the first stage executed after CPU reset, +its main task is to set up everything for a C-environment.

    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power ON the DUT.
    2. +
    3. By using the serial console read the booting procedure stage.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Read the booting procedure stage.
    4. +
    +

    Expected result

    +
      +
    1. +

      The console output should contain string with the phrase:

      +
      bootblock starting
      +
      +
    2. +
    +

    CBP002.001 Boot into coreboot stage romstage

    +

    Test description

    +

    This test aims to verify that DUT during booting procedure reaches +stage romstage. The romstage initializes the DRAM and prepares everything +for device init.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power ON the DUT.
    2. +
    3. By using the serial console read the booting procedure stage.
    4. +
    +

    Expected result

    +
      +
    1. +

      The console output should contain string with the phrase:

      +
      romstage starting
      +
      +
    2. +
    +

    CBP003.001 Boot into coreboot stage postcar

    +

    Test description

    +

    This test aims to verify that DUT during booting procedure reaches +stage postcar. The postcar tears down CAR and loads the ramstage.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power ON the DUT.
    2. +
    3. By using the serial console read the booting procedure stage.
    4. +
    +

    Expected result

    +
      +
    1. +

      The console output should contain string with the phrase:

      +
      postcar starting
      +
      +
    2. +
    +

    CBP004.001 Boot into coreboot stage ramstage

    +

    Test description

    +

    This test aims to verify that DUT during booting procedure reaches +stage ramstage. The ramstage does the main device init.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power ON the DUT.
    2. +
    3. By using the serial console read the booting procedure stage.
    4. +
    +

    Expected result

    +
      +
    1. +

      The console output should contain string the with phrase:

      +
      ramstage starting
      +
      +
    2. +
    +

    CBP005.001 Resource allocator v4 - gathering requirements

    +

    Test description

    +

    This test aims to verify that DUT reaches the gathering requirements +stage for Resource Allocator v4 during booting procedure.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power ON the DUT.
    2. +
    3. By using the serial console read the booting procedure stage.
    4. +
    +

    Expected result

    +
      +
    1. +

      The console output should contain a string with the phrase:

      +
      Pass 1 (gathering requirements)
      +
      +
    2. +
    +

    CBP006.001 Resource allocator v4 - allocating resources

    +

    Test description

    +

    This test aims to verify that DUT reaches the allocating resources stage for +Resource Allocator v4 during booting procedure.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power ON the DUT.
    2. +
    3. By using the serial console read the booting procedure stage.
    4. +
    +

    Expected result

    +
      +
    1. +

      The console output should contain a string with the phrase:

      +
      Pass 2 (allocating resources)
      +
      +
    2. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/301-memory-hcl/index.html b/unified-test-documentation/dasharo-compatibility/301-memory-hcl/index.html new file mode 100644 index 00000000000..8ed349dcb7a --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/301-memory-hcl/index.html @@ -0,0 +1,5882 @@ + + + + + + + + + + + + + + + + + + Memory HCL - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: Memory HCL

    +

    HCL001.001 Memory HCL - boot into OS (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the DUT can boot with the memory +module combinations specified in the HCL.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Prepare the memory modules specified in the HCL.
    2. +
    3. Proceed with the + Generic test setup: firmware.
    4. +
    5. Proceed with the + Generic test setup: OS installer.
    6. +
    7. Proceed with the + Generic test setup: OS installation.
    8. +
    +

    Test steps

    +
      +
    1. Insert the memory module into the DUT's memory port, starting with the first + position from the HCL.
    2. +
    3. Power on the DUT.
    4. +
    5. Boot into the system.
    6. +
    7. Power off the DUT.
    8. +
    9. Repeat the test steps for all positions in the HCL.
    10. +
    +

    Expected result

    +
      +
    1. The expected result is that the OS boots successfully with all memory + combinations specified in the HCL
    2. +
    3. If the OPERATING_SYSTEM boots, note the success and power the DUT OFF
    4. +
    5. If the OPERATING_SYSTEM doesn't boot, check the logs (optional - if + connected over serial console) for the + FSP Memory Init has returned an error and note the failure
    6. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/303-custom-boot-menu-key/index.html b/unified-test-documentation/dasharo-compatibility/303-custom-boot-menu-key/index.html new file mode 100644 index 00000000000..d41eeb008a3 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/303-custom-boot-menu-key/index.html @@ -0,0 +1,5899 @@ + + + + + + + + + + + + + + + + + + Custom Boot Keys - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: Custom Boot Keys

    +

    CBK001.001 Custom Boot Menu Key

    +

    Test description

    +

    This test aims to verify that the DUT is configured to use custom Boot Menu +hotkey (if it exists).

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the Boot Menu.
    4. +
    +

    Expected result

    +

    The DUT boots into the Boot Menu after using the specified hotkey.

    +

    CBK002.001 Custom BIOS Menu Key

    +

    Test description

    +

    This test aims to verify that the DUT is configured to use custom BIOS Menu +hotkey.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BIOS_MENU_KEY to enter the BIOS menu.
    4. +
    +

    Expected result

    +

    The DUT boots into the BIOS menu after using the specified hotkey.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/304-custom-logo/index.html b/unified-test-documentation/dasharo-compatibility/304-custom-logo/index.html new file mode 100644 index 00000000000..e8c77b47d7e --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/304-custom-logo/index.html @@ -0,0 +1,5875 @@ + + + + + + + + + + + + + + + + + + Custom Logo - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: Custom Logo

    + +

    Test description

    +

    This test aims to verify that the DUT is configured to display the specified +(customized) logo at boot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the boot logo to appear.
    4. +
    +

    Expected result

    +

    The displayed logo should depend on the Dasharo variant:

    +
      +
    • if the Dasharo variant is NovaCustom - the NovaCustom logo should be displayed,
    • +
    • if the Dasharo variant is Protectli - the Protectli logo should be displayed,
    • +
    • if the Dasharo variant is Tuxedo - the Tuxedo logo should be displayed,
    • +
    • for all other variants Dasharo custom logo should be displayed.
    • +
    +

    Keep in mind that the end-user's customized boot logo might also be displayed - +if before the custom logo checking procedure described in the +Logo customization +documentation has been performed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/index.html b/unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/index.html new file mode 100644 index 00000000000..457ba32f199 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/306-usb-hid-and-msc-support/index.html @@ -0,0 +1,6328 @@ + + + + + + + + + + + + + + + + + + USB HID and MSC support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: USB HID and MSC Support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    USB001.001 USB devices detection (firmware)

    +

    Test description

    +

    This test aims to verify that the external USB devices are detected +correctly by the firmware and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Connect the flash drive using the USB port.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Enter the boot menu using the BIOS_SETUP_KEY.
    4. +
    5. Select the Boot Menu, press Enter and note the result.
    6. +
    +

    Expected result

    +
      +
    1. Flash drive entry is listed in the boot menu.
    2. +
    +

    USB001.002 USB devices detection in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the external USB devices are detected +correctly by the OPERATING_SYSTEM and all basic keys work according to their +labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      watch -n1 lsusb
      +
      +
    8. +
    9. +

      Connect external USB devices to DUT USB A port and note the result.

      +
    10. +
    +

    Expected result

    +
      +
    1. After each device is connected to the USB port, a new USB device entry + in lsusb command output should appear.
    2. +
    +

    USB001.003 USB devices detection in OS (Windows 11)

    +

    Test description

    +

    This test aims to verify that the external USB devices are detected correctly +by the OPERATING_SYSTEM and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open PowerShell and and run the following command:

      +
      Get-PnpDevice -PresentOnly | Where-Object { $_.InstanceId -match '^USB' }
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    +

    Expected result

    +
      +
    1. +

      After executing the command, a list containing all USB devices should +be displayed. All devices' status should be OK.

      +

      Example output:

      +
      Status     Class           FriendlyName
      +------     -----           ------------
      +OK         DiskDrive       Mass Storage Device USB Device
      +OK         USB             Generic USB Hub
      +OK         HIDClass        USB Input Device
      +OK         Bluetooth       Intel(R) Wireless Bluetooth(R)
      +OK         USB             USB Root Hub (USB 3.0)
      +OK         Net             TP-LINK Gigabit Ethernet USB Adapter
      +OK         USB             Generic USB Hub
      +OK         USB             USB Mass Storage Device
      +
      +
    2. +
    +

    USB002.001 USB keyboard detection (firmware)

    +

    Test description

    +

    This test aims to verify that the external USB keyboard is detected correctly +by the firmware and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Connect the external USB keyboard using the USB port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT
    2. +
    3. Enter the boot menu using the BIOS_SETUP_KEY.
    4. +
    5. Use the arrow keys, Esc key and the Enter key to navigate the menus.
    6. +
    +

    Expected result

    +
      +
    1. All menus can be entered using the external USB keyboard.
    2. +
    +

    USB002.002 USB keyboard detection (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the external USB keyboard is detected correctly +by the OPERATING_SYSTEM and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install libinput-tools on the DUT.
    4. +
    5. Connect the external USB keyboard using the USB port.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    8. +
    9. +

      Run the following command in the terminal:

      +
      libinput debug-events --show-keycodes
      +
      +
    10. +
    11. +

      Test the alphanumeric keys and note the generated keycodes.

      +
    12. +
    13. Test non-alphanumeric keys and verify that they generate the correct + keycodes.
    14. +
    15. Test key combinations with the Shift, Ctrl and Alt modifier keys + (this tests 2-key rollover).
    16. +
    +

    Expected result

    +
      +
    1. The external USB keyboard is detected in OS.
    2. +
    3. All standard keyboard keys generate the correct keycodes and events as per + their labels.
    4. +
    5. Key combinations are detected correctly.
    6. +
    +

    USB002.003 USB keyboard detection (Windows 11)

    +

    Test description

    +

    This test aims to verify that the external USB keyboard is detected correctly +by the OPERATING_SYSTEM and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect the external USB keyboard using the USB port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open PowerShell and run the following command:

      +
      Get-CimInstance win32_KEYBOARD
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. Open notepad.
    12. +
    13. Test the alphanumeric keys and note the generated characters.
    14. +
    15. Test non-alphanumeric keys and verify that they generate the signs.
    16. +
    17. Test key combinations with the Shift, and Alt modifier keys.
    18. +
    19. Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. + Check if On-Screen Keyboard correctly highlights it.
    20. +
    21. Open Start menu and press Esc. Check if Start menu is properly closed.
    22. +
    +

    Expected result

    +
      +
    1. +

      After running the PowerShell command information about connected keyboard + should be displayed.

      +

      Example output:

      +
      Caption                     : Enhanced (101- or 102-key)
      +Description                 : USB Input Device
      +InstallDate                 :
      +Name                        : Enhanced (101- or 102-key)
      +Status                      : OK
      +Availability                :
      +ConfigManagerErrorCode      : 0
      +ConfigManagerUserConfig     : False
      +CreationClassName           : Win32_Keyboard
      +DeviceID                    : USB\VID_046D&PID_C31C&MI_00\6&26C21341&0&0000
      +ErrorCleared                :
      +ErrorDescription            :
      +LastErrorCode               :
      +PNPDeviceID                 : USB\VID_046D&PID_C31C&MI_00\6&26C21341&0&0000
      +PowerManagementCapabilities :
      +PowerManagementSupported    : False
      +StatusInfo                  :
      +SystemCreationClassName     : Win32_ComputerSystem
      +SystemName                  : DESKTOP-CUR9H2J
      +IsLocked                    :
      +Layout                      : 00000409
      +NumberOfFunctionKeys        : 12
      +Password                    :
      +PSComputerName              :
      +
      +
    2. +
    3. +

      All standard keyboard keys generate correct characters + or actions when pressed.

      +
    4. +
    5. Key combinations are detected correctly.
    6. +
    +

    USB003.001 Upload 1GB file on USB storage (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the 1GB file can be transferred from the +OPERATING_SYSTEM to the USB storage.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    5. USB storage - at least 1GB of free space
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command to generate 1GB file:

      +
      openssl rand -out test_file.txt -base64 $(( 2**30 * 3/4 ))
      +
      +
    8. +
    9. +

      Plug in the USB storage to the USB port.

      +
    10. +
    11. +

      Read the path to the USB storage by running the following command:

      +
      lsblk
      +
      +
    12. +
    13. +

      Copy the generated file to the USB storage by running the following + command:

      +
      cp test_file.txt {path_to_usb_storage}
      +
      +
    14. +
    15. +

      Verify that the files are the same by running the following command:

      +
      sha256sum test_file.txt {path_to_usb_storage}/test_file.txt
      +
      +
    16. +
    +

    Expected result

    +

    The output from the last command should contain 2 identical checksums:

    +
    f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb  test_file.txt
    +f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb  {path_to_usb_storage}/test_file.txt
    +
    +

    USB003.002 Upload 1GB file on USB storage (Windows 11)

    +

    Test description

    +

    This test aims to verify that the 1GB file can be transferred from the +OPERATING_SYSTEM to the USB storage.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    5. USB storage - at least 1GB of free space
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open powershell as administrator and run the following command to generate + 1GB file:

      +
      fsutil file createnew test_file.txt 1073741824
      +
      +
    8. +
    9. +

      Plug in the USB storage to the USB port.

      +
    10. +
    11. +

      Read the drive letter assigned to the USB storage by running the following + command:

      +
      (Get-Volume | where drivetype -eq removable).driveletter
      +
      +
    12. +
    13. +

      Copy the generated file to the USB storage by running the following + command:

      +
      Copy-Item -Path C:\Windows\system32\test_file.txt {drive_letter}:
      +
      +
    14. +
    15. +

      Verify that the files are the same by running the following commands:

      +
      Get-FileHash test_file.txt
      +Get-FileHash {drive_letter}:\test_file.txt
      +
      +
    16. +
    +

    Expected result

    +

    The output from the last commands should have equal hash:

    +
    Algorithm       Hash                                                              Path
    +---------       ----                                                              ----
    +SHA256          F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB  C\Windows\system3...
    +
    +
    Algorithm       Hash                                                              Path
    +---------       ----                                                              ----
    +SHA256          F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB  E:\test_file.txt
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/307-freebsd-support/index.html b/unified-test-documentation/dasharo-compatibility/307-freebsd-support/index.html new file mode 100644 index 00000000000..7a230720c26 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/307-freebsd-support/index.html @@ -0,0 +1,5888 @@ + + + + + + + + + + + + + + + + + + FreeBSD support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: FreeBSD support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installation.
    4. +
    +

    BSD001.001 FreeBSD installation and boot

    +

    Test description

    +

    This test verifies that FreeBSD distribution could be installed on +the DUT and works properly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = FreeBSD 13
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot and note the result.
    4. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/index.html b/unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/index.html new file mode 100644 index 00000000000..9e3d373f90e --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/308-debian-stable-and-ubuntu-lts-support/index.html @@ -0,0 +1,6145 @@ + + + + + + + + + + + + + + + + + + Debian Stable and Ubuntu LTS support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Debian Stable and Ubuntu LTS support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    LBT001.001 Debian Stable installation on USB storage

    +

    Test description

    +

    This test aims to verify that Debian Stable distribution could be installed +on USB storage attached to the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process. As disk choose the USB stick.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    LBT001.002 Boot Debian from USB

    +

    Test description

    +

    This test aims to verify that Debian Stable distribution could be booted +from USB storage attached to the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the USB_STORAGE on which the system was + previously installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    LBT002.001 Ubuntu LTS installation on USB storage

    +

    Test description

    +

    This test aims to verify that Ubuntu LTS modern distribution could be +installed on USB storage attached to the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process. As disk choose the USB stick.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    LBT002.002 Boot Ubuntu from USB

    +

    Test description

    +

    This test aims to verify that Ubuntu LTS modern distribution could be booted +from USB storage attached to the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the USB_STORAGE on which the system was + previously installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    LBT003.001 Debian Stable installation on Hard Disk

    +

    Test description

    +

    This test aims to verify that Debian Stable distribution could be installed +on the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process. As disk choose the mounted in the + DUT Hard Disk.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    LBT003.002 Boot Debian from Hard Disk

    +

    Test description

    +

    This test aims to verify that Debian Stable distribution could be booted from +the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the hard disk on which the system was previously + installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    LBT004.001 Ubuntu LTS installation on Hard Disk

    +

    Test description

    +

    This test aims to verify that Ubuntu LTS modern distribution could be +installed on the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process. As disk choose the mounted in the + DUT Hard Disk.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    LBT004.002 Boot Ubuntu From Hard Disk

    +

    Test description

    +

    This test aims to verify that Ubuntu LTS modern distribution could be booted +from the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the hard disk on which the system was previously + installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/309-qubesos-support/index.html b/unified-test-documentation/dasharo-compatibility/309-qubesos-support/index.html new file mode 100644 index 00000000000..fd7eaa69d78 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/309-qubesos-support/index.html @@ -0,0 +1,5922 @@ + + + + + + + + + + + + + + + + + + QubesOS support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: QubesOS support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    QBS001.001 QubesOS installation

    +

    Test description

    +

    This test aims to verify that QubesOS Stable distribution could be installed.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = QubesOS 4.1.1
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    QBS001.002 Boot QubesOS

    +

    Test description

    +

    This test aims to verify that QubesOS Stable distribution could be booted.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = QubesOS 4.1.1
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the DISK on which the system was + previously installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/30A-custom-network-boot-entries/index.html b/unified-test-documentation/dasharo-compatibility/30A-custom-network-boot-entries/index.html new file mode 100644 index 00000000000..89a1c2e95e0 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/30A-custom-network-boot-entries/index.html @@ -0,0 +1,5868 @@ + + + + + + + + + + + + + + + + + + Custom Network Boot entries - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Custom Network Boot entries

    +

    CNB001.002 Only one iPXE in boot menu

    +

    Test description

    +

    This test aims to verify that thenetwork boot option with iPXE appears only +once in the boot option list.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Check the iPXE is listed only once on the boot option list.
    6. +
    +

    Expected result

    +
      +
    1. There is only one iPXE entry on the boot option list.
    2. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/index.html b/unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/index.html new file mode 100644 index 00000000000..14104ec64e9 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/30L-memtest-payload-support/index.html @@ -0,0 +1,6052 @@ + + + + + + + + + + + + + + + + + + Memtest payload support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Memtest payload support

    +

    MEM001.001 Memtest availability

    +

    Test description

    +

    This test aims to verify that the Memtest entry is available in DUT boot + menu.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Check if Payload [memtest] is available in the boot menu.
    8. +
    +

    Expected result

    +

    The Payload [memtest] option should be visible as the one of boot menu options.

    +

    MEM002.001 Enter Memtest

    +

    Test description

    +

    This test aims to verify that the DUT enters the Memtestboot option.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Select the key with a proper number for Payload [memtest].
    8. +
    9. Check if Memtest86+ is available.
    10. +
    +

    Expected result

    +

    The Memtest86+ is visible at the top of the output.

    +

    MEM003.001 Memtest stability

    +

    Test description

    +

    This test aims to verify that the Memtest starts does not hang under DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Select the key with a proper number for Payload [memtest].
    8. +
    9. Check if State: - Running... is available.
    10. +
    +

    Expected result

    +

    The State: - Running... is visible after a few seconds and confirms that the +the test is in progress.

    +

    MEM004.001 Memtest refreshing by 'L' key

    +

    Test description

    +

    This test aims to verify that DUT refreshes Memtest properly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Select the key with a proper number for BOOT_MENU_ENTRY.
    8. +
    9. Press the L key.
    10. +
    11. Check if L refreshes output.
    12. +
    +

    Expected result

    +

    The Memtest86+ is visible before and after pressing L.

    +

    MEM005.001 Memtest refreshing by 'l' key

    +

    Test description

    +

    This test aims to verify that DUT refreshes Memtest properly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Select the key with a proper number for BOOT_MENU_ENTRY.
    8. +
    9. Press the l key.
    10. +
    11. Check if l refreshes output.
    12. +
    +

    Expected result

    +

    The Memtest86+ is visible before and after pressing l.

    +

    MEM006.001 Memtest completing

    +

    Test description

    +

    This test aims to verify that DUT completes Memtest.

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Select the key with a proper number for Payload [memtest].
    8. +
    9. Make sure that State: - Running... is available.
    10. +
    11. Wait until ** Pass complete, no errors, press Esc to exit ** appears.
    12. +
    +

    Expected result

    +

    After the test completes without any errors +** Pass complete, no errors, press Esc to exit ** message is visible on the +bottom of the screen.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/30M-uefi-compatible-interface/index.html b/unified-test-documentation/dasharo-compatibility/30M-uefi-compatible-interface/index.html new file mode 100644 index 00000000000..d5277f689d6 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/30M-uefi-compatible-interface/index.html @@ -0,0 +1,5924 @@ + + + + + + + + + + + + + + + + + + UEFI compatible interface - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: UEFI compatible interface

    +

    EFI001.001 Boot into UEFI OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies the presence of UEFI compatible interface by booting +UEFI-aware Operating System.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Enter the boot menu using the BIOS_SETUP_KEY.
    4. +
    5. Select the Boot Menu and press Enter.
    6. +
    7. Select the USB stick and press Enter.
    8. +
    9. Select the Ubuntu (safe graphics) in the GRUB menu.
    10. +
    11. Wait for the OPERATING_SYSTEM to finalize booting, by either of the:
    12. +
    13. OPERATING_SYSTEM installer initialization,
    14. +
    15. login form initialization.
    16. +
    17. Power OFF the DUT.
    18. +
    +

    Expected result

    +
      +
    1. Either the login screen or the OPERATING_SYSTEM installer appears on the + internal LCD.
    2. +
    +

    EFI001.002 Boot into UEFI OS (Windows 11)

    +

    Test description

    +

    This test aims to verify the presence of UEFI compatible interface by booting +UEFI-aware Operating System.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Enter the boot menu using the BIOS_SETUP_KEY.
    4. +
    5. Select the Boot Menu and press Enter.
    6. +
    7. Select the USB stick and press Enter.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot finalize booting, by either of the:
    10. +
    11. OPERATING_SYSTEM installer initialization,
    12. +
    13. login form initialization.
    14. +
    15. Power OFF the DUT.
    16. +
    +

    Expected result

    +
      +
    1. Either the login screen or the OPERATING_SYSTEM installer appears on the + internal LCD.
    2. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/30P-uefi-shell/index.html b/unified-test-documentation/dasharo-compatibility/30P-uefi-shell/index.html new file mode 100644 index 00000000000..8bef2b982cb --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/30P-uefi-shell/index.html @@ -0,0 +1,5884 @@ + + + + + + + + + + + + + + + + + + UEFI Shell - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: UEFI Shell

    +

    USH001.001 UEFI Shell

    +

    Test description

    +

    This test aims to verify that the DUT has the ability to boot into an integrated +UEFI Shell application.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: Firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BOOT_MENU_KEY to enter the UEFI Boot + Menu.
    4. +
    5. Select the UEFI Shell option using the arrow keys and press Enter.
    6. +
    +

    Expected result

    +

    The DUT boots into an UEFI Shell successfully, as indicated by the example +console output shown on the screen:

    +
    UEFI Interactive Shell v2.2
    +EDK II
    +UEFI v2.70 (EDK II, 0x00010000)
    +Mapping table
    +      FS0: Alias(s):HD1b:;BLK2:
    +      PciRoot(0x0)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,9C-BB-50-01-BB-38-25-5
    +-4BB4-4FDD-9534-B097CD497222,0x800,0x100000)
    +      FS1: Alias(s):HD1c:;BLK3:
    +      PciRoot(0x0)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,9C-BB-50-01-BB-38-25-1
    +-C6AB-4400-AE03-0BF2960DD525,0x100800,0x1D0C5000)
    +     BLK1: Alias(s):
    +     PciRoot(0x0)/Pci(0x6,0x0)/Pci(0x0,0x0)/NVMe(0x1,9C-BB-50-01-BB-38-25-)
    +        BLK0: Alias(s):
    +        PciRoot(0x0)/Pci(0x14,0x0)/USB(0x0,0x2)
    +    Press ESC in 1 seconds to skip startup.nsh or any other key to continue.
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/310-fedora-support/index.html b/unified-test-documentation/dasharo-compatibility/310-fedora-support/index.html new file mode 100644 index 00000000000..e3ac9f49545 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/310-fedora-support/index.html @@ -0,0 +1,5922 @@ + + + + + + + + + + + + + + + + + + Fedora support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Fedora support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    FED001.001 Fedora installation

    +

    Test description

    +

    This test aims to verify that Fedora Stable distribution could be installed.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Fedora 37
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    FED001.002 Boot Fedora

    +

    Test description

    +

    This test aims to verify that Fedora Stable distribution could be booted.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Fedora 37
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the DISK on which the system was + previously installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/312-nvme-support/index.html b/unified-test-documentation/dasharo-compatibility/312-nvme-support/index.html new file mode 100644 index 00000000000..23f38efcac6 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/312-nvme-support/index.html @@ -0,0 +1,5971 @@ + + + + + + + + + + + + + + + + + + NVME support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: NVMe support

    +

    NVM001.001 NVMe support (firmware)

    +

    Test description

    +

    This test aims to verify that firmware is able to correctly +detect NVMe disk in the M.2 slot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Insert a NVMe disk into the M.2 slot on the DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. While the DUT is booting, hold the BOOT_MENU_KEY to enter + the UEFI Boot Menu and note the result.
    6. +
    +

    Expected result

    +
      +
    1. The NVMe disk should be listed on the bootable devices list.
    2. +
    +

    NVM001.002 NVMe support (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify booting the Operating System from NVMe disk in +the M.2 slot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Insert a NVMe disk into the M.2 slot on the DUT.
    4. +
    5. Proceed with the + Generic test setup: OS installer.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following command:
    8. +
    +
    sudo mount | grep 'on / '
    +
    +

    Expected result

    +
      +
    1. The OPERATING_SYSTEM has been booted from the NVMe disk correctly.
    2. +
    3. Output in Terminal indicates that system partition is installed on the NVMe + disk:
    4. +
    +
    /dev/nvme* on / tpe ext4 (rw,relatime,errors=remount-ro)
    +
    +

    NVM001.003 NVMe support in OS (Windows 11)

    +

    Test description

    +

    This test aims to verify booting the Operating System from NVMe disk in the +M.2 slot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Insert a NVMe disk into the M.2 slot on the DUT.
    4. +
    5. Proceed with the + Generic test setup: OS installer.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open PowerShell as administrator.
    8. +
    9. +

      Run below command and note the result:

      +
      Get-PnpDevice -Status "OK" | where { $_.InstanceId -like "SCSI\DISK&VEN_NVME&*"}
      +
      +
    10. +
    +

    Expected result

    +
      +
    1. The OPERATING_SYSTEM booting from the NVMe disk
    2. +
    3. +

      Command should output at least one NVMe drive. Similar as below:

      +
      Status     Class           FriendlyName
      +------     -----           ------------
      +OK         DiskDrive       Samsung SSD 980 PRO 500GB
      +
      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/315-network-boot/index.html b/unified-test-documentation/dasharo-compatibility/315-network-boot/index.html new file mode 100644 index 00000000000..548c3dce0d3 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/315-network-boot/index.html @@ -0,0 +1,6143 @@ + + + + + + + + + + + + + + + + + + Network boot - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Network Boot

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. The DUT should be connected to the Internet by using an Ethernet cable.
    4. +
    +

    PXE001.001 Dasharo Network Boot is bootable

    +

    Test description

    +

    This test aims to verify, that the iPXE Network boot is bootable in the boot +menu and whether, after selecting this boot option, Dasharo Network Boot Menu +is displayed.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the iPXE Network boot option using the arrow keys and press Enter.
    6. +
    +

    Expected result

    +
      +
    1. After selecting the iPXE Network boot, the Dasharo Network Boot Menu + should be displayed.
    2. +
    +

    PXE002.001 Dasharo network boot menu boot options order is correct

    +

    Test description

    +

    This test aims to verify that Dasharo Network Boot Menu contains all of the +needed options which are in the correct order.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the iPXE Network boot option using the arrow keys and press Enter.
    6. +
    +

    Expected result

    +
      +
    1. Dasharo Network Boot Menu contains all of the needed options.
    2. +
    3. Dasharo Network Boot Menu options are in order as follows:
    4. +
    +
    Autoboot
    +Dasharo Tools Suite
    +OS installation
    +iPXE Shell
    +
    +

    PXE003.001 Autoboot option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the Autoboot option in +Dasharo Network Boot Menu works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the iPXE Network boot option using the arrow keys and press Enter.
    6. +
    7. Select the Autoboot option using the arrow keys, then press Enter.
    8. +
    +

    Expected result

    +

    If the server assigned to the Autoboot option is available in the local +network, the boot menu should appear.

    +

    If the server assigned to the Autoboot option isn't available in the local +network, selecting this option will result in configuring the network interfaces +and return to the Setup Menu.

    +

    PXE004.001 DTS option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the Dasharo Tools Suite option in +Dasharo Network Boot Menu allows booting into DTS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = coreboot
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Proceed with the + Requirements for DTS.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the iPXE Network boot option using the arrow keys and press Enter.
    6. +
    7. Select the Dasharo Tools Suite option using the arrow keys, then press + Enter.
    8. +
    +

    Expected result

    +

    After configuring the network interfaces, connecting to the server and booting, +Dasharo Tools Suite menu should appear.

    +

    PXE005.001 OS installation option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the OS installation option in +Dasharo Network Boot Menu allows booting into netboot.xyz server.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = coreboot
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the iPXE Network boot option using the arrow keys and press Enter.
    6. +
    7. Select the OS installation option using the arrow keys and press Enter.
    8. +
    +

    Expected result

    +

    After configuring the network interfaces, connecting to the server and booting, +netboot.xyz menu should appear.

    +

    PXE006.001 iPXE shell option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the iPXE Shell option in +Dasharo Network Boot Menu works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. Select the iPXE Network boot option using the arrow keys and press Enter.
    6. +
    7. Select the iPXE Shell option using the arrow keys and press Enter.
    8. +
    9. +

      Obtain an IP address by executing the following command:

      +
      dhcp
      +
      +
    10. +
    11. +

      Load netboot.xyz server menu by executing the following command:

      +
      chain --autofree http://boot.netboot.xyz/
      +
      +
    12. +
    +

    Expected result

    +

    After configuring the network interfaces, connecting to the server and booting, +netboot.xyz menu should appear.

    +

    PXE007.001 iPXE network boot

    +

    Test description

    +

    This test aims to verify that the DUT is capable of network booting from a PXE +server.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the iPXE Network boot option using the arrow keys and press Enter.
    6. +
    7. Press Ctrl+B when prompted to stop iPXE from booting automatically.
    8. +
    9. Type in dhcp to obtain an IP address.
    10. +
    11. Type in chain --autofree http://boot.netboot.xyz/ to load a boot menu
    12. +
    13. Enter the "Live CDs" submenu using the arrow keys and Enter.
    14. +
    15. Select Debian -> Debian Live 11 (bullseye) -> Debian 11 Gnome and + press Enter.
    16. +
    +

    Expected result

    +
      +
    1. The iPXE application boots successfully.
    2. +
    3. iPXE obtains an IP address.
    4. +
    5. iPXE boots an Debian 11 from netboot.xyz.
    6. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/index.html b/unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/index.html new file mode 100644 index 00000000000..5e7f11c1013 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/315b-netboot-utilities/index.html @@ -0,0 +1,6177 @@ + + + + + + + + + + + + + + + + + + Network boot utilities - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Network boot utilities

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    NBT001.001 Netboot is available

    +

    Test description

    +

    This test aims to verify that the Network Boot and Utilities menu is +available and its content is right.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the Network Boot and Utilities option using the arrow keys and + press Enter.
    6. +
    +

    Expected result

    +
      +
    1. Network Boot and Utilities option should be present in the UEFI Boot Menu.
    2. +
    3. +

      After selecting the Network Boot and Utilities option the following + menu should appear:

      +
         ------------------------ Network Boot and Utilities ----------------------
      +   ------------------------ Please Select an Option -------------------------
      +   OS Selection & Utilities
      +   iPXE Boot
      +   iPXE Shell
      +   Advanced
      +
      +
    4. +
    +

    NBT002.001 OS Selection & Utilities is available

    +

    Test description

    +

    This test aims to verify that the OS Selection & Utilities menu is +available and its content is right.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the Network Boot and Utilities option using the arrow keys and press + Enter.
    6. +
    7. Select the OS Selection & Utilities option using the arrow keys and press + Enter.
    8. +
    +

    Expected result

    +
      +
    1. OS Selection & Utilities option should be present in the + Network Boot and Utilities menu.
    2. +
    3. After selecting the OS Selection & Utilities option iPXE menu should be + displayed.
    4. +
    +

    NBT003.001 iPXE boot is available

    +

    Test description

    +

    This test aims to verify that the iPXE Boot menu is available and it +content is right.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the Network Boot and Utilities option using the arrow keys and + press Enter.
    6. +
    7. Select the iPXE Boot option using the arrow keys and press Enter.
    8. +
    +

    Expected result

    +
      +
    1. iPXE Boot option should be present in the Network Boot and Utilities + menu.
    2. +
    3. After selecting the iPXE Boot option the autoboot procedure should be + started.
    4. +
    +

    NBT004.001 iPXE shell is available

    +

    Test description

    +

    This test aims to verify that the iPXE Shell menu is available and it +content is right.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the Network Boot and Utilities option using the arrow keys and press +Enter.
    6. +
    7. Select the iPXE Shell option using the arrow keys and press Enter.
    8. +
    +

    Expected result

    +
      +
    1. iPXE Shell option should be present in the Network Boot and Utilities + menu.
    2. +
    3. +

      After selecting the iPXE Shell option the following menu should appear:

      +
      You are now in iPXE shell. Type "exit" to go back to the main menu.
      +iPXE>
      +
      +
    4. +
    +

    NBT005.001 iPXE shell works correctly

    +

    Test description

    +

    This test aims to verify that the iPXE shell works correctly by configuring +network interface and booting from selected address.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the Network Boot and Utilities option using the arrow keys and press + Enter.
    6. +
    7. Select the iPXE Shell option using the arrow keys and press Enter.
    8. +
    9. +

      Configure communication interface by using the following command:

      +
      dhcp net0
      +
      +
    10. +
    11. +

      Connect to the DTS ipxe menu by using the following command:

      +
      chain http://boot.3mdeb.com/dts.ipxe
      +
      +
    12. +
    +

    Expected result

    +
      +
    1. Communication interface configuration procedure should be successful.
    2. +
    3. DTS boot menu should appear.
    4. +
    +

    NBT006.001 Advanced option is available

    +

    Test description

    +

    This test aims to verify that the Advanced menu is available and its content +is right.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the Network Boot and Utilities option using the arrow keys and press + Enter.
    6. +
    7. Select the Advanced option using the arrow keys and press Enter.
    8. +
    +

    Expected result

    +
      +
    1. Advanced option should be present in the Network Boot and Utilities + menu.
    2. +
    3. +

      After selecting the Advanced option the following menu should appear:

      +
         ------------------------ Network Boot and Utilities ----------------------
      +   ------------------------ Please Select an Option -------------------------
      +   Change Netboot iPXE Payload URL
      +   Exit
      +
      +
    4. +
    +

    NBT007.001 Change netboot URL works correctly

    +

    Test description

    +

    This test aims to verify that it's possible to change the netboot URL and boot +from it.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the Network Boot and Utilities option using the arrow keys and press + Enter.
    6. +
    7. Select the Advanced option using the arrow keys and press Enter.
    8. +
    9. Select the Change Netboot iPXE Payload URL option using the arrow keys and + press Enter.
    10. +
    11. Select the Change Netboot iPXE Payload URL option again using the arrow + keys and press Enter.
    12. +
    13. Replace the existing address with another iPXE payload URL address, for + example: http://boot.3mdeb.com/dts.ipxe.
    14. +
    15. Apply changes by selecting option Apply and Exit and pressing Enter.
    16. +
    17. Select the OS Selection & Utilities option using the arrow keys and press + Enter.
    18. +
    +

    Expected result

    +
      +
    1. Proper boot menu should appear.
    2. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/316-sdcard-reader/index.html b/unified-test-documentation/dasharo-compatibility/316-sdcard-reader/index.html new file mode 100644 index 00000000000..f8c991481da --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/316-sdcard-reader/index.html @@ -0,0 +1,6036 @@ + + + + + + + + + + + + + + + + + + SD card reader - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: SD Card Reader

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Insert an SD card into the SD Card reader.
    10. +
    +

    SDC001.001 SD Card reader detection (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the SD Card reader is enumerated correctly and +can be detected from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following command:
    8. +
    +
    lspci | grep RTS522A
    +
    +

    Expected result

    +

    The output from the command should contain the line:

    +
    2d:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. RTS522A PCI Express Card Reader (rev 01)
    +
    +

    SDC001.002 SD Card reader detection (Windows 11)

    +

    Test description

    +

    This test aims to verify that the SD Card reader is enumerated correctly and +can be detected from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open PowerShell as administrator.
    8. +
    9. +

      Run below command and note result:

      +
      Get-PnpDevice -Status "OK" -Class "MTD"
      +
      +
    10. +
    +

    Expected result

    +

    The output of the command should contain basic information about mounted +SD card reader.

    +

    Output example:

    +
    Status     Class           FriendlyName
    +------     -----           ------------
    +OK         MTD             Realtek PCIE CardReader
    +
    +

    SDC002.001 SD Card read/write (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the SD Card reader is initialized correctly and +can be used from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following commands as root:
    8. +
    +
    dd if=/dev/urandom of=/tmp/in.bin bs=4K count=100
    +dd if=/tmp/in.bin of=/dev/mmcblk0 bs=4K count=100
    +dd if=/dev/mmcblk0 of=/tmp/out.bin bs=4K count=100
    +sha256sum /tmp/in.bin /tmp/out.bin
    +
    +

    Expected result

    +

    The output from the last command should contain 2 identical checksums:

    +
    2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb  /tmp/in.bin
    +2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb  /tmp/out.bin
    +
    +

    SDC002.002 SD Card read/write (Windows 11)

    +

    Test description

    +

    This test aims to verify that the SD Card reader is initialized correctly and +can be used from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Determine the localization of the mounted SD card.
    8. +
    9. Open PowerShell as administrator.
    10. +
    11. +

      Run below commands and note results:

      +
      New-Item -Path "${drive_lacation}:\" -Name "testfile.txt" -ItemType "file" -Value "This is a test string."
      +Get-Content -Path "${drive_lacation}:\testfile.txt"
      +
      +
    12. +
    +

    Expected result

    +

    Last command should return This is a test string.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/317-usb-camera/index.html b/unified-test-documentation/dasharo-compatibility/317-usb-camera/index.html new file mode 100644 index 00000000000..e17987b5b32 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/317-usb-camera/index.html @@ -0,0 +1,5952 @@ + + + + + + + + + + + + + + + + + + USB camera - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: USB Camera

    +

    CAM001.001 USB Camera (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the integrated USB camera is initialized +correctly and can be accessed from the operating system

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Install ffprobe: sudo apt install ffmpeg.
    10. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and run the following commands:
    8. +
    +
    ffprobe /dev/video0
    +ffprobe /dev/video2
    +
    +

    Expected result

    +
      +
    1. +

      The output from the first command should contain the lines:

      +
      Input #0, video4linux2,v4l2, from '/dev/video0':
      +    Stream #0:0: Video: rawvideo (YUY2 / 0x32595559), yuyv422, 640x480, 147456 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
      +
      +
    2. +
    3. +

      The output from the second command should contain the lines:

      +
      Input #0, video4linux2,v4l2, from '/dev/video2':
      +    Stream #0:0: Video: rawvideo (Y800 / 0x30303859), gray, 640x360, 55296 kb/s, 30 fps, 30 tbr, 1000k tbn, 1000k tbc
      +
      +
    4. +
    +

    CAM001.002 USB Camera (Windows 11)

    +

    Test description

    +

    This test aims to verify that the integrated USB camera is initialized +correctly and can be accessed from the operating system

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Run PowerShell as administrator.
    8. +
    9. +

      Execute below command and note the result:

      +
      Get-PnpDevice -PresentOnly | Where-Object { $_.InstanceId -match '^USB' }
      +
      +
    10. +
    +

    Expected result

    +
      +
    1. +

      Output should contain Chicony USB2.0 Camera. Example output:

      +
      Status     Class           FriendlyName
      +------     -----           ------------
      +OK         Camera          Chicony USB2.0 Camera
      +OK         Bluetooth       Intel(R) Wireless Bluetooth(R)
      +OK         Camera          IR Camera
      +OK         USB             USB Root Hub (USB 3.0)
      +OK         USB             USB Root Hub (USB 3.0)
      +OK         USB             USB Composite Device
      +
      +
    2. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/index.html b/unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/index.html new file mode 100644 index 00000000000..ceae9510b25 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/318-m2-wifi-bluetooth/index.html @@ -0,0 +1,6173 @@ + + + + + + + + + + + + + + + + + + Wi-Fi and Bluetooth support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: M.2 WiFi/Bluetooth

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    WLE001.001 Wireless card detection (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly +and can be detected from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following command:
    8. +
    +
    lspci | grep "Network Controller"
    +
    +

    Expected result

    +

    The output of the command should contain information about mounted on the board +network controller.

    +

    Example output:

    +
    2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 (rev 1a)
    +
    +

    WLE001.002 Wireless card detection (Windows 11)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly +and can be detected from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open PowerShell and execute following command:

      +
      Get-PnpDevice -PresentOnly | Select-String -Pattern "Wi-Fi"
      +
      +
    8. +
    9. +

      Note the result.

      +
    10. +
    +

    Expected result

    +

    The output of the command should contain information about mounted on the board +network controller.

    +

    Example output:

    +
    Intel(R) Wi-Fi 6AX200 160MHz
    +
    +

    WLE002.001 Wi-Fi scanning (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi functionality of card is initialized +correctly and can be used from within the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Make sure to have any Wi-Fi signal available.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following commands as root:
    8. +
    +
    nmcli radio wifi on
    +nmcli device wifi rescan
    +# Wait ~5 seconds
    +nmcli device wifi list
    +
    +

    Expected result

    +

    The output of the last command should return a list of available Wi-Fi networks, +for example:

    +
    IN-USE  BSSID              SSID                    MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
    +        XX:XX:XX:XX:XX:XX  DIRECT-ny               Infra  6     65 Mbit/s   75      ▂▄▆_  WPA2
    +*       XX:XX:XX:XX:XX:XX  3mdeb_abr_5GHz          Infra  48    405 Mbit/s  72      ▂▄▆_  WPA2
    +        XX:XX:XX:XX:XX:XX  3mdeb_abr               Infra  11    54 Mbit/s   69      ▂▄▆_  WPA2
    +        XX:XX:XX:XX:XX:XX  FunBox2-F9BF_2.4GHz     Infra  1     130 Mbit/s  50      ▂▄__  WPA1 WPA2
    +        XX:XX:XX:XX:XX:XX  H_Office                Infra  2     270 Mbit/s  35      ▂▄__  WPA2
    +        XX:XX:XX:XX:XX:XX  DIRECT-xpPhaser 3330    Infra  1     65 Mbit/s   34      ▂▄__  WPA2
    +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  108   540 Mbit/s  32      ▂▄__  WPA2
    +        XX:XX:XX:XX:XX:XX  DIRECT-KRM288x Series   Infra  11    54 Mbit/s   22      ▂___  WPA2
    +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  11    130 Mbit/s  20      ▂___  WPA2
    +        XX:XX:XX:XX:XX:XX  DIRECT-ejPhaser 3330    Infra  1     65 Mbit/s   17      ▂___  WPA2
    +        XX:XX:XX:XX:XX:XX  NED-WIFI                Infra  11    270 Mbit/s  17      ▂___  WPA2
    +
    +

    WLE002.002 Wi-Fi scanning (Windows 11)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi functionality of card is initialized +correctly and can be used from within the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Make sure to have any Wi-Fi signal available
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open PowerShell and execute following command:

      +
      netsh wlan show network
      +
      +
    8. +
    9. +

      Note the result.

      +
    10. +
    +

    Expected result

    +

    The output of the command should return a list of available Wi-Fi networks.

    +

    Output example:

    +
    SSID 1 : Orange_Swiatlowod_A79A
    +    Network type            : Infrastructure
    +    Authentication          : WPA2-Personal
    +    Encryption              : CCMP
    +
    +SSID 2 : DIRECT-Y9Phaser 3330
    +    Network type            : Infrastructure
    +    Authentication          : WPA2-Personal
    +    Encryption              : CCMP
    +
    +SSID 3 : 3mdeb_abr_5GHz
    +    Network type            : Infrastructure
    +    Authentication          : WPA2-Personal
    +    Encryption              : CCMP
    +
    +SSID 4 : 3mdeb_abr
    +    Network type            : Infrastructure
    +    Authentication          : WPA2-Personal
    +    Encryption              : CCMP
    +
    +

    WLE003.001 Bluetooth scanning (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Bluetooth functionality of card is initialized +correctly and can be used from within the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Enable Bluetooth and make it discoverable in any device nearby DUT.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following commands:
    8. +
    +
    bluetoothctl
    +power on
    +scan on
    +# Wait ~5 seconds
    +devices
    +
    +

    Expected result

    +

    The output of the last command should return a list of detectable Bluetooth +devices, for example:

    +
    Device XX:XX:XX:XX:XX:XX Device 1
    +Device XX:XX:XX:XX:XX:XX Wojtek N
    +Device XX:XX:XX:XX:XX:XX Mi Smart Band 4
    +Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic (PHLM)
    +Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic (PHLM)
    +Device XX:XX:XX:XX:XX:XX Device 2
    +Device XX:XX:XX:XX:XX:XX [Signage] Samsung QMR Series
    +Device XX:XX:XX:XX:XX:XX [Signage] Samsung QMR Series
    +Device XX:XX:XX:XX:XX:XX Device 3
    +Device XX:XX:XX:XX:XX:XX Device 4
    +Device XX:XX:XX:XX:XX:XX Device 5
    +Device XX:XX:XX:XX:XX:XX Device 6
    +
    +

    WLE003.002 Bluetooth scanning (Windows 11)

    +

    Test description

    +

    This test aims to verify that the Bluetooth functionality of card is initialized +correctly and can be used from within the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Enable Bluetooth and make it discoverable in any device nearby DUT
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Enter Notification Center in the bottom right part of the screen.
    8. +
    9. Using right mouse button, click on the Bluetooth icon.
    10. +
    11. In shown drop-down menu click Go to settings.
    12. +
    13. Click the + icon described as Add Bluetooth or other device.
    14. +
    15. In the Add a device menu, click Bluetooth.
    16. +
    17. Wait a few moments until DUT scans for nearby Bluetooth devices and note + the result.
    18. +
    +

    Expected result

    +

    Available Bluetooth devices should appear in the Add a device window.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/index.html b/unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/index.html new file mode 100644 index 00000000000..e6a2a1890a6 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/319-nvidia-graphics/index.html @@ -0,0 +1,6078 @@ + + + + + + + + + + + + + + + + + + Nvidia Graphics support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: NVIDIA Graphics support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    NVI001.001 NVIDIA Graphics detect (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the NVIDIA graphics card is correctly +initialized and can be detected by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. +

      Open a terminal window and execute the following command:

      +
      lspci | grep -i nvidia
      +
      +
    2. +
    +

    Expected result

    +
      +
    1. +

      The command should return one line containing the name of the graphics + card, e.g:

      +
      2d:00.0 3D controller: NVIDIA Corporation TU117M (rev a1)
      +
      +
    2. +
    +

    NVI001.002 NVIDIA Graphics detect (Windows 11)

    +

    Test description

    +

    This test aims to verify that the NVIDIA graphics card is correctly +initialized and can be detected by the operating system

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the driver for the graphics card (GTX 1650) from + the official page.
    4. +
    +

    Test steps

    +
      +
    1. Run PowerShell as administrator and execute following command:
    2. +
    +
    Get-WmiObject -Class Win32_VideoController | Select Description, Name, Status
    +
    +

    Expected result

    +
      +
    1. +

      The output should contain the information about installed Nvidia Graphics + card.

      +

      Example output:

      +
      Description                  Name                         Status
      +-----------                  ----                         ------
      +Intel(R) Iris(R) Xe Graphics Intel(R) Iris(R) Xe Graphics OK
      +NVIDIA GeForce GTX 1650      NVIDIA GeForce GTX 1650      OK
      +
      +
    2. +
    +

    NVI002.001 NVIDIA Graphics power management (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the NVIDIA graphics power management is functional +and the card powers on only while it's used.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. +

      Install the package mesa-utils with the following command:

      +
      sudo apt install mesa-utils
      +
      +
    4. +
    +

    Test steps

    +
      +
    1. Open a terminal window.
    2. +
    3. +

      Run the following command to see whether the card is off:

      +
      cat /sys/class/drm/card1/device/power/runtime_status
      +
      +
    4. +
    5. +

      Launch a test application on the discrete graphics card using the following + command:

      +
      __NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia glxgears
      +
      +
    6. +
    7. +

      Run the following command to see whether the card has turned on:

      +
      cat /sys/class/drm/card1/device/power/runtime_status
      +
      +
    8. +
    9. +

      Close the test application and wait ~20 seconds to let the graphics card + shut itself down.

      +
    10. +
    11. +

      Run the following command to see whether the card has turned off again:

      +
      cat /sys/class/drm/card1/device/power/runtime_status
      +
      +
    12. +
    +

    Expected result

    +
      +
    1. The output from the first command should be the word suspended.
    2. +
    3. The output from the second command should be the word active.
    4. +
    5. The output from the third command should be the word suspended.
    6. +
    +

    NVI002.002 NVIDIA Graphics power management (Windows 11)

    +

    Test description

    +

    This test aims to verify that the NVIDIA graphics power management is functional +and the card powers on only while it's used.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the driver for the graphics card (GTX 1650) from + the official page.
    4. +
    5. Download and extract gputest from Geeks3D.
    6. +
    +

    Test steps

    +
      +
    1. Open the NVIDIA Control Panel window.
    2. +
    3. In the menu bar, open the Desktop menu.
    4. +
    5. Enable the Display GPU Activity Icon in Notification Area option.
    6. +
    7. Open the system tray located in the bottom right corner of the screen + and locate the GPU activity icon:
    8. +
    +

    GPU activity icon

    +
      +
    1. Open the previously extracted gputest directory and open the GPUTest_GUI + application.
    2. +
    3. Click on the Run stress test button to start the test application.
    4. +
    5. Locate the GPU activity icon and check that it indicates that the GPU has + powered on.
    6. +
    7. Close the test application.
    8. +
    9. Locate the GPU activity icon and check that it indicates that the GPU has + powered off again.
    10. +
    +

    Expected result

    +
      +
    1. The GPU activity icon should indicate that the GPU is OFF when no application + is using the GPU.
    2. +
    3. The GPU activity icon should indicate that the GPU is ON when an application + is using the GPU.
    4. +
    5. The GPU activity icon should indicate that the GPU is OFF again after the + test application is closed.
    6. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31A-windows-booting/index.html b/unified-test-documentation/dasharo-compatibility/31A-windows-booting/index.html new file mode 100644 index 00000000000..a6bfa1aa627 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31A-windows-booting/index.html @@ -0,0 +1,5923 @@ + + + + + + + + + + + + + + + + + + Windows booting - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    + +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Windows booting

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: Firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installation.
    4. +
    +

    WBT001.001 Windows 11 installation and boot

    +

    Test description

    +

    This test aims to verify that Windows 11 OS could be installed on the DUT +and works properly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot and note the result.
    4. +
    +

    Expected result

    +

    The Windows 11 login screen should be displayed.

    +

    WBT002.001 Windows 10 installation and boot

    +

    Test description

    +

    This test aims to verify that Windows 10 OS could be installed on the DUT +and works properly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 10
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot and note the result.
    4. +
    +

    Expected result

    +

    The Windows 10 login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/index.html b/unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/index.html new file mode 100644 index 00000000000..32b1c233e28 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31E-display-ports-and-lcd/index.html @@ -0,0 +1,6333 @@ + + + + + + + + + + + + + + + + + + Display ports and LCD - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Display ports and LCD support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    DSP001.001 Internal LCD in firmware

    +

    Test description

    +

    This test aims to verify initialization of the laptop's embedded LCD screen +during firmware execution phase.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Observe the internal LCD during firmware execution phase.
    4. +
    5. Power off the DUT.
    6. +
    +

    Expected result

    +
      +
    1. Logo appears on the screen during firmware execution phase.
    2. +
    +

    DSP001.002 Internal LCD in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify initialization of the laptop's embedded LCD in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Observe the internal LCD after the OPERATING_SYSTEM has booted.
    8. +
    +

    Expected result

    +
      +
    1. Either the login screen or the OPERATING_SYSTEM installer appears on the + internal LCD.
    2. +
    +

    DSP001.003 Internal LCD in OS (Windows 11)

    +

    Test description

    +

    This test aims to verify initialization of the laptop's embedded LCD in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log in by using the proper login and password.
    6. +
    7. Observe the internal LCD after the OPERATING_SYSTEM has booted.
    8. +
    +

    Expected result

    +
      +
    1. Either the login screen or the OPERATING_SYSTEM installer appears on the + internal LCD.
    2. +
    +

    DSP002.001 External HDMI display in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify initialization of the external HDMI display in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect an HDMI cable to the DUT and a display.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log in by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Mirror and + Join Displays.
    8. +
    +

    Expected result

    +
      +
    1. The image should be displayed on the external HDMI display in Mirror and + Join Displays modes.
    2. +
    +

    DSP002.002 External HDMI display in OS (Windows 11)

    +

    Test description

    +

    This test aims to verify initialization of the external HDMI display in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect a HDMI cable to the DUT and a display.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log in by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Duplicate + and Extend.
    8. +
    +

    Expected result

    +
      +
    1. The image should be displayed on the external HDMI display in Duplicate + and Extend modes.
    2. +
    +

    DSP002.003 External HDMI display in firmware

    +

    This test aims to verify initialization of the external HDMI display +during firmware execution phase.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Connect an HDMI cable to the DUT and a display.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Observe the external HDMI display during firmware execution phase.
    4. +
    5. Power off the DUT.
    6. +
    +

    Expected result

    +
      +
    1. Logo appears on the screen during firmware execution phase.
    2. +
    +

    DSP003.001 External DP display in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify initialization of the external Display Port connected +in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect a Display Port cable to the DUT and a display.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log in by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Mirror and + Join Displays.
    8. +
    +

    Expected result

    +
      +
    1. The image should be displayed on the external Display Port connected display + in Mirror and Join Displays modes.
    2. +
    +

    DSP003.002 External DP display in OS (Windows 11)

    +

    Test description

    +

    This test aims to verify initialization of the external Display Port connected +display in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect a Display Port cable to the DUT and a display.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log in by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Duplicate + and Extend.
    8. +
    +

    Expected result

    +
      +
    1. The image should be displayed on the external Display Port connected display + in Duplicate and Extend modes.
    2. +
    +

    DSP003.003 External DP display in firmware

    +

    This test aims to verify initialization of the external Display Port connected +display during firmware execution phase.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Connect a Display Port cable to the DUT and a display.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Observe the external Display Port connected display during firmware + execution phase.
    4. +
    5. Power off the DUT.
    6. +
    +

    Expected result

    +
      +
    1. Logo appears on the screen during firmware execution phase.
    2. +
    +

    DSP004.001 External VGA display in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify initialization of the external VGA in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect a video input connector to the VGA and a display.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log the by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Mirror and + Join Displays.
    8. +
    +

    Expected result

    +
      +
    1. The image should be displayed on the external VGA connected display in + Mirror and Join Displays modes.
    2. +
    +

    DSP004.002 External VGA display in OS (Windows 11)

    +

    Test description

    +

    This test aims to verify initialization of the external VGA in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect a video input connector to the VGA and a display.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log the by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Duplicate + and Extend.
    8. +
    +

    Expected result

    +
      +
    1. The image should be displayed on the external Display Port connected display + in Duplicate and Extend modes.
    2. +
    +

    DSP004.003 External VGA display in firmware

    +

    This test aims to verify initialization of the external VGA during firmware +execution phase.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Connect a video input connector to the VGA and a display.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. During boot, press BOOT MENU KEY.
    4. +
    5. Observe the external VGA connected display during firmware execution phase.
    6. +
    7. Power off the DUT.
    8. +
    +

    Expected result

    +
      +
    1. Boot menu appears on the screen during firmware execution phase.
    2. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/index.html b/unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/index.html new file mode 100644 index 00000000000..c43b9f3f2d4 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31F-audio-subsystem/index.html @@ -0,0 +1,6675 @@ + + + + + + + + + + + + + + + + + + Audio Subsystem - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Audio subsystem

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    AUD001.001 Audio subsystem detection (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is initialized correctly +and can be detected from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and execute the following command:

      +
      cat /sys/class/sound/card0/hwC0D*/chip_name
      +
      +
    8. +
    +

    Expected result

    +

    The output of the command should return a list of detected audio devices. +Depending on mounted devices, the output might be different.

    +

    Example output:

    +
    ALC293
    +Tigerlake HDMI
    +
    +

    AUD001.002 Audio subsystem detection (Windows 11)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is initialized correctly +and can be detected from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. +

      Install package AudioDeviceCmdlets:

      +
      Install-PackageProvider -Name NuGet -Force
      +
      +
      Install-Module -Name AudioDeviceCmdlets -Force
      +
      +
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Run PowerShell as administrator and execute the following command:

      +
      Get-AudioDevice -list  | ft Index, Default, Type, Name
      +
      +
    8. +
    +

    Expected result

    +

    Microphone (Realtek(R) Audio) and Speakers (Realtek(R) Audio) should be +listed in the output:

    +
    Index Default Type      Name
    +----- ------- ----      ----
    +    1    True Playback  Speakers (Realtek(R) Audio)
    +    2    True Recording Microphone (Realtek(R) Audio)
    +
    +

    AUD002.001 Audio playback (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to playback audio +recordings.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the alsa-utils package: + sudo apt install alsa-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and execute the following command:

      +
      pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo  0
      +pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535
      +speaker-test
      +
      +
    8. +
    +

    Expected result

    +

    Sound should be played from the integrated speakers.

    +

    AUD002.002 Audio playback (Windows 11)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to playback audio +recordings.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Find the Speakers icon in the bottom right part of the screen and click + it using the left mouse button to open the volume menu.
    8. +
    9. In the volume menu, click the rightmost part of it and note the result.
    10. +
    +

    Expected result

    +

    Sound should be played from the integrated speakers.

    +

    AUD003.001 Audio capture (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to capture audio.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the alsa-utils package: + sudo apt install alsa-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and execute the following command:

      +
      arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic.wav
      +
      +
    8. +
    9. +

      Make some noise around DUT. For example, say something.

      +
    10. +
    11. +

      Execute the following command:

      +
      aplay /tmp/test-mic.wav
      +
      +
    12. +
    +

    Expected result

    +

    The recorded audio clip is recorded correctly and played back.

    +

    AUD003.002 Audio capture (Windows 11)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to capture audio.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Find the Speakers icon in the bottom right part of the screen and click + it using the right mouse button then using the left mouse button + click Sound Settings.
    8. +
    9. Locate the All sound device bar and click on it.
    10. +
    11. Select the Microphone position in the Input devices section.
    12. +
    13. Click on the Start Test bar in the Input settings section.
    14. +
    15. Create some noise for the DUT to capture and note the result. + For example, say something.
    16. +
    17. Click on the Stop Test bar.
    18. +
    +

    Expected result

    +
      +
    1. The Input volume bar located in the Input settings section should raise when + some noise is being created.
    2. +
    3. The result of the test after clicking the Stop Test bar should be more than + 0% of the total volume.
    4. +
    +

    AUD004.001 External headset recognition (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the external headset is properly recognized +after plugging the 3.5 mm jack into the slot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the alsa-utils package: + sudo apt install alsa-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug a headset jack into a micro jack slot located on the right side of + the laptop.
    8. +
    9. When the Select Audio Device menu appears, select what type of external + device has been connected to the laptop (headset).
    10. +
    11. +

      Open a terminal window and execute the following command:

      +
      amixer -c 0 contents | grep -A 2 'Front Headphone Jack'
      +
      +
    12. +
    13. +

      Disconnect the headset from the laptop.

      +
    14. +
    15. +

      Execute the following command again:

      +
      amixer -c 0 contents | grep -A 2 'Front Headphone Jack'
      +
      +
    16. +
    +

    Expected result

    +
      +
    1. +

      The output of the first command should not be empty and contains the line:

      +
      : values=on
      +
      +
    2. +
    3. +

      The output of the second command should not be empty and contains the line:

      +
      : values=off
      +
      +
    4. +
    +

    AUD004.002 External headset recognition (Windows 11)

    +

    Test description

    +

    This test aims to verify that the external headset is properly recognized +after plugging the 3.5 mm jack into the slot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug a headset jack into a micro jack slot located on the right side of + the laptop.
    8. +
    9. After the Which device did you plug in menu appears, select what type of + external device has been connected to the laptop (headset).
    10. +
    11. Find the Speakers icon in the bottom right part of the screen and click it + using the right mouse button then using the left mouse button click + Sound Settings.
    12. +
    13. Locate the More sound settings bar and click on it.
    14. +
    15. Click on the Speakers bar using the right mouse button then using the left + mouse button click Properties.
    16. +
    17. Locate in General the section field named Jack Information.
    18. +
    19. Close the windows Speakers Properties and Sound.
    20. +
    21. Disconnect a headset from the laptop.
    22. +
    23. Repeat steps 7-9.
    24. +
    +

    Expected result

    +
      +
    1. Jack Information field in the first case should show the position + Front Panel 3.5 mm Jack.
    2. +
    3. After disconnecting a headset from the laptop and checking again field + Jack Information should not contain the phrase Front Panel 3.5 mm Jack.
    4. +
    +

    AUD005.001 External headset audio playback (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to playback audio +recordings by using the external headset speakers.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the alsa-utils package: + sudo apt install alsa-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug a headset jack into a micro jack slot located on the right side of the + laptop.
    8. +
    9. +

      Open a terminal window and execute the following command:

      +
      pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo  0
      +pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535
      +speaker-test
      +
      +
    10. +
    +

    Expected result

    +

    Sound should be played from external speakers.

    +

    AUD005.002 External headset audio playback (Windows 11)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to playback audio +recordings by using the external headset speakers.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug a headset jack into a micro jack slot located on the right side of the + laptop.
    8. +
    9. Find the Speakers icon in the bottom right part of the screen and click + it using the left mouse button to open the volume menu.
    10. +
    11. In the volume menu, click the rightmost part of it and note the result.
    12. +
    +

    Expected result

    +

    Sound should be played from external speakers.

    +

    AUD006.001 External headset audio capture (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to capture audio from +an external headset.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the alsa-utils package: + sudo apt install alsa-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug a headset jack into a micro jack slot located on the right side of the + laptop.
    8. +
    9. +

      Open a terminal window and execute the following command:

      +
      arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic.wav
      +
      +
    10. +
    11. +

      Make some noise for the headset. For example, say something.

      +
    12. +
    13. +

      Execute the following command:

      +
      aplay /tmp/test-mic.wav
      +
      +
    14. +
    15. +

      Execute the following command:

      +
      arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic-1.wav
      +
      +
    16. +
    17. +

      Make some noise for the DUT. For example, tap a few times in the laptop + casing.

      +
    18. +
    19. +

      Execute the following command:

      +
      aplay /tmp/test-mic.wav
      +
      +
    20. +
    +

    Expected result

    +
      +
    1. During playback of the first recording, all noise that was made for the + headset should be clearly heard.
    2. +
    3. During playback of the second recording, all noise that was made for DUT + should be quiet or not heard.
    4. +
    +

    AUD006.002 External headset audio capture (Windows 11)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to capture audio from +an external headset.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug a headset jack into a micro jack slot located on the right side of the + laptop.
    8. +
    9. Find the Speakers icon in the bottom right part of the screen and click + it using the right mouse button then using the left mouse button click + Sound Settings.
    10. +
    11. Locate the All sound device bar and click on it.
    12. +
    13. Select the Microphone position in the Input devices section.
    14. +
    15. Click on the Start Test bar in the Input settings section.
    16. +
    17. Create some noise for the headset to capture and note the result. + For example, say something.
    18. +
    19. Create some noise for the DUT. For example, tap a few times in the laptop + casing.
    20. +
    21. Click on the Stop Test bar.
    22. +
    +

    Expected result

    +
      +
    1. The Input volume bar located in the Input settings section should raise + when some noise has been created for the headset.
    2. +
    3. The Input volume bar located in the Input settings section should not + raise when some noise has been created for the DUT.
    4. +
    5. The result of the test after clicking the Stop Test bar should be more than + 0% of the total volume.
    6. +
    +

    AUD007.001 HDMI Audio recognition (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the output audio is properly assigned after +connecting the external display using the HDMI cable.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the alsa-utils package: + sudo apt install alsa-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Connect the external display to the HDMI slot.
    8. +
    9. +

      Open a terminal window and execute the following command:

      +
      amixer -c 0 contents | grep -A 2 'HDMI/DP,pcm=3'
      +
      +
    10. +
    11. +

      Disconnect the headset from the laptop.

      +
    12. +
    13. +

      Execute the following command again:

      +
      amixer -c 0 contents | grep -A 2 'HDMI/DP,pcm=3'
      +
      +
    14. +
    +

    Expected result

    +
      +
    1. +

      The output of the first command should not be empty and contains the line:

      +
      : values=on
      +
      +
    2. +
    3. +

      The output of the second command should not be empty and contains the line:

      +
      : values=off
      +
      +
    4. +
    +

    AUD007.002 HDMI Audio recognition (Windows 11)

    +

    Test description

    +

    This test aims to verify that the output audio is properly assigned after +connecting the external display using the HDMI cable.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Find the Speakers icon in the bottom right part of the screen and click it + using the right mouse button then using the left mouse button click + Sound Settings.
    8. +
    9. Locate the All sound device bar and click on it.
    10. +
    11. Locate the Output devices and Input devices section.
    12. +
    13. Connect the external display to the HDMI slot.
    14. +
    +

    Expected result

    +

    The connected display should appear in the Output devices and Input devices +section.

    +

    AUD008.001 HDMI audio playback (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to playback audio +recordings by using the external display connected to the HDMI slot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the alsa-utils package: + sudo apt install alsa-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Connect the external display to the HDMI slot.

      +
    8. +
    9. +

      Open a terminal window and execute the following commands:

      +
      pacmd set-card-profile 0 output:hdmi-stereo
      +pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo  0
      +pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535
      +speaker-test
      +
      +
    10. +
    +

    Expected result

    +

    Sound should be played from the external display.

    +

    AUD008.002 HDMI audio playback (Windows 11)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to playback audio +recordings by using the external display connected to the HDMI slot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Connect the external display to the HDMI slot.
    8. +
    9. Find the Speakers icon in the bottom right part of the screen and click it + using the right mouse button then using the left mouse button click + Sound Settings.
    10. +
    11. Locate the All sound device bar and click on it.
    12. +
    13. Select the external display position in the Output devices section.
    14. +
    15. Click on the Test bar in the Output settings section.
    16. +
    +

    Expected result

    +

    Sound should be played from the external display.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/index.html b/unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/index.html new file mode 100644 index 00000000000..85576821799 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31G-ec-and-superio/index.html @@ -0,0 +1,8922 @@ + + + + + + + + + + + + + + + + + + Embedded Controller and Super I/O initialization - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Embedded Controller and Super I/O initialization

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    ECR001.001 Battery monitoring - charge level in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies whether the battery charge level is reported in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Locate the power menu in the upper right corner of the screen.
    8. +
    9. Open the power menu and locate the battery status indicator.
    10. +
    +

    Expected result

    +
      +
    1. The battery status indicator should show the current charge level (percentage + left).
    2. +
    +

    ECR001.002 Battery monitoring - charge level in OS (Windows 11)

    +

    Test description

    +

    This test verifies whether the battery charge level is reported in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Locate the power menu in the lower right corner of the screen.
    8. +
    +

    Expected result

    +
      +
    1. The battery status indicator should show the current charge level (percentage + left).
    2. +
    +

    ECR002.001 Battery monitoring - charging state in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the power supply state is detected correctly in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Locate the power menu in the upper right corner of the screen.
    8. +
    9. Open the power menu and locate the battery status indicator.
    10. +
    11. Note the current state.
    12. +
    13. Unplug the power supply and wait for the battery charge state to change to + Discharging.
    14. +
    15. Plug in the power supply and wait for the battery charge state to change to + Charging.
    16. +
    +

    Expected result

    +
      +
    1. The battery charge indicator should correctly show whether the power supply + is plugged in or not.
    2. +
    3. The battery charge indicator should detect the AC adapter state change + within seconds of the adapter being plugged in/out.
    4. +
    +

    ECR002.002 Battery monitoring - charging state in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the power supply state is detected correctly in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Locate the power menu in the lower right corner of the screen.
    8. +
    9. Open the power menu and locate the battery status indicator.
    10. +
    11. Note the current state.
    12. +
    13. Unplug the power supply and wait for the battery charge state to change to + on battery.
    14. +
    15. Plug in the power supply and wait for the battery charge state to change to + plugged in.
    16. +
    +

    Expected result

    +
      +
    1. The battery charge indicator should correctly show whether the power supply + is plugged in or not.
    2. +
    3. The battery charge indicator should detect the AC adapter state change + within seconds of the adapter being plugged in / out.
    4. +
    +

    ECR003.001 Touchpad in OS - (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the touchpad is initialized correctly and is detected +by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install libinput-tools on the DUT.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Verify that the cursor can be moved with the touchpad and that clicking works + (test both clicking and tapping).
    8. +
    9. Run sudo libinput debug-events in the terminal:
        +
      1. Verify that scrolling with 2 fingers generates a POINTER_AXIS event,
      2. +
      3. Verify that pinching with 2 fingers generates a GESTURE_PINCH_UPDATE event.
      4. +
      +
    10. +
    11. Press Ctrl + C to terminate the libinput program.
    12. +
    +

    Expected result

    +
      +
    1. Moving the cursor, clicking, zooming and scrolling are detected correctly by + the operating system.
    2. +
    +

    ECR003.002 Touchpad in OS - (Windows 11)

    +

    Test description

    +

    This test verifies that the touchpad is initialized correctly and is detected +by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Verify that the cursor can be moved with the touchpad and that clicking + works (test both clicking and tapping).
    8. +
    9. Open C:\Windows in Windows Explorer
        +
      1. Verify that scrolling with 2 fingers moves the content of the window,
      2. +
      3. Verify that pinching with 2 fingers zooms in and zooms out the content.
      4. +
      +
    10. +
    +

    Expected result

    +
      +
    1. Moving the cursor, clicking, zooming and scrolling are detected correctly by + the operating system.
    2. +
    +

    ECR004.001 Keyboard (standard keypad) in firmware

    +

    Test description

    +

    This test verifies that the keyboard is detected correctly by the firmware +and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu.
    2. +
    3. Use the arrow keys and the Enter key to navigate the menus.
    4. +
    +

    Expected result

    +
      +
    1. All menus can be entered using the internal keyboard.
    2. +
    +

    ECR004.002 Keyboard (standard keypad) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the keyboard is detected correctly by the operating +system and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install libinput-tools on the DUT.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Run sudo libinput debug-events --show-keycodes in the terminal.
    8. +
    9. Press each keyboard key and check the generated keycode.
    10. +
    +

    Expected result

    +
      +
    1. All standard keyboard keys generate the correct keycodes and events as per + their labels.
    2. +
    3. Key combinations are detected correctly.
    4. +
    +

    ECR004.003 Keyboard (standard keypad) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the keyboard is detected correctly by the operating +system and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open notepad
        +
      1. Test the alphanumeric keys and note the generated characters
      2. +
      3. Test non-alphanumeric keys and verify that they generate the signs
      4. +
      5. Test key combinations with the Shift, and Alt modifier keys
      6. +
      +
    8. +
    9. Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. + Check if On-Screen Keyboard correctly highlights it.
    10. +
    11. Open Start menu and press Esc. Check if Start menu is properly closed.
    12. +
    +

    Expected result

    +
      +
    1. All standard keyboard keys generate correct characters + or actions when pressed.
    2. +
    3. Key combinations are detected correctly.
    4. +
    +

    ECR005.001 Keyboard (function key: play/pause) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the play/pause hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install libinput-tools on the DUT.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Run sudo libinput debug-events --show-keycodes in the terminal.
    8. +
    9. Verify that pressing the play/pause key generates a KEY_PLAYPAUSE event.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the play/pause hotkey generates a KEY_PLAYPAUSE event.
    2. +
    +

    ECR005.002 Keyboard (function key: play/pause) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the play/pause hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Start Groove Music
    8. +
    9. Verify that when pressing the play/pause button, player menu appears + in the upper left part of the screen for a few seconds.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the play/pause hotkey is properly detected by the OS
    2. +
    +

    ECR006.001 Keyboard (function key: cooling mode) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the cooling mode hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the cooling mode hotkey (Fn + 1) once and note the effect.
    8. +
    9. Press the cooling mode hotkey once again and note the effect.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should activate the cooling mode (fans should + spin up to their maximum speed).
    2. +
    3. Pressing the hotkey again should deactivate the cooling mode (fans should + return to normal).
    4. +
    +

    ECR006.002 Keyboard (function key: cooling mode) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the cooling mode hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the cooling mode hotkey (Fn + 1) once and note the effect.
    8. +
    9. Press the cooling mode hotkey once again and note the effect.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should activate the cooling mode (fans should + spin up to their maximum speed).
    2. +
    3. Pressing the hotkey again should deactivate the cooling mode (fans should + return to normal).
    4. +
    +

    ECR007.001 Keyboard (function key: touchpad on/off) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the touchpad on/off hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Proceed with the + Test cases common documentation section.
    8. +
    9. +

      Create a file /etc/udev/hwdb.d/60-keyboard.hwdb with the following contents:

      +
      evdev:atkbd:dmi:bvn*:bvr*:svnNotebook:pnNV4XMB,ME,MZ:*
      +         KEYBOARD_KEY_f7=191
      +         KEYBOARD_KEY_f8=191
      +
      +
    10. +
    11. +

      Execute the following commands:

      +
    12. +
    +
    sudo systemd-hwdb update
    +sudo udevadm trigger
    +
    +

    Test steps

    +
      +
    1. Press the touchpad on/off key and try to use the touchpad.
    2. +
    3. Press the touchpad on/off key once again and try to use the touchpad again.
    4. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should deactivate the touchpad (touchpad should be + completely inoperable).
    2. +
    3. Pressing the hotkey again should reactivate the touchpad.
    4. +
    +

    ECR007.002 Keyboard (function key: touchpad on/off) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the touchpad on/off hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the touchpad on/off key and try to use the touchpad.
    8. +
    9. Press the touchpad on/off key once again and try to use the touchpad again.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should deactivate the touchpad (touchpad should be + completely inoperable).
    2. +
    3. Pressing the hotkey again should reactivate the touchpad.
    4. +
    +

    ECR008.001 Keyboard (function key: display on/off) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the display on/off hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the display on/off hotkey once and note the effect.
    8. +
    9. Press any key on the keyboard and note the effect.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should turn the internal LCD panel off.
    2. +
    3. Pressing any key on the keyboard should power the internal LCD panel back on.
    4. +
    +

    ECR008.002 Keyboard (function key: display on/off) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the display on/off hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the display on/off hotkey once and note the effect.
    8. +
    9. Press any key on the keyboard and note the effect.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should turn the internal LCD panel off.
    2. +
    3. Pressing any key on the keyboard should power the internal LCD panel + back on.
    4. +
    +

    ECR009.001 Keyboard (function key: mute) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the volume mute hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the volume mute hotkey twice and note the effect each keypress has.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey should mute or unmute the currently enabled audio output.
    2. +
    3. Each keypress should cause a mute/unmute notification to appear in the middle + of the screen.
    4. +
    +

    ECR009.002 Keyboard (function key: mute) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the mute hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the mute hotkey once and check the volume indicator in the bottom right + part of the screen.
    8. +
    9. Press the mute hotkey once and check the volume indicator again.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should mute the device
    2. +
    3. Pressing the hotkey again should re-enable the sound
    4. +
    +

    ECR010.001 Keyboard (function key: keyboard backlight) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the keyboard backlight hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the keyboard backlight hotkey 6 times and note the effect on the + keyboard backlight after each keypress.
    8. +
    +

    Expected result

    +
      +
    1. The keyboard has 6 backlight settings from 0% to 100% Each keypress should + set the keyboard to the next mode, with the last mode wrapping back around + to the first.
    2. +
    +

    ECR010.002 Keyboard (function key: keyboard backlight) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the keyboard backlight hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the keyboard backlight hotkey 6 times and note the effect on the + keyboard backlight after each keypress.
    8. +
    +

    Expected result

    +
      +
    1. The keyboard has 6 backlight settings from 0% to 100% Each keypress should + set the keyboard to the next mode, with the last mode wrapping back around + to the first.
    2. +
    +

    ECR011.001 Keyboard (function key: volume down) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the volume down hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the volume down hotkey once and note the effects.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey should decrease the volume of the currently enabled audio + output.
    2. +
    3. Each key press should cause a volume down notification to appear in the + middle of the screen.
    4. +
    +

    ECR011.002 Keyboard (function key: volume down) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the volume down hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the volume down hotkey once and note the effects.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey should decrease the volume of the currently enabled audio + output.
    2. +
    3. Each key press should cause a volume down notification to appear in the upper + left part of the screen.
    4. +
    +

    ECR012.001 Keyboard (function key: volume up) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the volume up hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the volume up hotkey once and note the effects.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey should increase the volume of the currently enabled audio + output.
    2. +
    3. Each key press should cause a volume up notification to appear in the middle + of the screen.
    4. +
    +

    ECR012.002 Keyboard (function key: volume up) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the volume up hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the volume down hotkey once and note the effects.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey should increase the volume of the currently enabled audio + output.
    2. +
    3. Each key press should cause a volume up notification to appear in the upper + left part of the screen.
    4. +
    +

    ECR013.001 Keyboard (function key: display switch) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the display switch hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install libinput-tools on the DUT.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Run sudo libinput debug-events --show-keycodes in the terminal.
    8. +
    9. Press the display switch hotkey once and note the effect.
    10. +
    +

    Expected result

    +
      +
    1. +

      Pressing the hotkey should yield the following output in the terminal:

      +
      -event3   KEYBOARD_KEY     +0.000s  KEY_LEFTMETA (125) pressed
      + event3   KEYBOARD_KEY     +0.004s  KEY_P (25) pressed
      + event3   KEYBOARD_KEY     +0.010s  KEY_P (25) released
      + event3   KEYBOARD_KEY     +0.015s  KEY_LEFTMETA (125) released
      +
      +
    2. +
    +

    ECR013.002 Keyboard (function key: display switch) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the display switch hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the display switch hotkey once and note the effect.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey should cause the display settings bar to appear + on the right part of the screen.
    2. +
    +

    ECR014.001 Keyboard (function key: brightness down) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the brightness down hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test steps

    +
      +
    1. Press the brightness down hotkey once and note the effects.
    2. +
    +

    Expected result

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Pressing the hotkey should decrease the brightness of the internal LCD + display.
    8. +
    9. Each key press should cause a brightness down notification to appear in the + middle of the screen.
    10. +
    +

    ECR014.002 Keyboard (function key: brightness down) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the brightness down hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the brightness down hotkey once and note the effects.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey should decrease the brightness of the internal LCD + display.
    2. +
    3. Each key press should cause a brightness down notification to appear in the + top left of the screen.
    4. +
    +

    ECR015.001 Keyboard (function key: brightness up) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the brightness up hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the brightness up hotkey once and note the effects.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey should increase the brightness of the internal LCD + display.
    2. +
    3. Each key press should cause a brightness up notification to appear in the + middle of the screen.
    4. +
    +

    ECR015.002 Keyboard (function key: brightness up) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the brightness down hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the brightness up hotkey once and note the effects.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey should increase the brightness of the internal LCD + display.
    2. +
    3. Each key press should cause a brightness up notification to appear in the + top left of the screen.
    4. +
    +

    ECR016.001 Keyboard (function key: camera on/off) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the camera on/off hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open the terminal and run the command: watch -n1 lsusb.
    8. +
    9. Press the camera on/off hotkey twice and note the effect after each + keypress.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should make the + Chicony Electronics Co., Ltd Chicony USB2.0 Camera device disappear + from the output of lsusb.
    2. +
    3. Pressing the hotkey again should make the USB device reappear.
    4. +
    +

    ECR016.002 Keyboard (function key: camera on/off) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the camera on/off hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open the Camera app.
    8. +
    9. Press the camera on/off hotkey twice and note the effect after + a few seconds after the keypress.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should make the camera image disappear.
    2. +
    3. Pressing the hotkey again should make the camera image appear again + after a few seconds.
    4. +
    +

    ECR017.001 Keyboard (function key: flight mode) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the flight mode hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Locate and open the power menu in the upper right corner of the screen.
    8. +
    9. Enter Settings and navigate to the Wi-Fi panel.
    10. +
    11. Note the current state of the Airplane Mode switch.
    12. +
    13. Press the flight mode hotkey twice and note the result of each keypress.
    14. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should enable airplane mode.
    2. +
    3. Pressing the hotkey again should disable airplane mode.
    4. +
    +

    ECR017.002 Keyboard (function key: flight mode) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the flight mode hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the camera on/off hotkey twice and note the effect after the key press.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the hotkey once should enable airplane mode and cause + airplane mode on notification to appear in the top right + part of the screen.
    2. +
    3. Pressing the hotkey again should disable airplane mode and cause + airplane mode off notification to appear in the top right + part of the screen.
    4. +
    +

    ECR018.001 Keyboard (function key: sleep) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the sleep hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the sleep hotkey once and note the result.
    8. +
    +

    Expected result

    +
      +
    1. The laptop should go to sleep within seconds of the hotkey being pressed.
    2. +
    3. The power LED should be blinking green, indicating the laptop is sleeping.
    4. +
    +

    ECR018.002 Keyboard (function key: sleep) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the sleep hotkey works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Proceed with the + Installing updates and drivers + section.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Wait 30 seconds for the system to load fully.
    8. +
    9. Press the sleep hotkey once and note the result.
    10. +
    +

    Expected result

    +
      +
    1. The laptop should go to sleep within seconds of the hotkey being pressed.
    2. +
    3. The power LED should be blinking green, indicating the laptop is sleeping.
    4. +
    +

    ECR019.001 Buttons (button: power) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the power button is detected correctly by the operating +system. In Ubuntu 22.04 OS the default function assigned to this key is suspend +mode.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open the terminal and run the following command to check the power button + action:

      +
      gsettings get org.gnome.settings-daemon.plugins.power power-button-action
      +
      +
    8. +
    9. +

      If the status is other than suspend run the following command to change + the power button action:

      +
      gsettings set org.gnome.settings-daemon.plugins.power power-button-action "suspend"
      +
      +
    10. +
    11. +

      Check the power button action again by running the following command:

      +
      gsettings get org.gnome.settings-daemon.plugins.power power-button-action
      +
      +
    12. +
    13. +

      Press the power button once and note the result.

      +
    14. +
    15. Press Enter and note the result.
    16. +
    17. +

      Run the following command to check last finished operation:

      +
      journalctl | grep systemd-logind | tail -1
      +
      +
    18. +
    +

    Expected result

    +
      +
    1. Pressing the button once should make laptop enter sleep mode.
    2. +
    3. The power LED should be blinking green, indicating the laptop is sleeping.
    4. +
    5. After completing the 5th step device should wake up.
    6. +
    7. +

      The output of the last command should contain the line:

      +
      Operation 'sleep' finished
      +
      +
    8. +
    +

    ECR019.002 Buttons (button: power) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the power button is detected correctly by the operating +system. In Windows 11 OS the default function assigned to this key is sleep +mode.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Proceed with the + Installing updates and drivers + section.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Wait 30 seconds for the system to load fully.
    8. +
    9. Press the power button once and note the result.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the button once should make laptop enter sleep mode.
    2. +
    3. The power LED should be blinking green, indicating the laptop is sleeping.
    4. +
    +

    ECR020.001 Buttons (button: lid switch) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the lid switch is detected correctly by the operating +system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open one terminal window and run the following command:

      +
      sudo systemd-inhibit --what handle-lid-switch --mode block watch echo "Inhibiting lid switch"
      +
      +
    8. +
    9. +

      Open another terminal and run the command + sleep 5 && cat /proc/acpi/button/lid/LID0/state to read the state of + the lid while it is closed.

      +
    10. +
    11. Close the lid and wait 5 seconds.
    12. +
    13. Open the lid and note the output of the command.
    14. +
    15. Run the command cat /proc/acpi/button/lid/LID0/state while the lid is + open and note the output.
    16. +
    +

    Expected result

    +
      +
    1. The output of the second command should report that the lid is closed.
    2. +
    3. The output of the third command should report that the lid is open.
    4. +
    +

    ECR020.002 Buttons (button: lid switch) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the lid switch is detected correctly by the operating +system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Proceed with the + Installing updates and drivers + section.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Wait 30 seconds for the system to load fully.
    8. +
    9. Close the lid and note the effect on the power LED.
    10. +
    +

    Expected result

    +
      +
    1. Pressing the button once should make laptop enter sleep mode.
    2. +
    3. The power LED should be blinking green, indicating the laptop is sleeping.
    4. +
    +

    ECR021.001 Keyboard (function key: RGB keyboard toggle) in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the RGB keyboard toggle hotkey is handled properly by +the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the RGB keyboard toggle hotkey twice and note the result each time.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the button once should disable the keyboard backlight.
    2. +
    3. Pressing the button again should re-enable the keyboard backlight.
    4. +
    +

    ECR021.002 Keyboard (function key: RGB keyboard toggle) in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the RGB keyboard toggle hotkey is handled properly by +the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the RGB keyboard toggle hotkey twice and note the result each time.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the button once should disable the keyboard backlight.
    2. +
    3. Pressing the button again should re-enable the keyboard backlight.
    4. +
    +

    ECR022.001 RGB keyboard next color FN key in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the RGB keyboard's next color hotkey is handled properly +by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the RGB keyboard color hotkey repeatedly until the keyboard cycles + through all color modes.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the button once should switch the keyboard color.
    2. +
    3. All color modes according to product documentation should be accessible.
    4. +
    +

    ECR022.002 RGB keyboard next color FN key in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the RGB keyboard's next color hotkey is handled properly +by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the RGB keyboard color hotkey repeatedly until the keyboard cycles + through all color modes.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the button once should switch the keyboard color.
    2. +
    3. All color modes according to product documentation should be accessible.
    4. +
    +

    ECR023.001 RGB keyboard brightness down FN key in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the RGB keyboard brightness down hotkey is handled +properly by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the RGB keyboard brightness down hotkey and note the result.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the button once should lower the keyboard backlight
    2. +
    +

    ECR023.002 RGB keyboard brightness down FN key in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the RGB keyboard brightness down hotkey is handled +properly by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the RGB keyboard brightness down hotkey and note the result.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the button once should lower the keyboard backlight.
    2. +
    +

    ECR024.001 RGB keyboard brightness up FN key in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the RGB keyboard brightness up hotkey is handled +properly by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the RGB keyboard brightness up hotkey and note the result.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the button once should increase the keyboard backlight.
    2. +
    +

    ECR024.002 RGB keyboard brightness up FN key in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the RGB keyboard brightness up hotkey is handled +properly by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Press the RGB keyboard brightness up hotkey and note the result.
    8. +
    +

    Expected result

    +
      +
    1. Pressing the button once should increase the keyboard backlight.
    2. +
    +

    ECR025.001 Permanent keyboard illumination after cold-boot (Firmware)

    +

    Test description

    +

    This test aims to verify that after performing cold-boot, keyboard still +illuminates in firmware.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu.
    2. +
    3. Set keyboard brightness and color to arbitrary settings.
    4. +
    5. Disconnect power source, and remove battery if present.
    6. +
    7. Connect power and battery again.
    8. +
    9. Power on the DUT again and press the BIOS_SETUP_KEY to enter the setup + menu.
    10. +
    +

    Expected result

    +
      +
    1. After cold-boot keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR025.002 Permanent keyboard illumination after cold-boot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that after performing cold-boot, keyboard still +illuminates in Ubuntu 22.04.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the OPERATING_SYSTEM.
    4. +
    5. Log into the OPERATING_SYSTEM by using the proper login and password.
    6. +
    7. Set keyboard brightness and color to arbitrary settings.
    8. +
    9. Disconnect power source, and remove battery if present.
    10. +
    11. Connect power and battery again.
    12. +
    13. Power on the DUT.
    14. +
    15. Boot into the OPERATING_SYSTEM.
    16. +
    17. Log into the OPERATING_SYSTEM by using the proper login and password.
    18. +
    +

    Expected result

    +
      +
    1. After cold-boot keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR025.003 Permanent keyboard illumination after cold-boot (Windows 11)

    +

    Test description

    +

    This test aims to verify that after performing cold-boot, keyboard still +illuminates in Windows 11.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the OPERATING_SYSTEM.
    4. +
    5. Log into the OPERATING_SYSTEM by using the proper login and password.
    6. +
    7. Set keyboard brightness and color to arbitrary settings.
    8. +
    9. Disconnect power source, and remove battery if present.
    10. +
    11. Connect power and battery again.
    12. +
    13. Power on the DUT.
    14. +
    15. Boot into the OPERATING_SYSTEM.
    16. +
    17. Log into the OPERATING_SYSTEM by using the proper login and password.
    18. +
    +

    Expected result

    +
      +
    1. After cold-boot keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR026.001 Permanent keyboard illumination after warm-boot (Firmware)

    +

    Test description

    +

    This test aims to verify that after performing warm-boot, keyboard still +illuminates in firmware.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu.
    2. +
    3. Set keyboard brightness and color to arbitrary settings.
    4. +
    5. Power off the DUT using power button.
    6. +
    7. Power on the DUT again and press the BIOS_SETUP_KEY to enter the setup + menu.
    8. +
    +

    Expected result

    +
      +
    1. After warm-boot keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR026.002 Permanent keyboard illumination after warm-boot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that after performing warm-boot, keyboard still +illuminates in Ubuntu 22.04.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the OPERATING_SYSTEM.
    4. +
    5. Log into the OPERATING_SYSTEM by using the proper login and password.
    6. +
    7. Set keyboard brightness and color to arbitrary settings.
    8. +
    9. Power off the DUT using power button.
    10. +
    11. Power on the DUT.
    12. +
    13. Boot into the OPERATING_SYSTEM.
    14. +
    15. Log into the OPERATING_SYSTEM by using the proper login and password.
    16. +
    +

    Expected result

    +
      +
    1. After warm-boot keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR026.003 Permanent keyboard illumination after warm-boot (Windows 11)

    +

    Test description

    +

    This test aims to verify that after performing warm-boot, keyboard still +illuminates in Windows 11.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the OPERATING_SYSTEM.
    4. +
    5. Log into the OPERATING_SYSTEM by using the proper login and password.
    6. +
    7. Set keyboard brightness and color to arbitrary settings.
    8. +
    9. Power off the DUT using power button.
    10. +
    11. Power on the DUT.
    12. +
    13. Boot into the OPERATING_SYSTEM.
    14. +
    15. Log into the OPERATING_SYSTEM by using the proper login and password.
    16. +
    +

    Expected result

    +
      +
    1. After warm-boot keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR027.001 Permanent keyboard illumination after reboot (Firmware)

    +

    Test description

    +

    This test aims to verify that after performing reboot, keyboard still +illuminates in firmware.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu.
    2. +
    3. Set keyboard brightness and color to arbitrary settings.
    4. +
    5. Select Reset option from the bottom of the list.
    6. +
    7. During boot press the BIOS_SETUP_KEY to enter the setup menu.
    8. +
    +

    Expected result

    +
      +
    1. After reboot keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR027.002 Permanent keyboard illumination after reboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that after performing reboot, keyboard still +illuminates in Ubuntu 22.04

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Set keyboard brightness and color to arbitrary settings.
    8. +
    9. +

      Reboot the device using:

      +
      sudo reboot now
      +
      +
    10. +
    +

    Expected result

    +
      +
    1. After reboot keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR027.003 Permanent keyboard illumination after reboot (Windows 11)

    +

    Test description

    +

    This test aims to verify that after performing reboot, keyboard still +illuminates in Windows 11.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Set keyboard brightness and color to arbitrary settings.
    8. +
    9. +

      Reboot the device executing in PowerShell:

      +
      Restart-Computer
      +
      +
    10. +
    +

    Expected result

    +
      +
    1. After reboot keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR028.001 Permanent keyboard illumination after suspension (Firmware)

    +

    Test description

    +

    This test aims to verify that after performing suspension, keyboard still +illuminates in firmware.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. SUSPEND_KEY = Fn + F12
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu.
    2. +
    3. Set keyboard brightness and color to arbitrary settings.
    4. +
    5. Suspend the DUT using SUSPEND_KEY.
    6. +
    7. Wake the device from suspend pressing any key on keyboard.
    8. +
    +

    Expected result

    +
      +
    1. After suspend keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR028.002 Permanent keyboard illumination after suspension (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that after performing suspension, keyboard still +illuminates in Ubuntu 22.04

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    5. SUSPEND_KEY = Fn + F12
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Set keyboard brightness and color to arbitrary settings.
    8. +
    9. Suspend the DUT using SUSPEND_KEY.
    10. +
    11. Wake the device from suspend pressing any key on keyboard.
    12. +
    +

    Expected result

    +
      +
    1. After suspend keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR028.003 Permanent keyboard illumination after suspension (Windows 11)

    +

    Test description

    +

    This test aims to verify that after performing suspension, keyboard still +illuminates in Windows 11.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    5. SUSPEND_KEY = Fn + F12
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Set keyboard brightness and color to arbitrary settings.
    8. +
    9. Suspend the DUT using SUSPEND_KEY.
    10. +
    11. Wake the device from suspend pressing any key on keyboard.
    12. +
    +

    Expected result

    +
      +
    1. After suspend keyboard brightness and colors settings remain the same.
    2. +
    +

    ECR029.001 FnLock Hotkey (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that FnLock hotkey functionality works properly on +Ubuntu 22.04.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    5. FN_LOCK_KEY = Fn + CapsLock
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Use FN_LOCK_KEY to activate Fn lock functionality.
    8. +
    9. Test function keys F1 - F12 and note the results.
    10. +
    +

    Expected result

    +
      +
    1. The function keys F1 - F12 behave as if Fn key is pressed.
    2. +
    +

    ECR029.002 FnLock Hotkey (Windows 11)

    +

    Test description

    +

    This test aims to verify that FnLock hotkey functionality works properly on +Windows 11.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    5. FN_LOCK_KEY = Fn + CapsLock
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Use FN_LOCK_KEY to activate Fn lock functionality.
    8. +
    9. Test function keys F1 - F12 and note the results.
    10. +
    +

    Expected result

    +
      +
    1. The function keys F1 - F12 behave as if Fn key is pressed.
    2. +
    +

    SIO001.001 PS/2 mouse in OS - (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the touchpad is initialized correctly and is detected +by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect PS/2 mouse to the green PS/2 port on the board or the PS/2 splitter + (if the board has a unified, black PS/2 connector)
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Verify that the cursor can be moved with the PS/2 mouse and that clicking + works.
    8. +
    +

    Expected result

    +
      +
    1. Moving the cursor and clicking working correctly in the operating system.
    2. +
    +

    SIO001.002 PS/2 mouse in OS - (Windows 11)

    +

    Test description

    +

    This test verifies that the touchpad is initialized correctly and is detected +by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect PS/2 mouse to the green PS/2 port on the board or the PS/2 splitter + (if the board has a unified, black PS/2 connector)
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Verify that the cursor can be moved with the PS/2 mouse and that clicking + works.
    8. +
    +

    Expected result

    +
      +
    1. Moving the cursor and clicking working correctly in the operating system.
    2. +
    +

    SIO002.001 PS/2 keyboard in firmware

    +

    Test description

    +

    This test verifies that the keyboard is detected correctly by the firmware +and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. BIOS_SETUP_KEY = Esc
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware
    2. +
    3. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 + splitter (if the board has a unified, black PS/2 connector)
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu.
    2. +
    3. Use the arrow keys and the Enter key to navigate the menus.
    4. +
    +

    Expected result

    +
      +
    1. All menus can be entered using the PS/2 keyboard.
    2. +
    +

    SIO002.002 PS/2 keyboard in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the keyboard is detected correctly by the operating +system and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. BIOS_SETUP_KEY = Esc
    4. +
    5. OPERATING_SYSTEM = Ubuntu 22.04
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 + splitter (if the board has a unified, black PS/2 connector)
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Run sudo libinput debug-events --show-keycodes in the terminal.
    8. +
    9. Press keyboard keys and check the generated keycode.
    10. +
    +

    Expected result

    +
      +
    1. All standard keyboard keys generate the correct keycodes and events as per + their labels.
    2. +
    3. Key combinations are detected correctly.
    4. +
    +

    SIO002.003 PS/2 keyboard in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the keyboard is detected correctly by the operating +system and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 + splitter (if the board has a unified, black PS/2 connector)
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open notepad
        +
      • Test the alphanumeric keys and note the generated characters
      • +
      • Test non-alphanumeric keys and verify that they generate the signs
      • +
      • Test key combinations with the Shift, and Alt modifier keys
      • +
      +
    8. +
    9. Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. + Check if On-Screen Keyboard correctly highlights it.
    10. +
    11. Open Start menu and press Esc. Check if Start menu is properly closed.
    12. +
    +

    Expected result

    +
      +
    1. All standard keyboard keys generate correct characters + or actions when pressed.
    2. +
    3. Key combinations are detected correctly.
    4. +
    +

    SIO003.001 PS/2 keyboard wake in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the keyboard is detected correctly by the operating +system and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. BIOS_SETUP_KEY = Esc
    4. +
    5. OPERATING_SYSTEM = Ubuntu 22.04
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 + splitter (if the board has a unified, black PS/2 connector)
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Suspend the system to RAM.
    8. +
    9. Press a keyboard key to wake the platform.
    10. +
    +

    Expected result

    +
      +
    1. Platform is resuming to the OS from sleep after pressing the key.
    2. +
    +

    SIO003.002 PS/2 keyboard wake in OS (Windows 11)

    +

    Test description

    +

    This test verifies that the keyboard is detected correctly by the operating +system and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect PS/2 keyboard to the violet PS/2 port on the board or the PS/2 + splitter (if the board has a unified, black PS/2 connector)
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Suspend the system to RAM.
    8. +
    9. Press a keyboard key to wake the platform.
    10. +
    +

    Expected result

    +
      +
    1. Platform is resuming to the OS from sleep after pressing the key.
    2. +
    +

    SIO004.001 Serial port in firmware

    +

    Test description

    +

    This test verifies that the serial port is detected correctly by the firmware +and the menu can be traversed with serial console.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. BIOS_SETUP_KEY = Esc
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware
    2. +
    3. Connect DB9 null modem cable to RS232/USB adapter and the onboard serial + port connector.
    4. +
    +

    Test steps

    +
      +
    1. Open the terminal emulator, e.g. minicom, on the RS232/USB adapter.
    2. +
    3. Power on the DUT and press the BIOS_SETUP_KEY to enter the setup menu.
    4. +
    5. Use the arrow keys and the Enter key to navigate the menus.
    6. +
    +

    Expected result

    +
      +
    1. All menus can be entered using the serial console.
    2. +
    +

    SIO004.002 Serial port in OS (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the serial port is detected correctly by the operating +system and can be utilized as serial console.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. BIOS_SETUP_KEY = Esc
    4. +
    5. OPERATING_SYSTEM = Ubuntu 22.04
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect DB9 null modem cable to RS232/USB adapter and the onboard serial + port connector.
    4. +
    5. Configure Linux kernel parameters to use serial console, e.g. + console=ttyS0,115200
    6. +
    +

    Test steps

    +
      +
    1. Open the terminal emulator, e.g. minicom, on the RS232/USB adapter.
    2. +
    3. Power on the DUT.
    4. +
    5. Boot into the system.
    6. +
    7. Log into the system by using the proper login and password through serial + console.
    8. +
    +

    Expected result

    +
      +
    1. Serial port can be used as Linux console to log in.
    2. +
    3. Serial port can be used to execute commands in bash/shell.
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31H-usb-type-c/index.html b/unified-test-documentation/dasharo-compatibility/31H-usb-type-c/index.html new file mode 100644 index 00000000000..81e20e91979 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31H-usb-type-c/index.html @@ -0,0 +1,7672 @@ + + + + + + + + + + + + + + + + + + USB-C support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: USB-C/Thunderbolt support with charging and display

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    UTC001.001 USB Type-A charging capability

    +

    Test description

    +

    This test verifies that the USB-A ports are able to provide charging to a +connected smartphone.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Connect a phone to the USB Type-A port located on the left side of the laptop + using a USB cable.
    8. +
    9. Note the charging status on the phone screen.
    10. +
    11. Connect a phone to the USB Type-A port located on the right side of the laptop + using a USB cable.
    12. +
    13. Note the charging status on the phone screen.
    14. +
    +

    Expected result

    +
      +
    1. The smartphone should indicate that it's charging when connected to either + USB Type-A port.
    2. +
    +

    UTC002.001 Thunderbolt 4 USB Type-C charging capability

    +

    Test description

    +

    This test verifies that the Thunderbolt 4 port is able to provide charging to +a connected smartphone.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Connect a phone to the Thunderbolt 4 USB Type-C port located on the left side + of the laptop using a USB cable.
    8. +
    9. Note the charging status on the phone screen.
    10. +
    +

    Expected result

    +
      +
    1. The smartphone should indicate that it's charging.
    2. +
    +

    UTC003.001 USB Type-C PD laptop charging (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that the laptop can be charged using a USB Type-C PD power +supply connected to the Thunderbolt 4 port.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Disconnect any charger from the DUT.
    8. +
    9. Connect the charger plug to the docking station.
    10. +
    11. +

      Open a terminal window and run the following command:

      +
      cat /sys/class/power_supply/BAT0/status
      +
      +
    12. +
    +

    Expected result

    +

    Output of the command should show one of this: Charging or Full. That means +laptop is charged properly.

    +

    UTC003.002 USB Type-C PD laptop charging (Windows 11)

    +

    Test description

    +

    This test verifies that the laptop can be charged using a USB Type-C PD power +supply connected to the Thunderbolt 4 port.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Disconnect any charger from the DUT.
    8. +
    9. Connect the charger plug to the docking station.
    10. +
    11. +

      Open PowerShell and and run the following command:

      +
      Get-WmiObject win32_battery
      +
      +
    12. +
    +

    Expected result

    +

    If BatteryStatus is equal 2, that means laptop is charged properly.

    +

    Example part of output:

    +
    BatteryStatus               : 2
    +
    +

    UTC004.001 USB Type-C Display output (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that DUT output video to a display connected via +the Thunderbolt 4 USB Type-C port.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Connect a display to the Thunderbolt 4 USB Type-C port using + a USB Type-C hub
    8. +
    9. Open the Settings application and select the Displays panel in the left menu.
    10. +
    11. Verify that the attached external monitor can be selected.
    12. +
    13. Select and enable the monitor.
    14. +
    +

    Expected result

    +
      +
    1. The monitor connected to the laptop via the Thunderbolt 4 port should power + on and display video from the laptop.
    2. +
    +

    UTC004.002 USB Type-C Display output (Windows 11)

    +

    Test description

    +

    This test verifies that DUT output video to a display connected via +the Thunderbolt 4 USB Type-C port.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Connect a display to the Thunderbolt 4 USB Type-C port using + a USB Type-C hub.
    8. +
    9. Right click on the desktop to open the desktop context menu.
    10. +
    11. Select Display Settings to open the display settings window.
    12. +
    13. Verify that the attached external monitor can be selected.
    14. +
    15. Select and enable the monitor.
    16. +
    +

    Expected result

    +
      +
    1. The monitor connected to the laptop via the Thunderbolt 4 port should power + on and display video from the laptop.
    2. +
    +

    UTC005.001 USB Type-C docking station HDMI display (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the display connected with the HDMI cable to the +docking station is correctly recognized by the OPERATING_SYSTEM.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect an HDMI cable to the docking station and a display.
    4. +
    5. +

      The USB-C docking station connected to the USB-C port.

      +
      +

      If the docking station is not directly connected to the DUT, but with a +USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with +5A current capability.

      +
      +
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Mirror and + Join Displays.
    8. +
    +

    Expected result

    +

    The image should be displayed on the external HDMI-connected display in Mirror +and Join Displays modes.

    +

    UTC005.002 USB Type-C docking station HDMI display (Windows 11)

    +

    Test description

    +

    This test aims to verify that the display connected with the HDMI cable to the +docking station is correctly recognized by the OPERATING_SYSTEM.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect an HDMI cable to the docking station and a display.
    4. +
    5. +

      The USB-C docking station connected to the USB-C port.

      +
      +

      If the docking station is not directly connected to the DUT, but with a +USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with +5A current capability.

      +
      +
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Duplicate + and Extend.
    8. +
    +

    Expected result

    +

    The image should be displayed on the external HDMI-connected display in +Duplicate and Extend modes.

    +

    UTC006.001 USB Type-C docking station DP display (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the display connected with the HDMI cable to the +docking station is correctly recognized by the OPERATING_SYSTEM.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect a Display Port cable to the docking station and a display.
    4. +
    5. +

      The USB-C docking station connected to the USB-C port.

      +
      +

      If the docking station is not directly connected to the DUT, but with a +USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with +5A current capability.

      +
      +
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Mirror and + Join Displays.
    8. +
    +

    Expected result

    +

    The image should be displayed on the external DisplayPort-connected display in +Mirror and Join Displays modes.

    +

    UTC006.002 USB Type-C docking station DP display (Windows 11)

    +

    Test description

    +

    This test aims to verify that the display connected with the DisplayPort cable +to the docking station is correctly recognized by the OPERATING_SYSTEM.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect a DisplayPort cable to the docking station and a display.
    4. +
    5. +

      The USB-C docking station connected to the USB-C port.

      +
      +

      If the docking station is not directly connected to the DUT, but with a +USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with +5A current capability.

      +
      +
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Duplicate + and Extend.
    8. +
    +

    Expected result

    +

    The image should be displayed on the external DisplayPort-connected display in +Duplicate and Extend modes.

    +

    UTC007.001 USB Type-C docking station Triple display (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the three display simultaneously connected to the +docking station is correctly recognized by the OPERATING_SYSTEM.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect three displays using HDMI/DisplayPort cables, depending on the + specifications of the docking station.
    4. +
    5. +

      The USB-C docking station connected to the USB-C port.

      +
      +

      If the docking station is not directly connected to the DUT, but with a +USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with +5A current capability.

      +
      +
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Switch the display mode between Mirror and Join Displays.
    8. +
    +

    Expected result

    +

    The image should be displayed on the three external displays in Mirror and +Join Displays modes.

    +

    UTC007.002 USB Type-C docking station Triple display (Windows 11)

    +

    Test description

    +

    This test aims to verify that the three display simultaneously connected to the +docking station is correctly recognized by the OPERATING_SYSTEM.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect three displays using HDMI/DisplayPort cables, depending on the + specifications of the docking station.
    4. +
    5. +

      The USB-C docking station connected to the USB-C port.

      +
      +

      If the docking station is not directly connected to the DUT, but with a +USB-C to USB-C cable, make sure it is full-featured cable (>=5Gbps) with +5A current capability.

      +
      +
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. If using more than one display, switch the display mode between Duplicate + and Extend.
    8. +
    +

    Expected result

    +

    The image should be displayed on the three external displays in Duplicate and +Extend modes.

    +

    UTC008.001 USB Type-C docking station detection after coldboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the DUT properly detects the docking station after +coldboot (realized by power supply cutting off then restoring back). +This test case may be re-done several times to specify the platform and +connection stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Boot into the system.
    6. +
    7. Log into the system by using the proper login and password.
    8. +
    9. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    10. +
    11. +

      Note the results.

      +
    12. +
    +

    Expected result

    +

    After lsusb command the docking station entries should be displayed, but +output can be different depending on the model of the docking station.

    +

    Example entries signifing the docking station:

    +
    Bus 002 Device 010: Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
    +Bus 002 Device 009: Prolific Technology, Inc. USB SD Card Reader
    +Bus 002 Device 008: VIA Labs, Inc. USB3.0 Hub
    +
    +

    UTC009.001 USB Type-C docking station detection after warmboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the DUT properly detects the docking station +after warmboot (realized by device turning off then turning on). This test case +may be re-done several times to specify the platform and connection stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    +

    Expected result

    +

    After lsusb command the docking station entries should be displayed, but +output can be different depending on the model of the docking station.

    +

    Example entries signifing the docking station:

    +
    Bus 002 Device 010: Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
    +Bus 002 Device 009: Prolific Technology, Inc. USB SD Card Reader
    +Bus 002 Device 008: VIA Labs, Inc. USB3.0 Hub
    +
    +

    UTC010.001 USB Type-C docking station detection after reboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the DUT properly detects the docking station +after system reboot (performed by relevant command). This test case may be +re-done several times to specify the platform and connection stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Boot into the system.

      +
    10. +
    11. Log into the system by using the proper login and password.
    12. +
    13. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    14. +
    15. +

      Note the results.

      +
    16. +
    +

    Expected result

    +

    After lsusb command the docking station entries should be displayed, but +output can be different depending on the model of the docking station.

    +

    Example entries signifing the docking station:

    +
    Bus 002 Device 010: Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
    +Bus 002 Device 009: Prolific Technology, Inc. USB SD Card Reader
    +Bus 002 Device 008: VIA Labs, Inc. USB3.0 Hub
    +
    +

    UTC011.001 USB Type-C docking station USB devices recognition (firmware)

    +

    Test description

    +

    This test aims to verify that the external USB devices connected to the docking +station are recognized correctly by the FIRMWARE.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The USB storage connected to the USB-C docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BIOS_MENU_KEY to enter the BIOS Menu.
    4. +
    5. Check if the USB storage is available on the list.
    6. +
    +

    Expected result

    +

    The USB storage is available which confirms successful recognition.

    +

    UTC011.002 USB Type-C docking station USB devices recognition (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the external USB devices connected to the docking +station are recognized correctly by the OPERATING_SYSTEM.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The USB storage connected to the USB-C docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      watch -n1 lsusb
      +
      +
    8. +
    9. +

      Connect(or Disconnect) external USB devices to the USB ports on the docking + station and note the result.

      +
    10. +
    +

    Expected result

    +
      +
    1. After each device is connected to the USB port, a new USB device entry + in lsusb command output should appear.
    2. +
    3. After each device is disconnected from the USB port, a USB device entry + in lsusb command output should disappear.
    4. +
    +

    UTC011.003 USB Type-C docking station USB devices recognition (Windows 11)

    +

    Test description

    +

    This test aims to verify that the external USB devices connected to the docking +station are recognized correctly by the OPERATING_SYSTEM.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The USB storage connected to the USB-C docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open PowerShell and and run the following command:

      +
      Get-PnpDevice -PresentOnly | Where-Object { $_.InstanceId -match '^USB' }
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    +

    Expected result

    +

    After executing the command, a list containing all USB devices should be +displayed. The list should contain the USB storage, which is plug in.

    +
    Example output:
    +
    +```bash
    +    Status     Class           FriendlyName
    +    ------     -----           ------------
    +    OK         DiskDrive       Mass Storage Device USB Device
    +    OK         USB             Generic USB Hub
    +    OK         HIDClass        USB Input Device
    +    OK         Bluetooth       Intel(R) Wireless Bluetooth(R)
    +    OK         DiskDrive       USB SanDisk 3.2Gen1 USB Device
    +    OK         USB             USB Root Hub (USB 3.0)
    +    OK         Net             TP-LINK Gigabit Ethernet USB Adapter
    +    OK         USB             Generic USB Hub
    +    OK         USB             USB Mass Storage Device
    +```
    +
    +

    UTC012.001 USB Type-C docking station USB keyboard (firmware)

    +

    Test description

    +

    This test aims to verify that the external USB keyboard connected to the docking +station is detected correctly by the FIRMWARE and all basic keys work +according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The external USB keyboard connected to the docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT
    2. +
    3. Hold the BIOS_MENU_KEY to enter the Bios Menu.
    4. +
    5. Use the arrow keys, Esc key and the Enter key to navigate the menus.
    6. +
    +

    Expected result

    +

    All menus can be entered using the external USB keyboard.

    +

    UTC012.002 USB Type-C docking station USB keyboard (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the external USB keyboard connected to the docking +station is detected correctly by the OPERATING_SYSTEM and all basic keys work +according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the libinput-tools package: sudo apt install libinput-tools.
    4. +
    5. The USB-C docking station connected to the USB-C port.
    6. +
    7. The external USB keyboard connected to the docking station.
    8. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    8. +
    9. +

      Run the following command in the terminal:

      +
      libinput debug-events --show-keycodes
      +
      +
    10. +
    11. +

      Test the alphanumeric keys and note the generated keycodes.

      +
    12. +
    13. Test non-alphanumeric keys and verify that they generate the correct + keycodes.
    14. +
    15. Test key combinations with the Shift, Ctrl and Alt modifier keys + (this tests 2-key rollover).
    16. +
    +

    Expected result

    +
      +
    1. The external USB keyboard is detected in OS.
    2. +
    3. All standard keyboard keys generate the correct keycodes and events as per + their labels.
    4. +
    5. Key combinations are detected correctly.
    6. +
    +

    UTC012.003 USB Type-C docking station USB keyboard (Windows 11)

    +

    Test description

    +

    This test aims to verify that the external USB keyboard is detected correctly +by the OPERATING_SYSTEM and all basic keys work according to their labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The external USB keyboard connected to the docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open PowerShell and and run the following command:

      +
      Get-CimInstance win32_KEYBOARD
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. Open notepad.
    12. +
    13. Test the alphanumeric keys and note the generated characters.
    14. +
    15. Test non-alphanumeric keys and verify that they generate the signs.
    16. +
    17. Test key combinations with the Shift, and Alt modifier keys.
    18. +
    19. Open On-Screen Keyboard and press Ctrl key on the hardware keyboard. + Check if On-Screen Keyboard correctly highlights it.
    20. +
    21. Open Start menu and press Esc. Check if Start menu is properly closed.
    22. +
    +

    Expected result

    +
      +
    1. +

      After running the PowerShell command information about connected keyboards + should be displayed.

      +

      One of keyboard should have identical part of output:

      +
      Description                 : USB Input Device
      +
      +
    2. +
    3. +

      All standard keyboard keys generate correct characters + or actions when pressed.

      +
    4. +
    5. Key combinations are detected correctly.
    6. +
    +

    UTC013.001 USB Type-C docking station upload 1GB file on USB storage (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the 1GB file can be transferred from the +OPERATING_SYSTEM to the USB storage connected to the docking station.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The USB storage connected to the USB-C docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command to generate 1GB file:

      +
      openssl rand -out test_file.txt -base64 $(( 2**30 * 3/4 ))
      +
      +
    8. +
    9. +

      Read the path to the USB storage by running the following command:

      +
      lsblk
      +
      +
    10. +
    11. +

      Copy the generated file to the USB storage by running the following + command:

      +
      cp test_file.txt {path_to_usb_storage}
      +
      +
    12. +
    13. +

      Verify that the files are the same by running the following command:

      +
      sha256sum test_file.txt {path_to_usb_storage}/test_file.txt
      +
      +
    14. +
    +

    Expected result

    +

    The output from the last command should contain 2 identical checksums:

    +
    f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb  test_file.txt
    +f46597c0c63a1eefb200d40edf654e52f10c3d5d21565886ad603fabaf8d39fb  {path_to_usb_storage}/test_file.txt
    +
    +

    UTC013.002 USB Type-C docking station upload 1GB file on USB storage(Windows 11)

    +

    Test description

    +

    This test aims to verify that the 1GB file can be transferred from the +OPERATING_SYSTEM to the USB storage connected to the docking station.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The USB storage connected to the USB-C docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open powershell as administrator and run the following command to generate + 1GB file:

      +
      fsutil file createnew test_file.txt 1073741824
      +
      +
    8. +
    9. +

      Read the drive letter assigned to the USB storage by running the following + command:

      +
      (Get-Volume | where drivetype -eq removable).driveletter
      +
      +
    10. +
    11. +

      Copy the generated file to the USB storage by running the following + command:

      +
      Copy-Item -Path C:\Windows\system32\test_file.txt {drive_letter}:
      +
      +
    12. +
    13. +

      Verify that the files are the same by running the following commands:

      +
      Get-FileHash test_file.txt
      +Get-FileHash {drive_letter}:\test_file.txt
      +
      +
    14. +
    +

    Expected result

    +

    The output from the last commands should have equal hash:

    +
    Algorithm       Hash                                                              Path
    +---------       ----                                                              ----
    +SHA256          F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB  C\Windows\system3...
    +
    +
    Algorithm       Hash                                                              Path
    +---------       ----                                                              ----
    +SHA256          F46597C0C63A1EEFB200D40EDF654E52F10C3D5D21565886AD603FABAF8D39FB  E:\test_file.txt
    +
    +

    UTC014.001 USB Type-C docking station Ethernet connection (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the connection to internet via docking station's +Ethernet port can be obtained on Ubuntu 22.04.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a Ethernet cable with internet connection to docking station.
    8. +
    9. Wait for internet connection to initialize.
    10. +
    11. +

      Ping 3mdeb.com using command in terminal:

      +
      ping 3mdeb.com
      +
      +
    12. +
    +

    Expected result

    +
      +
    1. +

      Command should return ping info:

      +
      PING 3mdeb.com (178.32.205.96) 56(84) bytes of data.
      +64 bytes from cluster026.hosting.ovh.net (178.32.205.96): icmp_seq=1 ttl=50 time=44.3 ms
      +64 bytes from cluster026.hosting.ovh.net (178.32.205.96): icmp_seq=2 ttl=50 time=47.7 ms
      +64 bytes from cluster026.hosting.ovh.net (178.32.205.96): icmp_seq=3 ttl=50 time=41.1 ms
      +...
      +
      +
    2. +
    3. +

      Log should not contain phrase information that host is unreachable.

      +

      Failed ping for Ubuntu 22.04:

      +
      ping: connect: Network is unreachable
      +
      +
    4. +
    +

    UTC014.002 USB Type-C docking station Ethernet connection (Windows 11)

    +

    Test description

    +

    This test aims to verify that the connection to internet via docking station's +Ethernet port can be obtained on Windows 11.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a Ethernet cable with internet connection to docking station.
    8. +
    9. Wait for internet connection to initialize.
    10. +
    11. +

      Ping 3mdeb.com using command in PowerShell:

      +
      ping 3mdeb.com
      +
      +
    12. +
    +

    Expected result

    +
      +
    1. +

      Command should return ping info:

      +
      Pinging 3mdeb.com [178.32.205.96] with 32 bytes of data:
      +Reply from 178.32.205.96: bytes=32 time=50ms TTL=50
      +Reply from 178.32.205.96: bytes=32 time=47ms TTL=50
      +Reply from 178.32.205.96: bytes=32 time=46ms TTL=50
      +
      +
    2. +
    3. +

      Log should not contain phrase information that host is unreachable.

      +

      Failed ping for Windows 11:

      +
      Ping request could not find host 3mdeb.com. Please check the name and try again.
      +
      +
    4. +
    +

    UTC015.001 USB Type-C docking station audio recognition (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the external headset is properly recognized after +plugging in the 3.5 mm jack into the docking station.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a headset jack into the docking station.
    8. +
    9. When the Select Audio Device menu appears, select what type of external + device has been connected to the laptop (headset).
    10. +
    11. +

      Open a terminal window and run the following command:

      +
      watch -n1 lsusb
      +
      +
    12. +
    13. +

      Connect(or Disconnect) external headset to the 3.5 mm jack on the docking + station and note the result.

      +
    14. +
    +

    Expected result

    +
      +
    1. After connecting the external headset to the 3.5 mm jack, a new entry in + lsusb command output should appear.
    2. +
    3. After disconnecting the external headset from the 3.5 mm jack, a headset + entry in lsusb command output should disappear.
    4. +
    +

    UTC015.002 USB Type-C docking station audio recognition (Windows 11)

    +

    Test description

    +

    This test aims to verify that the external headset is properly recognized +after plugging in the 3.5 mm jack into the docking station.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a headset jack into the docking station
    8. +
    9. After the Which device did you plug in menu appearing, select what type + of external device has been connected to the laptop (headset).
    10. +
    11. Find the Speakers icon in the bottom right part of the screen and click + it using the right mouse button then using the left mouse button + click Sound Settings.
    12. +
    13. Locate the All sound device bar and click on it.
    14. +
    15. Connect(or Disconnect) external headset to the 3.5 mm jack on the docking + station and note the result.
    16. +
    +

    Expected result

    +
      +
    1. After connecting the external headset to the 3.5 mm jack, new entries + regarding the connected headphones should appear in the Output devices and + Input devices sections.
    2. +
    3. After disconnecting the external headset from the 3.5 mm jack, the entries + for connected headset should disappear from the Output devices and + Input devices sections.
    4. +
    +

    UTC016.001 USB Type-C docking station audio playback (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to playback audio +recordings by using the external headset speakers connected to the docking +station.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a headset jack into the docking station.
    8. +
    9. When the Select Audio Device menu appears, select what type of external + device has been connected to the laptop (headset).
    10. +
    11. +

      Open a terminal window and execute the following command:

      +
      pactl set-sink-mute alsa_output.pci-0000_00_1f.3.analog-stereo  0
      +pactl set-sink-volume alsa_output.pci-0000_00_1f.3.analog-stereo 65535
      +speaker-test
      +
      +
    12. +
    +

    Expected result

    +

    Sound should be played from the external speakers.

    +

    UTC016.002 USB Type-C docking station audio playback (Windows 11)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to playback audio +recordings by using the external headset speakers connected to the docking +station.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a headset jack into the docking station.
    8. +
    9. Find the Speakers icon in the bottom right part of the screen and click + it using the left mouse button to open volume menu.
    10. +
    11. After the Which device did you plug in menu appearing, select what type + of external device has been connected to the laptop (headset).
    12. +
    13. In the volume menu, click the rightmost part of it and note the reult.
    14. +
    +

    Expected result

    +

    Sound should be played from the external speakers.

    +

    UTC017.001 USB Type-C docking station audio capture (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to capture audio +from external headset connected to the docking station.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a headset jack into the docking station.
    8. +
    9. When the Select Audio Device menu appears, select what type of external + device has been connected to the laptop (headset).
    10. +
    11. +

      Open a terminal window and execute the following command:

      +
      arecord -f S16_LE -d 10 -r 16000 /tmp/test-mic.wav
      +
      +
    12. +
    13. +

      Make some noise for the headset. For example, say something.

      +
    14. +
    15. +

      Execute the following command:

      +
      aplay /tmp/test-mic.wav
      +
      +
    16. +
    +

    Expected result

    +

    The recorded audio clip is recorded correctly and played back.

    +

    UTC017.002 USB Type-C docking station audio capture (Windows 11)

    +

    Test description

    +

    This test aims to verify that the audio subsystem is able to capture audio +from external headset connected to the docking station.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a headset jack into the docking station.
    8. +
    9. After the Which device did you plug in menu appearing, select what type + of external device has been connected to the laptop (headset).
    10. +
    11. Find the Speakers icon in the bottom right part of the screen and click + it using the right mouse button then using the left mouse button + click Sound Settings.
    12. +
    13. Locate the All sound device bar and click on it.
    14. +
    15. Select the Microphone position in the Input devices section.
    16. +
    17. Click on the Start Test bar in the Input settings section.
    18. +
    19. Create some noise for the DUT to capture and note the result. + For example, say something.
    20. +
    21. Click on the Stop Test bar.
    22. +
    +

    Expected result

    +
      +
    1. The Input volume bar located in the Input settings section should raise when + some noise is being created.
    2. +
    3. The result of the test after clicking the Stop Test bar should be more than + 0% of the total volume.
    4. +
    +

    UTC018.001 USB Type-C docking station SD Card reader detection (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the SD Card reader built into the docking station +is enumerated correctly and might be detected by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The SD card put into the slot on the USB-C docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following command:
    8. +
    +
    lsusb | grep "Card Reader"
    +
    +
      +
    1. Note the result.
    2. +
    +

    Expected result

    +

    The output from the command should contain information about the connected USB +SD Card Reader.

    +

    Example output:

    +
    Bus 002 Device 007: ID 067b:2733 Prolific Technology, Inc. USB SD Card Reader
    +
    +

    UTC018.002 USB Type-C docking station SD Card reader detection (Windows 11)

    +

    Test description

    +

    This test aims to verify that the SD Card reader built into the docking station +is enumerated correctly and can be detected by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The SD card put into the slot on the USB-C docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open PowerShell and execute the following command:

      +
      Get-PnpDevice -Status "OK" -Class "DiskDrive"
      +
      +
    8. +
    9. +

      Note the result.

      +
    10. +
    +

    Expected result

    +

    The output from the command should contain information about the connected USB +SD Card Reader.

    +

    Example output:

    +
        OK         DiskDrive       SD Card Reader USB Device
    +
    +

    UTC019.001 USB Type-C docking station SD Card read/write (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the SD Card reader is initialized correctly and +can be used from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The SD card put into the slot on the USB-C docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and execute the following commands to identify the SD + card mounting point:

      +
      lsblk | grep "sd"
      +
      +
    8. +
    9. +

      Execute the following commands for generating, copying and comparing + generated file:

      +
      dd if=/dev/urandom of=/tmp/in.bin bs=4K count=100
      +dd if=/tmp/in.bin of=/dev/sda bs=4K count=100
      +dd if=/dev/sda of=/tmp/out.bin bs=4K count=100
      +sha256sum /tmp/in.bin /tmp/out.bin
      +
      +
    10. +
    11. +

      Note the result.

      +
    12. +
    +

    Expected result

    +
      +
    1. +

      The output from the command to identify the SD card mounting point should + return information about the SD card mounting location.

      +

      Example output:

      +
      sda           8:0    1  29,5G  0 disk
      +└─sda1        8:1    1  29,5G  0 part /media/user/DCB0-C7E8
      +sdb           8:16   1     0B  0 disk
      +
      +
    2. +
    3. +

      The output from the last command should contain 2 identical checksums.

      +

      Example output

      +
      2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb  /tmp/in.bin
      +2083776668ed0c8095a9ac42188153c02f360e116c14b36d2ef5c98665d75dcb  /tmp/out.bin
      +
      +
    4. +
    +

    UTC019.002 USB Type-C docking station SD Card read/write (Windows 11)

    +

    Test description

    +

    This test aims to verify that the SD Card reader is initialized correctly and +can be used from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. The USB-C docking station connected to the USB-C port.
    4. +
    5. The SD card put into the slot on the USB-C docking station.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Determine the localization of the mounted SD card.
    8. +
    9. +

      Open PowerShell and execute the following commands:

      +
      New-Item -Path "${drive_location}:\" -Name "testfile.txt" -ItemType "file" -Value "This is a test string."
      +Get-Content -Path "${drive_location}:\testfile.txt"
      +
      +
    10. +
    11. +

      Note the result.

      +
    12. +
    +

    Expected result

    +

    The last command should return the following message: This is a test string.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31I-nvme-switching/index.html b/unified-test-documentation/dasharo-compatibility/31I-nvme-switching/index.html new file mode 100644 index 00000000000..f13b2b8e588 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31I-nvme-switching/index.html @@ -0,0 +1,5906 @@ + + + + + + + + + + + + + + + + + + M.2 automatic SATA/NVMe switching support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: M.2 automatic SATA/NVMe switching support

    +

    MSS001.001 M.2 automatic SATA/NVMe switching support (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify detection of the NVMe and SATA disk in M.2 hybrid slot +via the Operating System slot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Insert an NVMe disk into the M.2 slot on the DUT.
    4. +
    5. Proceed with the + Generic test setup: OS installer.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute sudo parted -l.
    8. +
    9. Check if the connected disk is present on the list.
    10. +
    11. Power off the DUT.
    12. +
    13. Replace the NVMe disk with SATA M.2 disk.
    14. +
    15. Repeat steps 1-5.
    16. +
    +

    Expected result

    +
      +
    1. +

      The NVMe M.2 disk is detected in OS:

      +
      Model: SAMSUNG MZVLB256HBHQ-00000 (nvme)
      +Disk /dev/nvme0n1: 256GB
      +Sector size (logical/physical): 512B/512B
      +Partition Table: gpt
      +Disk Flags:
      +
      +Number  Start   End     Size    File system  Name                  Flags
      + 1      1049kB  2097kB  1049kB
      + 2      2097kB  540MB   538MB   fat32        EFI System Partition  boot, esp
      + 3      540MB   67,6GB  67,1GB  ext4
      + 6      67,6GB  126GB   57,9GB  ext4
      + 4      126GB   193GB   67,7GB  ext4
      + 5      193GB   256GB   62,9GB  ext4
      +
      +
    2. +
    3. +

      The SATA M.2 disk is detected in OS:

      +
      Model: ATA Hoodisk SSD (scsi)
      +Disk /dev/sda: 32,0GB
      +Sector size (logical/physical): 512B/512B
      +Partition Table: gpt
      +Disk Flags:
      +
      +Number  Start   End     Size    File system  Name                  Flags
      + 1      1049kB  538MB   537MB   fat32        EFI System Partition  boot, esp
      + 2      538MB   32,0GB  31,5GB  ext4
      +
      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31J-sleep-mode/index.html b/unified-test-documentation/dasharo-compatibility/31J-sleep-mode/index.html new file mode 100644 index 00000000000..52515049268 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31J-sleep-mode/index.html @@ -0,0 +1,6025 @@ + + + + + + + + + + + + + + + + + + Sleep mode - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Sleep mode

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    SLM001.001 Sleep mode - battery monitoring (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies how quickly the battery discharges while in sleep mode in +the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Charge the battery fully (note: due to the manufacturer's settings the + maximum battery charge level is limited to 90%; also, the battery charging + process can only be started if the current battery level is less than 80%).
    8. +
    9. Disconnect the power supply.
    10. +
    11. Close the lid.
    12. +
    13. Wake up the DUT in the following timestamps and note the battery level:
        +
      • 1 hour from fully charging,
      • +
      • 2 hours from fully charging,
      • +
      • 3 hours from fully charging,
      • +
      • 6 hours from fully charging,
      • +
      • (optional) 24 hours from fully charging.
      • +
      +
    14. +
    +

    Expected result

    +
      +
    1. The battery should discharge at a similar rate as in the table below (take + the battery wear into account).
    2. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TimeBattery level
    0h90%
    1h88%
    2h86%
    3h84%
    6h80%
    24h (optional)57%
    +

    SLM000.002 Sleep mode - battery monitoring (Windows 11)

    +

    Test description

    +

    This test verifies how quickly the battery discharges while in sleep mode in +the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Charge the battery fully (note: due to the manufacturer's settings the + maximum battery charge level is limited to 90%; also, the battery charging + process can only be started if the current battery level is less than 80%).
    8. +
    9. Wait 30 seconds for the system to load fully.
    10. +
    11. Disconnect the power supply.
    12. +
    13. Close the lid.
    14. +
    15. Wake up the DUT in the following timestamps and note the battery level:
        +
      • 1 hour from fully charging,
      • +
      • 2 hours from fully charging,
      • +
      • 3 hours from fully charging,
      • +
      • 6 hours from fully charging,
      • +
      +
    16. +
    +

    Expected result

    +
      +
    1. The battery should discharge at a similar rate as in the table below (take + the battery wear into account).
    2. +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TimeBattery level
    0h90%
    1h79%
    2h69%
    3h58%
    6h26%
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/index.html b/unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/index.html new file mode 100644 index 00000000000..7de34f03f0c --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31K-minipcie-verification/index.html @@ -0,0 +1,6218 @@ + + + + + + + + + + + + + + + + + + miniPCIe slot verification - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: miniPCIe slot verification

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    MWL001.001 Wireless card detection (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly +and can be detected from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following command:
    8. +
    +
    lspci | grep "Network controller"
    +
    +

    Expected result

    +

    The output of the command should contain information about mounted on the board +network controller.

    +

    Example output:

    +
    2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 (rev 1a)
    +
    +

    MWL001.002 Wireless card detection (Windows 11)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly +and can be detected from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open PowerShell and execute following command:
    8. +
    +
    Get-PnpDevice -PresentOnly | Select-String -Pattern "Wi-Fi"
    +
    +
      +
    1. Note the result.
    2. +
    +

    Expected result

    +

    The output of the command should contain information about mounted on the board +network controller.

    +

    Example output:

    +
    Intel(R) Wi-Fi 6AX200 160MHz
    +
    +

    MWL002.001 Wi-Fi scanning (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi functionality of card is initialized +correctly and can be used from within the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Make sure to have any Wi-Fi signal available.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following commands as root:
    8. +
    +
    nmcli radio wifi on
    +nmcli device wifi rescan
    +# Wait ~5 seconds
    +nmcli device wifi list
    +
    +

    Expected result

    +

    The output of the last command should return a list of available Wi-Fi networks, +for example:

    +
    IN-USE  BSSID              SSID                    MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
    +        XX:XX:XX:XX:XX:XX  DIRECT-ny               Infra  6     65 Mbit/s   75      ▂▄▆_  WPA2
    +*       XX:XX:XX:XX:XX:XX  3mdeb_abr_5GHz          Infra  48    405 Mbit/s  72      ▂▄▆_  WPA2
    +        XX:XX:XX:XX:XX:XX  3mdeb_abr               Infra  11    54 Mbit/s   69      ▂▄▆_  WPA2
    +        XX:XX:XX:XX:XX:XX  FunBox2-F9BF_2.4GHz     Infra  1     130 Mbit/s  50      ▂▄__  WPA1 WPA2
    +        XX:XX:XX:XX:XX:XX  H_Office                Infra  2     270 Mbit/s  35      ▂▄__  WPA2
    +        XX:XX:XX:XX:XX:XX  DIRECT-xpPhaser 3330    Infra  1     65 Mbit/s   34      ▂▄__  WPA2
    +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  108   540 Mbit/s  32      ▂▄__  WPA2
    +        XX:XX:XX:XX:XX:XX  DIRECT-KRM288x Series   Infra  11    54 Mbit/s   22      ▂___  WPA2
    +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  11    130 Mbit/s  20      ▂___  WPA2
    +        XX:XX:XX:XX:XX:XX  DIRECT-ejPhaser 3330    Infra  1     65 Mbit/s   17      ▂___  WPA2
    +        XX:XX:XX:XX:XX:XX  NED-WIFI                Infra  11    270 Mbit/s  17      ▂___  WPA2
    +
    +

    MWL002.002 Wi-Fi scanning (Windows 11)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi functionality of card is initialized +correctly and can be used from within the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Make sure to have any Wi-Fi signal available
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open PowerShell and execute following command:
    8. +
    +
    netsh wlan show network
    +
    +
      +
    1. Note the result.
    2. +
    +

    Expected result

    +
      +
    1. Output should contain 3mdeb_abr and/or 3mdeb_abr_5GHz.
    2. +
    3. Example output:
    4. +
    +
    SSID 1 : 3mdeb_abr
    +    Network type            : Infrastructure
    +    Authentication          : WPA2-Personal
    +    Encryption              : CCMP
    +
    +SSID 2 : Sonoff1 192.168.4.208 Hotspot
    +    Network type            : Infrastructure
    +    Authentication          : WPA2-Personal
    +    Encryption              : CCMP
    +
    +SSID 3 : Orange_Swiatlowod_F1A0
    +    Network type            : Infrastructure
    +    Authentication          : WPA2-Personal
    +    Encryption              : CCMP
    +
    +SSID 4 : Sonoff1 Fallback Hotspot
    +    Network type            : Infrastructure
    +    Authentication          : WPA2-Personal
    +    Encryption              : CCMP
    +
    +SSID 5 : DIRECT-KRM288x Series
    +    Network type            : Infrastructure
    +    Authentication          : WPA2-Personal
    +    Encryption              : CCMP
    +
    +

    MWL003.001 Bluetooth scanning (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Bluetooth functionality of card is initialized +correctly and can be used from within the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Enable Bluetooth and make it discoverable in any device nearby DUT.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following commands:
    8. +
    +
    bluetoothctl
    +power on
    +scan on
    +# Wait ~5 seconds
    +devices
    +
    +

    Expected result

    +

    The output of the last command should return a list of detectable Bluetooth +devices, for example:

    +
    Device XX:XX:XX:XX:XX:XX Device 1
    +Device XX:XX:XX:XX:XX:XX Wojtek N
    +Device XX:XX:XX:XX:XX:XX Mi Smart Band 4
    +Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic (PHLM)
    +Device XX:XX:XX:XX:XX:XX Galaxy Watch4 Classic (PHLM)
    +Device XX:XX:XX:XX:XX:XX Device 2
    +Device XX:XX:XX:XX:XX:XX [Signage] Samsung QMR Series
    +Device XX:XX:XX:XX:XX:XX [Signage] Samsung QMR Series
    +Device XX:XX:XX:XX:XX:XX Device 3
    +Device XX:XX:XX:XX:XX:XX Device 4
    +Device XX:XX:XX:XX:XX:XX Device 5
    +Device XX:XX:XX:XX:XX:XX Device 6
    +
    +

    MWL003.002 Bluetooth scanning (Windows 11)

    +

    Test description

    +

    This test aims to verify that the Bluetooth functionality of card is initialized +correctly and can be used from within the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Enable Bluetooth and make it discoverable in any device nearby DUT
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Enter Notification Center in the bottom right part of the screen.
    8. +
    9. Using right mouse button click on the Bluetooth icon.
    10. +
    11. In shown drop-down menu click Go to settings.
    12. +
    13. Click the + icon described as Add Bluetooth or other device.
    14. +
    15. In the Add a device menu click Bluetooth.
    16. +
    17. Wait a few moments until DUT scans for nearby Bluetooth devices and note + the result.
    18. +
    +

    Expected result

    +

    Available Bluetooth devices should appear in the Add a device window.

    +

    MWL004.001 LTE card detection (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the LTE card is detected correctly in the +operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Plug the LTE card into miniPCIe slot.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute lsusb
    8. +
    +

    Expected result

    +

    The output of the command should return a list of USB devices including LTE +module, for example:

    +
    Bus 001 Device 004: ID 05c6:9215 Qualcomm, Inc. Quectel EC20 LTE modem
    +
    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31L-smbios/index.html b/unified-test-documentation/dasharo-compatibility/31L-smbios/index.html new file mode 100644 index 00000000000..3875570d987 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31L-smbios/index.html @@ -0,0 +1,6237 @@ + + + + + + + + + + + + + + + + + + SMBIOS - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: SMBIOS

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Install the dmidecode package: sudo apt-get install dmidecode.
    10. +
    +

    DMI001.001 Verify the serial number

    +

    Test description

    +

    This test aims to verify that the serial number field is filled in correctly +according to the +Dasharo SMBIOS guidelines.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. +

      Open a terminal window and execute the following command:

      +
      dmidecode -t system
      +
      +
    2. +
    3. +

      In the BIOS Information section, check the Serial number field against the + Dasharo SMBIOS guidelines.

      +
    4. +
    +

    Expected result

    +
      +
    1. The fields should be filled in according to the Dasharo SMBIOS guidelines.
    2. +
    +

    DMI002.001 Verify the firmware version

    +

    Test description

    +

    This test aims to verify that the firmware version field is filled in correctly +according to the +Dasharo SMBIOS guidelines.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. +

      Open a terminal window and execute the following command:

      +
      dmidecode -t bios
      +
      +
    2. +
    3. +

      In the BIOS Information section, check the Version field against the + Dasharo SMBIOS guidelines.

      +
    4. +
    +

    Expected result

    +
      +
    1. The fields should be filled in according to the Dasharo SMBIOS guidelines.
    2. +
    +

    DMI003.001 Verify the firmware product name

    +

    Test description

    +

    This test aims to verify that the firmware product name fields are filled in +correctly according to the +Dasharo SMBIOS guidelines.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. +

      Open a terminal window and execute the following command:

      +
      dmidecode -t system
      +
      +
    2. +
    3. +

      In the System Information section, check the Product Name field against + the Dasharo SMBIOS guidelines.

      +
    4. +
    5. +

      Execute the following command in the terminal:

      +
      dmidecode -t baseboard
      +
      +
    6. +
    7. +

      In the Base Board Information section, check the Product Name field + against the Dasharo SMBIOS guidelines.

      +
    8. +
    +

    Expected result

    +
      +
    1. The fields should be filled in according to the Dasharo SMBIOS guidelines.
    2. +
    +

    DMI004.001 Verify the firmware release date

    +

    Test description

    +

    This test aims to verify that the firmware release date field are filled in +correctly according to the +Dasharo SMBIOS guidelines.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. +

      Open a terminal window and execute the following command:

      +
      dmidecode -t bios
      +
      +
    2. +
    3. +

      In the System Information section, check the Release Date field + against the + Dasharo SMBIOS guidelines.

      +
    4. +
    +

    Expected result

    +
      +
    1. The field should be filled in according to the Dasharo SMBIOS guidelines.
    2. +
    +

    DMI005.001 Verify the firmware manufacturer

    +

    Test description

    +

    This test aims to verify that the firmware manufacturer fields are filled in +correctly according to the +Dasharo SMBIOS guidelines.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. +

      Open a terminal window and execute the following command:

      +
      dmidecode -t system
      +
      +
    2. +
    3. +

      In the System Information section, check the Manufacturer field against + the Dasharo SMBIOS guidelines.

      +
    4. +
    5. +

      Execute the following command in the terminal:

      +
      dmidecode -t baseboard
      +
      +
    6. +
    7. +

      In the Base Board Information section, check the Manufacturer field + against the + Dasharo SMBIOS guidelines.

      +
    8. +
    +

    Expected result

    +
      +
    1. The fields should be filled in according to the Dasharo SMBIOS guidelines.
    2. +
    +

    DMI006.001 Verify the firmware vendor

    +

    Test description

    +

    This test aims to verify that the firmware vendor field is filled in correctly +according to the +Dasharo SMBIOS guidelines.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. +

      Open a terminal window and execute the following command:

      +
      dmidecode -t bios
      +
      +
    2. +
    3. +

      In the BIOS Information section, check the Vendor field against the + Dasharo SMBIOS guidelines.

      +
    4. +
    +

    Expected result

    +
      +
    1. The field should be filled in according to the Dasharo SMBIOS guidelines.
    2. +
    +

    DMI007.001 Verify the firmware family

    +

    Test description

    +

    This test aims to verify that the firmware family field is filled in correctly +according to the +Dasharo SMBIOS guidelines.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. +

      Open a terminal window and execute the following command:

      +
      dmidecode -t system
      +
      +
    2. +
    3. +

      In the System Information section, check the Family field against the + Dasharo SMBIOS guidelines.

      +
    4. +
    +

    Expected result

    +
      +
    1. The field should be filled in according to the Dasharo SMBIOS guidelines.
    2. +
    +

    DMI008.001 Verify the firmware type

    +

    Test description

    +

    This test aims to verify that the firmware type field is filled in correctly +according to the Dasharo SMBIOS guidelines.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. +

      Open a terminal window and execute the following command:

      +
      dmidecode -t chassis
      +
      +
    2. +
    3. +

      In the Chassis Information section, check the Type field against the + Dasharo SMBIOS guidelines.

      +
    4. +
    +

    Expected result

    +
      +
    1. The field should be filled in according to the Dasharo SMBIOS guidelines.
    2. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31M-emmc-support/index.html b/unified-test-documentation/dasharo-compatibility/31M-emmc-support/index.html new file mode 100644 index 00000000000..0f576d31fd6 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31M-emmc-support/index.html @@ -0,0 +1,5886 @@ + + + + + + + + + + + + + + + + + + eMMC support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: eMMC support

    +

    MMC001.001 eMMC support (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify detection of the eMMC driver via the Operating System.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute sudo parted -l.
    8. +
    9. Check if the eMMC is present on the list.
    10. +
    +

    Expected result

    +
      +
    1. +

      The eMMC disk is detected in OS:

      +
      Model: MMC 8GTF4R (sd/mmc)
      +Disk /dev/mmcblk0: 7818MB
      +Sector size (logical/physical): 512B/512B
      +Partition Table: msdos
      +Disk Flags:
      +
      +Number  Start   End     Size    Type      File system  Flags
      + 1      1049kB  538MB   537MB   primary   fat32
      + 2      538MB   1076MB  538MB   primary   fat32        boot, esp
      + 3      1077MB  7817MB  6740MB  extended
      + 5      1077MB  7817MB  6740MB  logical   ext4
      +
      +
    2. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/index.html b/unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/index.html new file mode 100644 index 00000000000..4afd35c90ff --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31M-platform-suspend-and-resume/index.html @@ -0,0 +1,6582 @@ + + + + + + + + + + + + + + + + + + Platform suspend and resume - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Platform suspend and resume

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    +

    SUSP001.001 Platform suspend and resume (Ubuntu 22.04, wakeup flag)

    +

    Test description

    +

    This test aims to verify that the DUT platform suspend and resume +functionality works correctly. As a way to wake up the device, the wakeup flag +is tested in this case.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the pm-utils package: sudo apt-get install pm-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and execute the following command to set the wakeup + flag:

      +
      rtcwake --mode no --seconds 60
      +
      +
    8. +
    9. +

      Execute the following command to enter the DUT into sleep mode:

      +
      pm-suspend
      +
      +
    10. +
    11. +

      Wait 60 seconds.

      +
    12. +
    13. Log into the system again.
    14. +
    15. +

      Execute the following command to get the results of suspend process:

      +
      cat /var/log/pm-suspend.log | grep 'suspend suspend: '
      +
      +
    16. +
    17. +

      Execute the following command to get the results of resume process:

      +
      cat /var/log/pm-suspend.log | grep 'resume suspend: '
      +
      +
    18. +
    19. +

      Note the results.

      +
    20. +
    +

    Expected result

    +
      +
    1. After entering the second command the DUT should enter sleep mode.
    2. +
    3. The DUT should automatically awaken after 60 seconds.
    4. +
    5. +

      The output of the third and fourth commands should contain information about + suspend and resume procedure hooks' status. For none of them, an error + message should be returned.

      +

      Example output for the suspend process:

      +
      /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/00logging suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success.
      +/etc/pm/sleep.d/10_grub-common suspend suspend: success.
      +/etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/99video suspend suspend: success.
      +
      +

      Example output for the resume process:

      +
      /usr/lib/pm-utils/sleep.d/99video resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/75modules resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success.
      +/etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success.
      +/etc/pm/sleep.d/10_grub-common resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/00powersave resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/00logging resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/000record-status resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success.
      +
      +
    6. +
    +

    SUSP001.003 Platform suspend and resume (QubesOS, wakeup flag)

    +

    Test description

    +

    This test aims to verify that the DUT platform suspend and resume functionality +works correctly. As a way to wake up the device, the wakeup flag is tested in +this case.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = QubesOS stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window in dom0 and execute the following command to set the + wakeup flag:

      +
      rtcwake --mode no --seconds 60
      +
      +
    8. +
    9. +

      Execute the following command to enter the DUT into sleep mode:

      +
      sudo systemctl suspend
      +
      +
    10. +
    11. +

      Wait 60 seconds.

      +
    12. +
    13. Log into the system again.
    14. +
    15. +

      Execute the following command to get the results of process:

      +
      journalctl | grep systemd-sleep
      +
      +
    16. +
    17. +

      Note the results.

      +
    18. +
    +

    Expected result

    +
      +
    1. After entering the sudo systemctl suspend command the DUT should enter + sleep mode.
    2. +
    3. +

      The output of the second command should contain information about performed + suspend and resume operations. Each suspend and resume of the system should + be reported in the output of this command with the correct date, an example + of reporting one suspend and resume operation:

      +
      Feb 10 16:38:55 dom0 systemd-sleep[14729]: Suspending system...
      +Feb 10 16:39:10 dom0 systemd-sleep[14729]: System resumed.
      +
      +
    4. +
    +

    SUSP002.001 Platform suspend and resume (Ubuntu 22.04, press key)

    +

    Test description

    +

    This test aims to verify that the DUT platform suspend and resume +functionality works correctly. As a way to wake up the device, pressing any key +on the keyboard is tested in this case.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the pm-utils package: sudo apt-get install pm-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and execute the following command to enter DUT into + sleep mode:

      +
      pm-suspend
      +
      +
    8. +
    9. +

      Wait 15 seconds.

      +
    10. +
    11. Press any key on the keyboard to resume the system.
    12. +
    13. Log into the system again.
    14. +
    15. +

      Execute the following command to get the results of suspend process:

      +
      cat /var/log/pm-suspend.log | grep 'suspend suspend: '
      +
      +
    16. +
    17. +

      Execute the following command to get the results of resume process:

      +
      cat /var/log/pm-suspend.log | grep 'resume suspend: '
      +
      +
    18. +
    19. +

      Note the results.

      +
    20. +
    +

    Expected result

    +
      +
    1. After entering the first command the DUT should enter sleep mode.
    2. +
    3. +

      The output of the second and third commands should contain information about + suspend and resume procedure hooks' status. For none of them, an error + message should be returned.

      +

      Example output for the suspend process:

      +
      /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/00logging suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success.
      +/etc/pm/sleep.d/10_grub-common suspend suspend: success.
      +/etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/99video suspend suspend: success.
      +
      +

      Example output for the resume process:

      +
      /usr/lib/pm-utils/sleep.d/99video resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/75modules resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success.
      +/etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success.
      +/etc/pm/sleep.d/10_grub-common resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/00powersave resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/00logging resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/000record-status resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success.
      +
      +
    4. +
    +

    SUSP002.003 Platform suspend and resume (QubesOS, press key)

    +

    Test description

    +

    This test aims to verify that the DUT platform suspend and resume functionality +works correctly. As a way to wake up the device, pressing any key on the +keyboard is tested in this case.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = QubesOS stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window in dom0 and execute the following command to enter + the DUT into sleep mode:

      +
      sudo systemctl suspend
      +
      +
    8. +
    9. +

      Wait 15 seconds.

      +
    10. +
    11. Press any key on the keyboard to resume the system.
    12. +
    13. Log into the system again.
    14. +
    15. +

      Execute the following command to get the results of process:

      +
      journalctl | grep systemd-sleep
      +
      +
    16. +
    17. +

      Note the results.

      +
    18. +
    +

    Expected result

    +
      +
    1. After entering the first command the DUT should enter sleep mode.
    2. +
    3. +

      The output of the second command should contain information about performed + suspend and resume operations. Each suspend and resume of the system should + be reported in the output of this command with the correct date, an example + of reporting one suspend and resume operation:

      +
      Feb 10 16:38:55 dom0 systemd-sleep[14729]: Suspending system...
      +Feb 10 16:39:10 dom0 systemd-sleep[14729]: System resumed.
      +
      +
    4. +
    +

    SUSP003.001 Platform suspend and resume (Ubuntu 22.04, push power button)

    +

    Test description

    +

    This test aims to verify that the DUT platform suspend and resume +functionality works correctly. As a way to wake up the device, pushing the +power button is tested in this case.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the pm-utils package: sudo apt-get install pm-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and execute the following command to enter DUT into + sleep mode:

      +
      pm-suspend
      +
      +
    8. +
    9. +

      Wait 15 seconds.

      +
    10. +
    11. Push the power button to resume the system.
    12. +
    13. Log into the system again.
    14. +
    15. +

      Execute the following command to get the results of suspend process:

      +
      cat /var/log/pm-suspend.log | grep 'suspend suspend: '
      +
      +
    16. +
    17. +

      Execute the following command to get the results of resume process:

      +
      cat /var/log/pm-suspend.log | grep 'resume suspend: '
      +
      +
    18. +
    19. +

      Note the results.

      +
    20. +
    +

    Expected result

    +
      +
    1. After entering the first command the DUT should enter sleep mode.
    2. +
    3. +

      The output of the second and third commands should contain information about + suspend and resume procedure hooks' status. For none of them, an error + message should be returned.

      +

      Example output for the suspend process:

      +
      /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/00logging suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success.
      +/etc/pm/sleep.d/10_grub-common suspend suspend: success.
      +/etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/99video suspend suspend: success.
      +
      +

      Example output for the resume process:

      +
      /usr/lib/pm-utils/sleep.d/99video resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/75modules resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success.
      +/etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success.
      +/etc/pm/sleep.d/10_grub-common resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/00powersave resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/00logging resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/000record-status resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success.
      +
      +
    4. +
    +

    SUSP003.003 Platform suspend and resume (QubesOS, push power button)

    +

    Test description

    +

    This test aims to verify that the DUT platform suspend and resume functionality +works correctly. As a way to wake up the device, pushing the power button is +tested in this case.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = QubesOS stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window in dom0 and execute the following command to enter + the DUT into sleep mode:

      +
      sudo systemctl suspend
      +
      +
    8. +
    9. +

      Wait 15 seconds.

      +
    10. +
    11. Push the power button to resume the system.
    12. +
    13. Log into the system again.
    14. +
    15. +

      Execute the following command to get the results of process:

      +
      journalctl | grep systemd-sleep
      +
      +
    16. +
    17. +

      Note the results.

      +
    18. +
    +

    Expected result

    +
      +
    1. After entering the first command the DUT should enter sleep mode.
    2. +
    3. +

      The output of the second command should contain information about performed + suspend and resume operations. Each suspend and resume of the system should + be reported in the output of this command with the correct date, an example + of reporting one suspend and resume operation:

      +
      Feb 10 16:38:55 dom0 systemd-sleep[14729]: Suspending system...
      +Feb 10 16:39:10 dom0 systemd-sleep[14729]: System resumed.
      +
      +
    4. +
    +

    SUSP004.001 Platform suspend and resume (Ubuntu 22.04, Wake-on-LAN)

    +

    Test description

    +

    This test aims to verify that the DUT platform suspend and resume +functionality works correctly. As a way to wake up the device, the Wake-on-LAN +mechanism is tested in this case.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the pm-utils package: sudo apt-get install pm-utils.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and execute the following command to obtain the device + lowest MAC address:

      +
      ip address
      +
      +
      +

      Note, that the output of the above command might include information about +all communication interfaces with their MAC addresses. In the Wake-on-LAN +procedure, only the lowest MAC address of the active interface will be +needed.

      +
      +
    8. +
    9. +

      Execute the following command to enter DUT into sleep mode:

      +
      pm-suspend
      +
      +
    10. +
    11. +

      Wait 15 seconds.

      +
    12. +
    13. +

      On another active machine execute the following command to send a magic + pocket:

      +
      wakeonlan <DUT MAC address>
      +
      +
    14. +
    15. +

      Log into the system (on the DUT) again.

      +
    16. +
    17. +

      Execute the following command to get the results of suspend process:

      +
      cat /var/log/pm-suspend.log | grep 'suspend suspend: '
      +
      +
    18. +
    19. +

      Execute the following command to get the results of resume process:

      +
      cat /var/log/pm-suspend.log | grep 'resume suspend: '
      +
      +
    20. +
    21. +

      Note the results.

      +
    22. +
    +

    Expected result

    +
      +
    1. After entering the first command the DUT should enter sleep mode.
    2. +
    3. +

      The output of the second and third commands should contain information about + suspend and resume procedure hooks' status. For none of them, an error + message should be returned.

      +

      Example output for the suspend process:

      +
      /usr/lib/pm-utils/sleep.d/000kernel-change suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/000record-status suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/00logging suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/00powersave suspend suspend: success.
      +/etc/pm/sleep.d/10_grub-common suspend suspend: success.
      +/etc/pm/sleep.d/10_unattended-upgrades-hibernate suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/40inputattach suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/50unload_alx suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/60_wpa_supplicant suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/75modules suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/90clock suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/94cpufreq suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/95hdparm-apm suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/95led suspend suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/98video-quirk-db-handler suspend suspend: success.
      +/usr/lib/pm-utils/sleep.d/99video suspend suspend: success.
      +
      +

      Example output for the resume process:

      +
      /usr/lib/pm-utils/sleep.d/99video resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/98video-quirk-db-handler resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/95led resume suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/95hdparm-apm resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/94cpufreq resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/90clock resume suspend: not applicable.
      +/usr/lib/pm-utils/sleep.d/75modules resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/60_wpa_supplicant resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/50unload_alx resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/40inputattach resume suspend: success.
      +/etc/pm/sleep.d/10_unattended-upgrades-hibernate resume suspend: success.
      +/etc/pm/sleep.d/10_grub-common resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/00powersave resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/00logging resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/000record-status resume suspend: success.
      +/usr/lib/pm-utils/sleep.d/000kernel-change resume suspend: success.
      +
      +
    4. +
    +

    SUSP005.001 Cyclic platform suspend and resume (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the DUT platform suspend and resume procedure +performed cyclically works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the Firmware test suite + package.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and execute the following command:

      +
      sudo fwts s3 --results-output=stderr
      +
      +
      +

      Note: suspend test duration is set defaultly to 30 seconds. After +that time the device should be woken up automatically.

      +
      +
    8. +
    9. +

      Log into the system again.

      +
    10. +
    11. Note the results.
    12. +
    13. Repeat steps 4-6 to determine the stability of suspend and resume procedure.
    14. +
    +

    Expected result

    +

    Each time, the suspend and resume procedure is performed, the output of the +command should contain information about test results (section +Test Failure Summary).

    +

    The test case passes only if after every iteration of the suspend and resume +procedure the summary section shows that all minor tests included in s3 test +have been passed.

    +

    Example output for one iteration:

    +
    Test Failure Summary
    +================================================================================
    +
    +Critical failures: NONE
    +
    +High failures: NONE
    +
    +Medium failures: NONE
    +
    +Low failures: NONE
    +
    +Other failures: NONE
    +
    +Test           |Pass |Fail |Abort|Warn |Skip |Info |
    +---------------+-----+-----+-----+-----+-----+-----+
    +s3             |    9|     |     |     |     |     |
    +---------------+-----+-----+-----+-----+-----+-----+
    +Total:         |    9|    0|    0|    0|    0|    0|
    +---------------+-----+-----+-----+-----+-----+-----+
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31N-usb-boot/index.html b/unified-test-documentation/dasharo-compatibility/31N-usb-boot/index.html new file mode 100644 index 00000000000..0fa9419cae2 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31N-usb-boot/index.html @@ -0,0 +1,5969 @@ + + + + + + + + + + + + + + + + + + USB booting - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: USB Boot

    +

    UBT001.001 USB detect and boot after coldboot

    +

    Test description

    +

    This test aims to verify that the DUT properly detects USB device and boots +into the operating system after coldboot (reboot realized by power supply +cutting off then restoring back). This test case may be re-done several times +to specify the platform and connection stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off.
    2. +
    3. Restore power to the DUT.
    4. +
    5. Wait for boot until BOOT_MENU_STRING appears.
    6. +
    7. Press BOOT_MENU_KEY to enter the boot menu.
    8. +
    9. Check if USB_STICK entry is available.
    10. +
    11. Select the proper number for USB_STICK option.
    12. +
    13. Wait for Debian GNU/Linux.
    14. +
    +

    Expected result

    +

    The Debian GNU/Linux is visible and confirms successful boot into OS after +coldboot.

    +

    UBT002.001 USB detect and boot after warmboot

    +

    Test description

    +

    This test aims to verify that the DUT properly detects USB device and boots +into the operating system after warmboot (reboot realized by device turning +off then turning on). This test case may be re-done several times to specify +the platform and connection stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Check if USB_STICK entry is available.
    8. +
    9. Select the proper number for USB_STICK option.
    10. +
    11. Wait for Debian GNU/Linux.
    12. +
    +

    Expected result

    +

    The Debian GNU/Linux is visible and confirms successful boot into OS after +warmboot.

    +

    UBT003.001 USB detect and boot after system reboot

    +

    Test description

    +

    This test aims to verify that the DUT properly detects USB device and boots +into the operating system after system reboot (reboot performed by relevant +command). This test case may be re-done several times to specify the +platform and connection stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Check if USB_STICK entry is available.
    8. +
    9. Select the proper number for USB_STICK option.
    10. +
    11. Wait for Debian GNU/Linux.
    12. +
    13. Wait for debian login:.
    14. +
    15. Type the root login.
    16. +
    17. Wait for Password:.
    18. +
    19. Type the proper password.
    20. +
    21. Wait for root@debian:~#.
    22. +
    23. Execute reboot command.
    24. +
    25. Wait for boot until BOOT_MENU_STRING appears.
    26. +
    27. Press BOOT_MENU_KEY to enter the boot menu.
    28. +
    29. Check if USB_STICK entry is available.
    30. +
    31. Select the proper number for USB_STICK option.
    32. +
    33. Wait for Debian GNU/Linux.
    34. +
    +

    Expected result

    +

    The Debian GNU/Linux is visible and confirms successful boot into OS after +system reboot.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31O-usb-detect/index.html b/unified-test-documentation/dasharo-compatibility/31O-usb-detect/index.html new file mode 100644 index 00000000000..f4db3ad44b9 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31O-usb-detect/index.html @@ -0,0 +1,5966 @@ + + + + + + + + + + + + + + + + + + USB detection - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: USB Detection

    +

    UDT001.001 USB detection after coldboot

    +

    Test description

    +

    This test aims to verify that the DUT properly detects USB device after +coldboot (reboot realized by power supply cutting off then restoring back). +This test case may be re-done several times to specify the platform and +connection stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off.
    2. +
    3. Restore power to the DUT.
    4. +
    5. Wait for boot until BOOT_MENU_STRING appears.
    6. +
    7. Press BOOT_MENU_KEY to enter the boot menu.
    8. +
    9. Check if USB_STICK entry is available.
    10. +
    +

    Expected result

    +

    The USB_STICK entry is visible which confirms successful detection after +coldboot.

    +

    UDT002.001 USB detection after warmboot

    +

    Test description

    +

    This test aims to verify that the DUT properly detects USB device after +warmboot (reboot realized by device turning off then turning on). This test case +may be re-done several times to specify the platform and connection stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Check if USB_STICK entry is available.
    8. +
    +

    Expected result

    +

    The USB_STICK entry is visible which confirms successful detection after +warmboot.

    +

    UDT003.001 USB detection after system reboot

    +

    Test description

    +

    This test aims to verify that the DUT properly detects USB device after system +reboot (reboot performed by relevant command). This test case may be re-done +several times to specify the platform and connection stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Check if USB_STICK entry is available.
    8. +
    9. Select the key with a proper number for iPXE.
    10. +
    11. Press Ctrl+B when prompted to stop iPXE from booting automatically.
    12. +
    13. Wait until iPXE> prompt appears.
    14. +
    15. Type in dhcp to obtain an IP address.
    16. +
    17. Type in chain and local iPXE address after a single space to load a network +boot menu.
    18. +
    19. Select Debian stable netboot 4.14.y option below iPXE boot menu header.
    20. +
    21. Wait for debian login:.
    22. +
    23. Type the root login.
    24. +
    25. Wait for Password:.
    26. +
    27. Type the proper password.
    28. +
    29. Wait for root@debian:~#.
    30. +
    31. Execute reboot command.
    32. +
    33. Wait for boot until BOOT_MENU_STRING appears.
    34. +
    35. Press BOOT_MENU_KEY to enter the boot menu.
    36. +
    37. Check if USB_STICK entry is available.
    38. +
    +

    Expected result

    +

    The USB_STICK entry is visible which confirms successful detection after +system reboot.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31P-flash-write-protection/index.html b/unified-test-documentation/dasharo-compatibility/31P-flash-write-protection/index.html new file mode 100644 index 00000000000..46092bcfc93 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31P-flash-write-protection/index.html @@ -0,0 +1,5990 @@ + + + + + + + + + + + + + + + + + + Flash write protection - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Security: Flash write protection

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Make yourself familiar with + SPI hardware write protection.
    8. +
    +

    HWP001.001 Hardware flash write protection support

    +

    Test description

    +

    This test aims to verify whether the DUT supports hardware write protection +mechanism.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Open a terminal window and execute the following command:
    2. +
    +
    sudo ./flashrom -p internal --wp-list
    +
    +

    Expected result

    +

    The output of the command should contain the information about lst of +available write protection ranges, example has been shown below:

    +
    Available write protection ranges:
    +    start=0x00000000 length=0x00000000 (none)
    +    start=0x00000000 length=0x00001000 (lower 1/2048)
    +    start=0x007ff000 length=0x00001000 (upper 1/2048)
    +    start=0x00000000 length=0x00002000 (lower 1/1024)
    +    start=0x007fe000 length=0x00002000 (upper 1/1024)
    +    start=0x00000000 length=0x00004000 (lower 1/512)
    +    start=0x007fc000 length=0x00004000 (upper 1/512)
    +    start=0x00000000 length=0x00008000 (lower 1/256)
    +    start=0x007f8000 length=0x00008000 (upper 1/256)
    +    start=0x00000000 length=0x00020000 (lower 1/64)
    +    start=0x007e0000 length=0x00020000 (upper 1/64)
    +    start=0x00000000 length=0x00040000 (lower 1/32)
    +    start=0x007c0000 length=0x00040000 (upper 1/32)
    +    start=0x00000000 length=0x00080000 (lower 1/16)
    +    start=0x00780000 length=0x00080000 (upper 1/16)
    +    start=0x00000000 length=0x00100000 (lower 1/8)
    +    start=0x00700000 length=0x00100000 (upper 1/8)
    +    start=0x00000000 length=0x00200000 (lower 1/4)
    +    start=0x00600000 length=0x00200000 (upper 1/4)
    +    start=0x00000000 length=0x00400000 (lower 1/2)
    +    start=0x00400000 length=0x00400000 (upper 1/2)
    +    start=0x00000000 length=0x00600000 (lower 3/4)
    +    start=0x00200000 length=0x00600000 (upper 3/4)
    +    start=0x00000000 length=0x00700000 (lower 7/8)
    +    start=0x00100000 length=0x00700000 (upper 7/8)
    +    start=0x00000000 length=0x00780000 (lower 15/16)
    +    start=0x00080000 length=0x00780000 (upper 15/16)
    +    start=0x00000000 length=0x007c0000 (lower 31/32)
    +    start=0x00040000 length=0x007c0000 (upper 31/32)
    +    start=0x00000000 length=0x007e0000 (lower 63/64)
    +    start=0x00020000 length=0x007e0000 (upper 63/64)
    +    start=0x00000000 length=0x007f8000 (lower 255/256)
    +    start=0x00008000 length=0x007f8000 (upper 255/256)
    +    start=0x00000000 length=0x007fc000 (lower 511/512)
    +    start=0x00004000 length=0x007fc000 (upper 511/512)
    +    start=0x00000000 length=0x007fe000 (lower 1023/1024)
    +    start=0x00002000 length=0x007fe000 (upper 1023/1024)
    +    start=0x00000000 length=0x007ff000 (lower 2047/2048)
    +    start=0x00001000 length=0x007ff000 (upper 2047/2048)
    +    start=0x00000000 length=0x00800000 (all)
    +
    +

    HWP002.001 Hardware flash write protection enable / disable

    +

    Test description

    +

    This test aims to verify whether there is a possibility to set and erase +hardware write protection on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Based on the documentation + erase current write protection.
    2. +
    3. Based on the documentation + set write protection for a specific range.
    4. +
    5. +

      Execute the following command in the terminal to check the status and the + range of write protection:

      +
      sudo ./flashrom -p internal --wp-status
      +
      +
    6. +
    +

    Expected result

    +
      +
    1. +

      The output of the command should contain the information about protection + mode:

      +
      Protection mode: hardware
      +
      +
    2. +
    3. +

      Protection range: read from the command output and set before should be the + same.

      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31R-pcie-ports/index.html b/unified-test-documentation/dasharo-compatibility/31R-pcie-ports/index.html new file mode 100644 index 00000000000..fc8d7c5fdfa --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31R-pcie-ports/index.html @@ -0,0 +1,5841 @@ + + + + + + + + + + + + + + + + + + Dasharo Compatibility: PCI Express ports support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: PCI Express ports support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    PEX001.001 PCI Express card detection (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the PCI Express extension card is enumerated +correctly and can be detected from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Plug the PCI Express extension card to the tested slot.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following command:
    8. +
    +
    lspci
    +
    +

    Expected result

    +

    The output of the command should contain the plugged device name:

    +
    01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Turks PRO [Radeon HD 7570]
    +
    +

    The exact name and revision may be different depending on hardware configuration.

    +

    PEX001.002 PCI Express card detection (Windows 11)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi/Bluetooth card is enumerated correctly +and can be detected from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Plug the PCI Express extension card to the tested slot.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open Device Manager and find the plugged device
    8. +
    9. Note the device status.
    10. +
    +

    Expected result

    +

    The device status in the Device Manager should indicate that the device is +working properly and has no problems.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31S-sata-led-and-pc-speaker-error-indication/index.html b/unified-test-documentation/dasharo-compatibility/31S-sata-led-and-pc-speaker-error-indication/index.html new file mode 100644 index 00000000000..f937dee1df1 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31S-sata-led-and-pc-speaker-error-indication/index.html @@ -0,0 +1,5874 @@ + + + + + + + + + + + + + + + + + + SATA LED and PC speaker error indication - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: SATA LED and PC speaker error indication

    +

    ERR001.001 SATA LED and PC speaker error indication support (firmware)

    +

    Test description

    +

    This test aims to verify if SATA LED blink and PC speaker beeps on critical +firmware errors.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. DUT with PC speaker
    4. +
    5. DUT with SATA LED
    6. +
    7. DUT with removable RAM modules.
    8. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Remove power from DUT.
    2. +
    3. Remove all RAM memory modules from the DUT.
    4. +
    5. Connect power supply and power on the DUT.
    6. +
    7. Observe the DUT starts blinking the SATA LED and beeps with PC speaker.
    8. +
    +

    Expected result

    +

    When no memory modules are connected, this is considered a critical firmware +error and the platform can not proceed with booting. Error indication path will +be triggered causing the platform to beep and blink the SATA LED. There should +be only 12 beeps, but the SATA LED should blink endlessly (until DUT is powered +off or reset).

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31T-cpu-status/index.html b/unified-test-documentation/dasharo-compatibility/31T-cpu-status/index.html new file mode 100644 index 00000000000..0aed79d5868 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31T-cpu-status/index.html @@ -0,0 +1,6262 @@ + + + + + + + + + + + + + + + + + + CPU status - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: CPU Status

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    CPU001.001 CPU works (Ubuntu 22.04)

    +

    Test description

    +

    Check whether the mounted on the DUT CPU works.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot and note the result.
    4. +
    +

    Expected result

    +

    The OPERATING_SYSTEM screen should be displayed.

    +

    CPU001.002 CPU works (Windows 11)

    +

    Test description

    +

    Check whether the mounted on the DUT CPU works.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot and note the result.
    4. +
    +

    Expected result

    +

    The OPERATING_SYSTEM screen should be displayed.

    +

    CPU002.001 CPU cache enabled (Ubuntu 22.04)

    +

    Test description

    +

    Check whether all declared for the DUT cache levels are enabled.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot.
    4. +
    5. +

      Execute below command in terminal:

      +
      getconf -a | grep CACHE
      +
      +
    6. +
    7. +

      Note the result.

      +
    8. +
    +

    Expected result

    +

    The output of the command should contain information about all cache levels, +their size and association. Example output:

    +
    LEVEL1_ICACHE_SIZE                 32768
    +LEVEL1_ICACHE_ASSOC                32
    +LEVEL1_ICACHE_LINESIZE             128
    +LEVEL1_DCACHE_SIZE                 32768
    +LEVEL1_DCACHE_ASSOC                32
    +LEVEL1_DCACHE_LINESIZE             128
    +LEVEL2_CACHE_SIZE                  524288
    +LEVEL2_CACHE_ASSOC                 2048
    +LEVEL2_CACHE_LINESIZE              32
    +LEVEL3_CACHE_SIZE                  10485760
    +LEVEL3_CACHE_ASSOC                 40960
    +LEVEL3_CACHE_LINESIZE              32
    +LEVEL4_CACHE_SIZE                  0
    +LEVEL4_CACHE_ASSOC                 0
    +LEVEL4_CACHE_LINESIZE              0
    +
    +

    CPU002.002 CPU cache enabled (Windows 11)

    +

    Test description

    +

    Check whether all declared for the DUT cache levels are enabled.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot.
    4. +
    5. +

      Run PowerShell as an administrator and execute command:

      +
      Get-Wmiobject -class win32_cachememory | fl Purpose, CacheType, InstalledSize
      +
      +
    6. +
    7. +

      Note the result.

      +
    8. +
    +

    Expected result

    +

    The output of the command should contain information about all cache levels, +their size and association. Example output:

    +
    Purpose       : CACHE1
    +CacheType     : 4
    +InstalledSize : 192
    +
    +Purpose       : CACHE1
    +CacheType     : 3
    +InstalledSize : 128
    +
    +Purpose       : CACHE2
    +CacheType     : 5
    +InstalledSize : 5120
    +
    +Purpose       : CACHE3
    +CacheType     : 5
    +InstalledSize : 8192
    +
    +

    CPU003.001 Multiple CPU support (Ubuntu 22.04)

    +

    Test description

    +

    Check whether the DUT has multiple CPU support.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot.
    4. +
    5. +

      Execute below command in terminal:

      +
      lscpu
      +
      +
    6. +
    7. +

      Note the result.

      +
    8. +
    +

    Expected result

    +

    The output of the command should contain basic information about the CPU, +including the number of the CPU (s). If CPU(s) are more than 1, the DUT +has multiple CPU support. Example results:

    +
    Architecture:                    ppc64le
    +Byte Order:                      Little Endian
    +CPU(s):                          32
    +On-line CPU(s) list:             0-31
    +Thread(s) per core:              4
    +Core(s) per socket:              4
    +Socket(s):                       2
    +NUMA node(s):                    2
    +
    +

    CPU003.002 Multiple CPU support (Windows 11)

    +

    Test description

    +

    Check whether the DUT has multiple CPU support.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot.
    4. +
    5. +

      Run PowerShell as an administrator and execute command:

      +
      WMIC CPU Get NumberOfCores
      +
      +
    6. +
    7. +

      Note the result.

      +
    8. +
    +

    Expected result

    +

    The output of the command should contain information about the CPUs. +Example results:

    +
    NumberOfCores
    +4
    +
    +

    CPU004.001 Multiple-core support (Ubuntu 22.04)

    +

    Test description

    +

    Check whether the DUT has multi-core support.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot.
    4. +
    5. +

      Execute below command in terminal:

      +
      lscpu
      +
      +
    6. +
    7. +

      Note the result.

      +
    8. +
    +

    Expected result

    +

    The output of the command should contain basic information about the CPU, +including the number of the Core(s) per socket. If Core(s) per socket +are more than 1, the DUT has multi-core support. Example results:

    +
    Architecture:                    ppc64le
    +Byte Order:                      Little Endian
    +CPU(s):                          32
    +On-line CPU(s) list:             0-31
    +Thread(s) per core:              4
    +Core(s) per socket:              4
    +Socket(s):                       2
    +NUMA node(s):                    2
    +
    +

    CPU004.002 Multiple-core support (Windows 11)

    +

    Test description

    +

    Check whether the DUT has multi-core support.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the OPERATING_SYSTEM to boot.
    4. +
    5. +

      Run PowerShell as an administrator and check total CPU cores by executing +command:

      +
      WMIC CPU Get NumberOfCores
      +
      +
    6. +
    7. +

      Note the result.

      +
    8. +
    9. +

      Check total CPU socket number by executing command:

      +
      (Get-CimInstance -ClassName Win32_ComputerSystem).NumberOfProcessors
      +
      +
    10. +
    11. +

      Note the result.

      +
    12. +
    +

    Expected result

    +
      +
    1. +

      If number of cores is higher than number of sockets then DUT has multi-core +support. Example outputs:

      +
    2. +
    3. +

      1st command:

      +
    4. +
    +
    NumberOfCores
    +4
    +
    +
      +
    • 2nd command:
    • +
    +
    1
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/index.html b/unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/index.html new file mode 100644 index 00000000000..46d64a16e4f --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31U-heads-bootloader-support/index.html @@ -0,0 +1,6718 @@ + + + + + + + + + + + + + + + + + + Heads bootloader support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Heads bootloader support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    HDS001.001 Heads installation

    +

    Test description

    +

    This test aims to verify that Heads could be installed on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Flash bootkernel partition with Heads in accordance with the + documentation.
    2. +
    +

    Expected result

    +

    The output of the pflash command should contain information, that flashing +procedure has been ended without any errors.

    +

    Example output:

    +
    Programming & Verifying...
    +[==================================================] 100% ETA:0s
    +
    +

    HDS002.001 Boot into Heads

    +

    Test description

    +

    This test aims to verify that the DUT during the booting procedure reaches +Heads bootloader.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Heads to boot and note the result.
    4. +
    +

    Expected result

    +

    The Heads bootloader screen should be displayed.

    +

    HDS003.001 Boot from USB option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the Boot from USB option in the +Default boot menu is available (if there is no option to boot OS from the +Hard Disk) and allows to boot system mounted on the USB.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. USB storage with the installed OS.
    4. +
    +

    Test steps

    +
      +
    1. Plug the USB storage into DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Wait for the Default boot menu appears.
    6. +
    7. Select Boot from USB option using the arrow keys and Enter.
    8. +
    9. Select a partition from the USB storage from which the system will be + booted.
    10. +
    11. Note the results.
    12. +
    +

    Expected result

    +

    The operating system from USB storage should boot properly.

    +

    HDS004.001 Continue to the main menu option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the Continue to the main menu option in the +Default boot menu is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Continue to the main menu option using the arrow keys and Enter.
    6. +
    7. Note the results.
    8. +
    +

    Expected result

    +

    After selecting Continue to the main menu, the Heads Boot Menu should be +displayed.

    +

    HDS005.001 Exit to recovery shell option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the Exit to recovery shell option in the +Default boot menu is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Exit to recovery shell option using the arrow keys and Enter.
    6. +
    7. Note the results.
    8. +
    +

    Expected result

    +

    After selecting Exit to recovery shell, the recovery shell should be shown.

    +

    Example output:

    +
    !!!!! User requested recovery shell
    +!!!!! Starting recovery shell
    +~ #
    +
    +

    HDS006.001 Default boot option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the Default boot option in the Heads boot menu +is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Continue to the main menu option using the arrow keys and Enter.
    6. +
    7. Select the Default boot option in the Heads boot menu.
    8. +
    9. Note the results.
    10. +
    +

    Expected result

    +

    After selecting Default boot, the Default boot menu should be displayed.

    +

    HDS007.001 Options submenu is available and works correctly

    +

    Test description

    +

    This test aims to verify that the Options --> option in the Heads boot menu +is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Continue to the main menu option using the arrow keys and Enter.
    6. +
    7. Select the Options --> option in the Heads boot menu.
    8. +
    9. Note the results.
    10. +
    +

    Expected result

    +

    After selecting Options -->, the HEADS Options menu should be displayed.

    +

    Example view of HEADS Options:

    +
    b  Boot Options -->
    +t  TPM/TOTP/HOTP Options -->
    +u  Update checksums and sign all files in /boot
    +c  Change configuration settings -->
    +f  Flash/Update the BIOS -->
    +g  GPG Options -->
    +F  OEM Factory Reset -->
    +x  Exit to recovery shell
    +r  <-- Return to main menu
    +
    +

    HDS008.001 System info option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the System Info option in the Heads boot menu +allows displaying all basic system information.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Continue to the main menu option using the arrow keys and Enter.
    6. +
    7. Select the System Info option in the Heads boot menu.
    8. +
    9. Note the results.
    10. +
    +

    Expected result

    +

    After selecting System Info, the basic system information should be displayed.

    +

    Example output:

    +
    ┌─────────────────────┤ System Info ├──────────────────────┐
    +│                                                          │
    +│ Talos 2 Server                                           │
    +│                                                          │
    +│ FW_VER: v0.5.0                                           │
    +│ Kernel: Linux 5.5.0-openpower1                           │
    +│                                                          │
    +│ CPU: IBM POWER9 “Sforza”                                 │
    +│ RAM: 8 GB                                                │
    +│                                                          │
    +│ Disk /dev/nvme0n1: 477 GB                                │
    +│                                                          │
    +│                                                          │
    +│                          <Ok>                            │
    +│                                                          │
    +└──────────────────────────────────────────────────────────┘
    +
    +

    HDS009.001 Power off option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the Power Off option in the Heads boot menu +allows turning off the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Continue to the main menu option using the arrow keys and Enter.
    6. +
    7. Select the Power Off option in the Heads boot menu.
    8. +
    9. Note the results.
    10. +
    +

    Expected result

    +

    After selecting Power Off, the DUT should be turned off without any +complications.

    +

    HDS010.001 OEM Factory Reset option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the OEM Factory Reset / Re-Ownership --> option +in the HEADS Options submenu is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. USB Security Dongle
    4. +
    5. Previously installed OS
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB Security Dongle into DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Wait for the Default boot menu appears.
    6. +
    7. Select the Continue to the main menu option using the arrow keys and Enter.
    8. +
    9. Select the Options --> option in the Heads boot menu.
    10. +
    11. Select the OEM Factory Reset / Re-Ownership --> option in the + HEADS Options submenu.
    12. +
    13. Choose <Continue> in the displayed OEM Factory Reset / Re-Ownership + window using the arrow keys and Enter.
    14. +
    15. Go through the installation process by answering the questions.
    16. +
    17. Note the results.
    18. +
    +

    Expected result

    +
      +
    1. The Provisioned Security Components Secrets should be displayed at the end + of the installation.
    2. +
    3. The new GPG keys should be placed on the USB Security Dongle.
    4. +
    +

    HDS011.001 Add GPG key to running BIOS and reflash

    +

    Test description

    +

    This test aims to verify that the Add GPG key to running BIOS and reflash +option in the GPG Management Menu is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. Additional USB storage - at least 1GB, with GPG public key
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB storage into DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Wait for the Default boot menu appears.
    6. +
    7. Select the Continue to the main menu option using the arrow keys and Enter.
    8. +
    9. Select the Options --> option in the Heads boot menu.
    10. +
    11. Select the GPG Options --> option in the HEADS Options submenu.
    12. +
    13. Select the Add GPG key to running BIOS and reflash option in the + GPG Management Menu.
    14. +
    15. Choose <Yes> in the displayed GPG public key required window using the + arrow keys and Enter.
    16. +
    17. Choose GPG public key from the USB storage and press Enter.
    18. +
    19. Select the Options --> option in the Heads boot menu.
    20. +
    21. Select the GPG Options --> option in the HEADS Options submenu.
    22. +
    23. Select the List GPG keys in your keyring option in the + GPG Management Menu.
    24. +
    25. Note the results.
    26. +
    +

    Expected result

    +

    The GPG Keyring window should contain information about the given GPG key.

    +

    HDS012.001 Add GPG key to standalone BIOS image and flash

    +

    Test description

    +

    This test aims to verify that the +Add GPG key to standalone BIOS image and flash option in the +GPG Management Menu is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. Additional USB storage - at least 1GB, with GPG public key and BIOS image
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB storage into DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Wait for the Default boot menu appears.
    6. +
    7. Select the Continue to the main menu option using the arrow keys and Enter.
    8. +
    9. Select the Options --> option in the Heads boot menu.
    10. +
    11. Select the GPG Options --> option in the HEADS Options submenu.
    12. +
    13. Select the Add GPG key to standalone BIOS image and flash option in the + GPG Management Menu.
    14. +
    15. Choose <Yes> in the displayed GPG public key required window using the + arrow keys and Enter.
    16. +
    17. Choose GPG public key from the USB storage and press Enter.
    18. +
    19. Choose BIOS image(*.rom) from the USB storage and press Enter.
    20. +
    21. Choose <Yes> in the displayed Flash ROM? window using the arrow keys and + Enter.
    22. +
    23. Select the Options --> option in the Heads boot menu.
    24. +
    25. Select the GPG Options --> option in the HEADS Options submenu.
    26. +
    27. Select the List GPG keys in your keyring option in the + GPG Management Menu.
    28. +
    29. Note the results.
    30. +
    +

    Expected result

    +

    The GPG Keyring window should contain information about the given GPG key.

    +

    HDS013.001 Replace GPG key(s) in the current ROM and reflash

    +

    Test description

    +

    This test aims to verify that the +Replace GPG key(s) in the current ROM and reflash option in the +GPG Management Menu is available and replaces GPG keys correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. Additional USB storage - at least 1GB, with GPG public key
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB storage into DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Wait for the Default boot menu appears.
    6. +
    7. Select the Continue to the main menu option using the arrow keys and Enter.
    8. +
    9. Select the Options --> option in the Heads boot menu.
    10. +
    11. Select the GPG Options --> option in the HEADS Options submenu.
    12. +
    13. Select the Replace GPG key(s) in the current ROM and reflash option in the + GPG Management Menu.
    14. +
    15. Choose <Yes> in the displayed GPG public key required window using the + arrow keys and Enter.
    16. +
    17. Choose GPG public key from the USB storage and press Enter.
    18. +
    19. Select the Options --> option in the Heads boot menu.
    20. +
    21. Select the GPG Options --> option in the HEADS Options submenu.
    22. +
    23. Select the List GPG keys in your keyring option in the + GPG Management Menu.
    24. +
    25. Note the results.
    26. +
    +

    Expected result

    +

    The GPG Keyring window should contain information about the given GPG key.

    +

    HDS014.001 List GPG keys in your keyring

    +

    Test description

    +

    This test aims to verify that the List GPG keys in your keyring option in the +GPG Management Menu is available and listed GPG keys correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Continue to the main menu option using the arrow keys and Enter.
    6. +
    7. Select the Options --> option in the Heads boot menu.
    8. +
    9. Select the GPG Options --> option in the HEADS Options submenu.
    10. +
    11. Select the List GPG keys in your keyring option in the + GPG Management Menu.
    12. +
    13. Note the results.
    14. +
    +

    Expected result

    +
      +
    1. +

      The GPG Keyring window should contain information about the GPG key if any + was added.

      +

      Example information in the GPG Keyring window:

      +
      //.gnupg/pubring.kbx
      +--------------------
      +pub   rsa3072 2022-11-22 [SC]
      +      AFA824E4660A265253BA1571B640E02380808C34
      +uid          [ultimate] OEM Key (OEM-generated key) <oem-20221122083831@example.co
      +sub   rsa3072 2022-11-22 [A]
      +sub   rsa3072 2022-11-22 [E]
      +
      +
    2. +
    3. +

      The GPG Keyring window should be empty if no key has been added.

      +
    4. +
    +

    HDS015.001 Export public GPG key to USB drive

    +

    Test description

    +

    This test aims to verify that the Export public GPG key to USB drive option in +the GPG Management Menu is available and exports GPG keys correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. Additional USB storage - at least 1GB
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Continue to the main menu option using the arrow keys and Enter.
    6. +
    7. Select the Options --> option in the Heads boot menu.
    8. +
    9. Select the GPG Options --> option in the HEADS Options submenu.
    10. +
    11. Select the Export public GPG key to USB drive option in the + GPG Management Menu.
    12. +
    13. Choose <Yes> in the displayed Export Public Key(s) to USB drive? window + using the arrow keys and Enter.
    14. +
    15. Note the results.
    16. +
    +

    Expected result

    +
      +
    1. The GPG Key Copied Successfully window should be displayed.
    2. +
    3. The public-key.asc file should be on USB storage.
    4. +
    +

    HDS016.001 Generate GPG keys manually on a USB security token

    +

    Test description

    +

    This test aims to verify that the +Generate GPG keys manually on a USB security token option in the +GPG Management Menu is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. USB Security Dongle
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB Security Dongle into DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Wait for the Default boot menu appears.
    6. +
    7. Select the Continue to the main menu option using the arrow keys and Enter.
    8. +
    9. Select the Options --> option in the Heads boot menu.
    10. +
    11. Select the GPG Options --> option in the HEADS Options submenu.
    12. +
    13. Select the Generate GPG keys manually on a USB security token option in the + GPG Management Menu.
    14. +
    15. Confirm that the USB Security Dongle is inserted, type Y and press Enter.
    16. +
    17. Wait for gpg/card> prompt is appeared.
    18. +
    19. Type admin and press Enter.
    20. +
    21. Type generate and press Enter.
    22. +
    23. Answer y to question Replace existing keys?.
    24. +
    25. Note the results.
    26. +
    +

    Expected result

    +
      +
    1. Information about the successful generation of GPG keys should be displayed.
    2. +
    3. The new GPG keys are on the USB Security Dongle.
    4. +
    +

    HDS017.001 Clear GPG key(s) and reset all user settings

    +

    Test description

    +

    This test aims to verify that the +Clear GPG key(s) and reset all user settings option in the +Config Management Menu is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Continue to the main menu option using the arrow keys and Enter.
    6. +
    7. Select the Options --> option in the Heads boot menu.
    8. +
    9. Select the Change configuration settings --> option in the HEADS Options + submenu.
    10. +
    11. Select the Clear GPG key(s) and reset all user settings option in the + Config Management Menu.
    12. +
    13. Choose <Yes> in the displayed Reset Configuration? window using the + arrow keys and Enter.
    14. +
    15. Reboot the DUT.
    16. +
    17. Wait for the Default boot menu appears.
    18. +
    19. Select the Continue to the main menu option using the arrow keys and Enter.
    20. +
    21. Select the Options --> option in the Heads boot menu.
    22. +
    23. Select the GPG Options --> option in the HEADS Options submenu.
    24. +
    25. Select the List GPG keys in your keyring option in the + GPG Management Menu.
    26. +
    27. Note the results.
    28. +
    +

    Expected result

    +

    The GPG Keyring window should be empty.

    +

    HDS018.001 Reset TPM option is available and works correctly

    +

    Test description

    +

    This test aims to verify that the Reset TPM option in the +TPM/TOTP/HOTP Options submenu is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Continue to the main menu option using the arrow keys and Enter.
    6. +
    7. Select the Options --> option in the Heads boot menu.
    8. +
    9. Select the TPM/TOTP/HOTP Options --> option in the HEADS Options submenu.
    10. +
    11. Select the Reset the TPM option in the TPM/TOTP/HOTP Options submenu.
    12. +
    13. Choose <Yes> in the displayed Reset the TPM window using the arrow keys + and Enter.
    14. +
    15. Set the TPM owner password.
    16. +
    17. Scan the QR code using a mobile application to add the new TOTP secret and + press Enter.
    18. +
    19. Reboot the DUT.
    20. +
    21. Wait for the Default boot menu appears.
    22. +
    23. Select the Continue to the main menu option using the arrow keys and Enter.
    24. +
    +

    Expected result

    +

    After selecting the Continue to the main menu option, should be prompted for +the TPM owner password.

    +

    HDS019.001 Generate new TOTP/HOTP secret

    +

    Test description

    +

    This test aims to verify that the Generate new TOTP/HOTP secret option in the +TPM/TOTP/HOTP Options submenu is available and works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Default boot menu appears.
    4. +
    5. Select the Continue to the main menu option using the arrow keys and Enter.
    6. +
    7. Select the Options --> option in the Heads boot menu.
    8. +
    9. Select the TPM/TOTP/HOTP Options --> option in the HEADS Options submenu.
    10. +
    11. Select the Generate new TOTP/HOTP secret option in the + TPM/TOTP/HOTP Options submenu.
    12. +
    13. Scan the QR code using a mobile application to add the new TOTP secret and + press Enter.
    14. +
    15. Reboot the DUT.
    16. +
    17. Wait for the Default boot menu appears.
    18. +
    19. Select the Continue to the main menu option using the arrow keys and Enter.
    20. +
    +

    Expected result

    +

    After selecting the Continue to the main menu option, should be prompted for +the TOTP password.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31V-petitboot-payload-support/index.html b/unified-test-documentation/dasharo-compatibility/31V-petitboot-payload-support/index.html new file mode 100644 index 00000000000..b423cbfd682 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31V-petitboot-payload-support/index.html @@ -0,0 +1,5962 @@ + + + + + + + + + + + + + + + + + + Petitboot payload support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Petitboot payload support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    PBT001.001 Boot into Petitboot

    +

    Test description

    +

    This test verifies that the DUT during booting procedure reaches Petitboot +menu.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Petitboot to boot and note the result.
    4. +
    +

    Expected result

    +

    The Petitbooot menu screen should be displayed.

    +

    PBT002.001 Read System Information from Petitboot

    +

    Test description

    +

    This test verifies that Petitboot System Information option is available and +works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Petitboot to boot.
    4. +
    5. Select the System Information option using the arrow keys and press + Enter.
    6. +
    7. Note the result.
    8. +
    +

    Expected result

    +

    After select System Information option, device information tree should be +displayed.

    +

    PBT003.001 Rescan Devices by Petitboot

    +

    Test description

    +

    This test verifies that Petitboot Rescan Device option is available and +works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Petitboot to boot.
    4. +
    5. Select the Rescan Devices option using the arrow keys and press Enter.
    6. +
    7. Note the results.
    8. +
    9. Attach USB Stick with bootable system to USB port in DUT.
    10. +
    11. Select the Rescan Devices again and note the results.
    12. +
    +

    Expected result

    +

    Information about the attached USB Stick should be displayed after the +second use of the Rescan Devices option.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/31W-device-tree/index.html b/unified-test-documentation/dasharo-compatibility/31W-device-tree/index.html new file mode 100644 index 00000000000..5af5a02ff3a --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/31W-device-tree/index.html @@ -0,0 +1,5960 @@ + + + + + + + + + + + + + + + + + + Device Tree - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: Device tree

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    DVT001.001 Node with coreboot exists

    +

    Test description

    +

    This test aims to verify whether the node with the coreboot exists in the Device +Tree.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      xxd /sys/firmware/devicetree/base/firmware/coreboot/compatible
      +
      +
    8. +
    9. +

      Note the result.

      +
    10. +
    +

    Expected result

    +

    The output of the command should contain information about memory sectors +dedicated for coreboot. Example output:

    +
    00000000: 636f 7265 626f 6f74 00                   coreboot
    +
    +

    DVT002.001 Memory for coreboot is reserved (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that in the system exists reserved memory for +coreboot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      xxd /sys/firmware/devicetree/base/firmware/coreboot/reg
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. +

      Run the following command in the terminal:

      +
       xxd /sys/firmware/devicetree/base/reserved-memory/ranges
      +
      +
    12. +
    +

    Expected result

    +
      +
    1. Output of the first command should contain information about memory ranges + for corebotot.
    2. +
    3. Output of the second command should contain information about reserved + ranges.
    4. +
    5. All memory range for coreboot (output from command 1) should be reserved + (output from command 2).
    6. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/320-fwupd-firmware-update/index.html b/unified-test-documentation/dasharo-compatibility/320-fwupd-firmware-update/index.html new file mode 100644 index 00000000000..b72c728aa72 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/320-fwupd-firmware-update/index.html @@ -0,0 +1,5936 @@ + + + + + + + + + + + + + + + + + + Firmware update using fwupd - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Firmware update using fwupd

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Install the dmidecode package: sudo apt install dmidecode.
    10. +
    11. Make yourself familiar with + Updating firmware using fwupd
    12. +
    +

    FFW001.001 Firmware update by using fwupd

    +

    Test description

    +

    This test verify whether it is possible to update the firmware on the DUT by +using fwupd demon.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Disable Secure Boot.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Configure environment in accordance with the + documentation
    8. +
    9. +

      Start firmware updating procedure by executing the following command in + the terminal:

      +
          sudo fwupdmgr update
      +
      +
    10. +
    11. +

      Reboot the DUT.

      +
    12. +
    13. Boot into the system.
    14. +
    15. Log into the system by using the proper login and password.
    16. +
    17. +

      Open a terminal window and run the following command to verify results:

      +
      sudo dmidecode -t bios
      +
      +
    18. +
    +

    Expected result

    +

    The output of dmidecode command should contain information about current +firmware. The current firmware version should be equal to the latest released +firmware version.

    +

    Example output:

    +
    BIOS Information
    +        Vendor: 3mdeb
    +        Version: Dasharo (coreboot+UEFI) v1.1.0
    +        Release Date: 03/24/2022
    +        ROM Size: 16 MB
    +        Characteristics:
    +            PCI is supported
    +            PC Card (PCMCIA) is supported
    +            BIOS is upgradeable
    +            BIOS shadowing is allowed
    +            Selectable boot is supported
    +            ACPI is supported
    +            USB legacy is supported
    +            Targeted content distribution is supported
    +            UEFI is supported
    +        BIOS Revision: 1.1
    +        Firmware Revision: 0.0
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/325-custom-boot-order/index.html b/unified-test-documentation/dasharo-compatibility/325-custom-boot-order/index.html new file mode 100644 index 00000000000..ed954cdf4d2 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/325-custom-boot-order/index.html @@ -0,0 +1,5946 @@ + + + + + + + + + + + + + + + + + + Custom Boot Order - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Custom Boot Order

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    CBO001.001 Custom boot order (SeaBIOS)

    +

    Test description

    +

    This test aims to verify that the DUT boot from the suitable source, with the +possibility to boot from other sources.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT
    2. +
    3. Press BOOT_MENU_KEY key to display boot menu.
    4. +
    5. Compare the listed devices with the desired boot order.
    6. +
    +

    Expected result

    +

    When there is a possibility for the platform to boot from different sources:

    +
      +
    1. Priority will be given to the system booted from SSD connected by mSATA.
    2. +
    3. If above-mentioned SSD does not include system, it will be booted from USB.
    4. +
    5. If it either not include system, it will be booted from SSD connected by +SATA 2.5
    6. +
    +

    If there is only one bootable medium the platform shall boot from it.

    +

    Example boot menu:

    +
    Select boot device:
    +
    +1. AHCI/0: SATA SSD ATA-11 Hard-Disk (15272 MiBytes)
    +2. USB MSC Drive  USB Flash Memory PMAP
    +3. USB MSC Drive SanDisk Ultra 1.00
    +4. USB MSC Drive Generic Flash Disk 8.07
    +5. AHCI/1: TOSHIBA MK2561GSYN ATA-8 Hard-Disk (232 GiBytes)
    +6. iPXE
    +7. Payload [memtest]
    +
    +

    CBO001.002 Custom boot order (edk2)

    +

    Test description

    +

    This test aims to verify that the DUT boot from the suitable source, with the +possibility to boot from other sources.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT
    2. +
    3. Press SETUP MENU key to display boot menu.
    4. +
    5. Select Boot Maintenance Manager and press ENTER.
    6. +
    7. In Boot Maintenance Manager menu select Boot Options and press ENTER.
    8. +
    9. In Change Boot Order menu select Change the order option and press + ENTER.
    10. +
    11. Set the desired boot order.
    12. +
    13. Reboot the device.
    14. +
    15. Press BOOT_MENU_KEY key to display boot menu.
    16. +
    17. Compare the listed devices with the desired boot order.
    18. +
    +

    Expected result

    +

    Current boot order option list should correspond to the desired boot order.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/index.html b/unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/index.html new file mode 100644 index 00000000000..9c59c774a76 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/326-dasharo-tools-suite/index.html @@ -0,0 +1,6293 @@ + + + + + + + + + + + + + + + + + + Dasharo Tools Suite - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Dasharo Tools Suite

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Wired network connection.
    4. +
    5. Disable Secure Boot.
    6. +
    7. Prepare the bootable USB stick
    8. +
    9. Make yourself familiar with + Dasharo Tools Suite.
    10. +
    +

    DTS001.001 Booting DTS from USB works correctly

    +

    Test description

    +

    This test aims to verify that DTS is properly booting from USB.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB stick with DTS into the USB slot on the DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    6. +
    7. Select the USB stick with DTS using the arrow keys and press Enter.
    8. +
    +

    Expected result

    +

    After a while, the DTS menu should appear.

    +

    DTS002.001 DTS option Creating Dasharo HCL report works correctly

    +

    Test description

    +

    This test aims to verify that the option Dasharo HCL report in the DTS menu +properly creates the report.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB stick with DTS into the USB slot on the DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    6. +
    7. Select the USB stick with DTS using the arrow keys and press Enter.
    8. +
    9. Wait for Enter an option:.
    10. +
    11. Type in 1 and press Enter.
    12. +
    13. Wait for the question: Do you want to support Dasharo development by + sending us logs with hardware configuration?
    14. +
    15. Type in y and press Enter.
    16. +
    +

    Expected result

    +

    The whole process may take a few minutes.

    +
      +
    1. The report should be generated.
    2. +
    3. The report should be sent to the cloud.
    4. +
    5. In the summary should be displayed information that all calls exited without + errors.
    6. +
    +

    Example summary output:

    +
    SUMMARY
    +=======
    +
    + > All Curl calls exited without errors
    + > Attempt to send completed > <report_name>.tar.gz
    +Thanks you for supporting Dasharo!
    +
    +

    DTS003.001 DTS option power-off DUT works correctly

    +

    Test description

    +

    This test aims to verify that the option Power off system in the DTS menu +turns off the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB stick with DTS into the USB slot on the DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    6. +
    7. Select the USB stick with DTS using the arrow keys and press Enter.
    8. +
    9. Wait for Enter an option:.
    10. +
    11. Type in 10 and press Enter.
    12. +
    +

    Expected result

    +

    The DUT should be turned off without any complications.

    +

    DTS004.001 DTS option reboot DUT works correctly

    +

    Test description

    +

    This test aims to verify that the option Reboot system in the DTS menu reboots +the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB stick with DTS into the USB slot on the DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    6. +
    7. Select the USB stick with DTS using the arrow keys and press Enter.
    8. +
    9. Wait for Enter an option:.
    10. +
    11. Type in 11 and press Enter.
    12. +
    +

    Expected result

    +

    The DUT should be rebooted without any complications.

    +

    DTS005.001 DTS drop-to-shell option works correctly

    +

    Test description

    +

    This test aims to verify that the option Shell in the DTS menu opens Shell.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB stick with DTS into the USB slot on the DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    6. +
    7. Select the USB stick with DTS using the arrow keys and press Enter.
    8. +
    9. Wait for Enter an option:.
    10. +
    11. Type in 9 and press Enter.
    12. +
    +

    Expected result

    +
      +
    1. Information about entering the shell and how to exit should be displayed.
    2. +
    3. Shell command input should be activated.
    4. +
    +

    Example output:

    +
    Entering shell, to leave type exit and press Enter or press LCtrl+D
    +
    +bash-5.1#
    +
    +

    DTS006.001 Flash device from DTS shell by using flashrom works correctly

    +

    Test description

    +

    This test aims to verify whether is the possibility to flash the DUT firmware by +using flashrom in DTS Shell.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. {PATH} = individual path to a specific binary.
    4. +
    +

    Test steps

    +
      +
    1. Plug the USB stick with DTS into the USB slot on the DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    6. +
    7. Select the USB stick with DTS using the arrow keys and press Enter.
    8. +
    9. Wait for Enter an option:.
    10. +
    11. Type 9 and click Enter to launch Shell.
    12. +
    13. +

      Run the following command to obtain coreboot.rom binary:

      +
      wget https://3mdeb.com/open-source-firmware/{PATH} -O /tmp/coreboot.rom
      +
      +
      +

      The above-described command is not the only way to obtain binary. For +example, scp command might be used, too.

      +
      +
    14. +
    15. +

      Run the following command to flash the firmware:

      +
      flashrom -p internal -w /tmp/coreboot.rom
      +
      +
      +

      Additional parameters may be needed for the flashrom command depending +on the DUT. Documentation describing the exact command to flash the +specific platform is always available in localization: +Supported hardware -> Platform name -> Initial Deployment.

      +
      +
    16. +
    17. +

      Power off the DUT.

      +
    18. +
    19. Repeat steps 2-6.
    20. +
    21. +

      Run the following command to check the firmware version:

      +
      dmidecode -t 0
      +
      +
    22. +
    23. +

      Note the results.

      +
    24. +
    +

    Expected result

    +

    The output of dmidecode command should contain information about the current +firmware. The current firmware version should be equal to the binary version, +which you were flashing.

    +

    Example output:

    +
    Version: Dasharo (coreboot+UEFI) v1.1.0
    +
    +

    DTS007.001 Update device firmware from DTS Shell by using fwupd works correctly

    +

    Test description

    +

    This test aims to verify whether there is the possibility to update the DUT +firmware by using fwupd in DTS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB stick with DTS into the USB slot on the DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    6. +
    7. Select the USB stick with DTS using the arrow keys and press Enter.
    8. +
    9. Wait for Enter an option:.
    10. +
    11. Type in 9 and press Enter.
    12. +
    13. +

      Run the following commands to update the firmware to the latest version:

      +
      fwupdmgr refresh
      +fwupdmgr update
      +
      +
    14. +
    15. +

      Power off the DUT.

      +
    16. +
    17. Repeat steps 2-6.
    18. +
    19. +

      Run the following command to check the firmware version:

      +
      dmidecode -t 0
      +
      +
    20. +
    21. +

      Note the results.

      +
    22. +
    +

    Expected result

    +

    The output of dmidecode command should contain information about the current +firmware. The current firmware version should be equal to the binary version, +which you were flashing.

    +

    Example output:

    +
    Version: Dasharo (coreboot+UEFI) v1.1.0
    +
    +

    DTS008.001 Flash device EC firmware by using DTS built-in script works correctly

    +

    Test description

    +

    This test aims to verify whether there is the possibility to flash the DUT EC +firmware by using the built-in script in DTS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB stick with DTS into the USB slot on the DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    6. +
    7. Select the USB stick with DTS using the arrow keys and press Enter.
    8. +
    9. Wait for Enter an option:.
    10. +
    11. Proceed with + Dasharo EC Transition.
    12. +
    +

    Expected result

    +
      +
    1. After the flashing procedure itself, the DUT should be able to boot.
    2. +
    3. The EC firmware version, after checking the method described in the + above-mentioned documentation, + should correspond to the latest version.
    4. +
    +

    DTS009.001 Update device EC firmware by using DTS works correctly

    +

    Test description

    +

    This test aims to verify whether there is the possibility to update the DUT EC +firmware by using system76_ectool in DTS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Plug the USB stick with DTS into the USB slot on the DUT.
    2. +
    3. Power on the DUT.
    4. +
    5. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    6. +
    7. Select the USB stick with DTS using the arrow keys and press Enter.
    8. +
    9. Wait for Enter an option:.
    10. +
    11. Type in 9 and press Enter.
    12. +
    13. Proceed with + Dasharo EC Update.
    14. +
    +

    Expected result

    +
      +
    1. After the updating firmware procedure itself, the DUT should be able to boot.
    2. +
    3. The EC firmware version, after checking the method described in the + above-mentioned documentation, + should correspond to the binary version used.
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/326b-firmware-building-locally/index.html b/unified-test-documentation/dasharo-compatibility/326b-firmware-building-locally/index.html new file mode 100644 index 00000000000..f5db3dc7282 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/326b-firmware-building-locally/index.html @@ -0,0 +1,5963 @@ + + + + + + + + + + + + + + + + + + Firmware locally building and flashing - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Firmware locally building and flashing

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Make yourself familiar with Building manual procedure dedicated for + the relevant platform: +
    8. +
    +

    FLB001.001 Firmware locally build

    +

    Test description

    +

    This test aims to verify whether there is a possibility to build firmware +on the local machine, based on Build manual procedure dedicated to the +platform.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Based on the dedicated documentation build firmware.
    8. +
    9. Check if the binary file, after finishing the building process, is available + in the build location.
    10. +
    +

    Expected result

    +

    The build location should contain the binary file, which size is equal to the +flash chip size.

    +

    FLB002.001 Flash locally built firmware

    +

    Test description

    +

    This test aims to verify whether there is a possibility to flash the locally +built firmware to the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Localize the firmware, which was built in the FLB001.001 test case.
    8. +
    9. +

      Flash the firmware by using the internal programmer and flashrom tool. If + DUT is already flashed with the Dasharo firmware, the following command + should be used:

      +
      flashrom -p internal -w [path-to-binary] --fmap -i RW_SECTION_A
      +
      +

      Otherwise, the following command should be used:

      +
      flashrom -p internal -w [path-to-binary] --ifd -i bios
      +
      +
    10. +
    11. +

      Reboot the DUT.

      +
    12. +
    13. Boot into the system.
    14. +
    15. Log into the system by using the proper login and password.
    16. +
    17. +

      Open a terminal window and run the following command to verify the results:

      +
      sudo dmidecode -t bios | grep Version
      +
      +
    18. +
    +

    Expected result

    +

    The output of dmidecode command should contain information about the current +firmware. The current firmware version should be equal to the latest released +firmware version.

    +

    Example output:

    +
    Version: Dasharo (coreboot+UEFI) v1.1.0
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/327-embedded_controller_flashing/index.html b/unified-test-documentation/dasharo-compatibility/327-embedded_controller_flashing/index.html new file mode 100644 index 00000000000..46dd49a8f31 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/327-embedded_controller_flashing/index.html @@ -0,0 +1,5875 @@ + + + + + + + + + + + + + + + + + + Embedded controller flashing - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Embedded controller flashing

    +

    ECF001.001 EC firmware external flashing

    +

    Test description

    +

    This test aims to verify whether there is the possibility to flash the DUT +EC firmware externally using Arduino.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Make yourself familiar with + EC recovery documentation.
    4. +
    +

    Test steps

    +
      +
    1. Prepare the hardware for flashing in accordance with the + Prerequisites section.
    2. +
    3. Prepare the firmware in accordance with the + Preparation section.
    4. +
    5. Flash the EC firmware in accordance with the + Flashing section.
    6. +
    7. Note the results.
    8. +
    +

    Expected result

    +

    The output of the last command should contain information about the correctly +performed procedure:

    +
    Successfully programmed SPI ROM
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/328-logo-customization-functionality/index.html b/unified-test-documentation/dasharo-compatibility/328-logo-customization-functionality/index.html new file mode 100644 index 00000000000..be5bf0fda6c --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/328-logo-customization-functionality/index.html @@ -0,0 +1,6024 @@ + + + + + + + + + + + + + + + + + + Logo customization - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Logo customization functionality

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Get familiar with + Logo customization procedure
    4. +
    +

    LCM001.001 Replace logo in existing image and flashing firmware

    +

    Test description

    +

    The test aims to verify whether replacing the logo in the existing image is +possible and, whether after flashing the DUT with the new image, the new logo +will be shown properly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Current Dasharo firmware dedicated for the platform.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. Select the iPXE Network boot option using the arrow keys and press Enter.
    6. +
    7. Select the iPXE Shell option using the arrow keys and press Enter.
    8. +
    9. +

      Configure communication interface by using the following command:

      +
      dhcp
      +
      +
    10. +
    11. +

      Connect to the DTS ipxe menu by using the following command:

      +
      chain http://boot.3mdeb.com/dts.ipxe
      +
      +
    12. +
    13. +

      Wait for Enter an option:.

      +
    14. +
    15. Type in 9 and press Enter.
    16. +
    17. Based on the + dedicated documentation + replace the logo in an existing image.
    18. +
    19. Reboot the DUT and observe the boot logo.
    20. +
    +

    Expected result

    +

    During the DUT booting process, custom logo should appear on the screen.

    +

    LCM002.001 Build image with custom logo and flashing firmware

    +

    Test description

    +

    This test aims to verify whether building an image with the custom logo is +possible and, whether after flashing the DUT with the new image, the new logo +will be shown properly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Based on the + dedicated documentation + build firmware with the custom logo.
    8. +
    9. +

      Flash the firmware by using the internal programmer and flashrom tool. If + DUT is already flashed with the Dasharo firmware and only the logo should + be replaced, the following command should be used:

      +
      sudo flashrom -p internal --fmap -i BOOTSPLASH -w [path]
      +
      +

      If also the procedure of Dasharo firmware updating should be performed, +the following command should be used:

      +
      flashrom -p internal -w [path-to-binary] --fmap -i RW_SECTION_A
      +
      +

      In any other cases, the following command should be used:

      +
      flashrom -p internal -w [path-to-binary] --ifd -i bios
      +
      +
    10. +
    11. +

      Reboot DUT.

      +
    12. +
    +

    Expected result

    +

    During the DUT booting process, custom logo should appear on the screen.

    +

    LCM003.001 Attempt to flash firmware with improper image

    +

    Test description

    +

    This test aims to verify whether the attempt to flash the DUT with firmware +with an improper logo is possible but will result in a fallback to the default +logo.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Based on the + dedicated documentation + build firmware with the logo, that that does not meet the + Quality criteria.
    8. +
    9. +

      Flash the firmware by using the internal programmer and flashrom tool. If + DUT is already flashed with the Dasharo firmware and only the logo should + be replaced, the following command should be used:

      +
      sudo flashrom -p internal --fmap -i BOOTSPLASH -w [path]
      +
      +

      If also the procedure of Dasharo firmware updating should be performed, +the following command should be used:

      +
      flashrom -p internal -w [path-to-binary] --fmap -i RW_SECTION_A
      +
      +

      In any other cases, the following command should be used:

      +
      flashrom -p internal -w [path-to-binary] --ifd -i bios
      +
      +
    10. +
    11. +

      Reboot DUT.

      +
    12. +
    +

    Expected result

    +

    During the DUT booting process, the default logo should appear on the screen.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/341-pfSense-support/index.html b/unified-test-documentation/dasharo-compatibility/341-pfSense-support/index.html new file mode 100644 index 00000000000..bbe0f510e39 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/341-pfSense-support/index.html @@ -0,0 +1,5997 @@ + + + + + + + + + + + + + + + + + + pfSense support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: pfSense support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    PFS001.001 pfSense stable (serial output) installation on Hard Disk

    +

    Test description

    +

    This test aims to verify that PfSense stable (serial output) could be installed +on the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = pfSense stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    PFS001.002 Boot pfSense stable (serial output) from Hard Disk

    +

    Test description

    +

    This test aims to verify that pfSense stable (serial output) could be booted +from the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = pfSense stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the device on which the system was previously + installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    PFS002.001 pfSense stable (VGA output) installation on Hard Disk

    +

    Test description

    +

    This test aims to verify that pfSense stable (VGA output) could be installed on +the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = pfSense stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    PFS002.002 Boot pfSense stable (VGA output) from Hard Disk

    +

    Test description

    +

    This test aims to verify that pfSense stable (VGA output) could be booted from +the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = pfSense stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the device on which the system was previously + installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/342-OPNsense-support/index.html b/unified-test-documentation/dasharo-compatibility/342-OPNsense-support/index.html new file mode 100644 index 00000000000..362ac96d97b --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/342-OPNsense-support/index.html @@ -0,0 +1,5997 @@ + + + + + + + + + + + + + + + + + + OPNsense support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: OPNsense support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    OPN001.001 OPNsense stable (serial output) installation on Hard Disk

    +

    Test description

    +

    This test aims to verify that OPNsense stable (serial output) could be installed +on the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = OPNsense stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    OPN001.002 Boot OPNsense stable (serial output) from Hard Disk

    +

    Test description

    +

    This test aims to verify that OPNsense stable serial could be booted from the +hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = OPNsense stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the device on which the system was previously + installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    OPN002.001 OPNsense stable (VGA output) installation on Hard Disk

    +

    Test description

    +

    This test aims to verify that OPNsense stable (VGA output) could be installed on +the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = OPNsense stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    OPN002.002 Boot OPNsense stable (VGA output) from Hard Disk

    +

    Test description

    +

    This test aims to verify that OPNsense stable (VGA output) could be booted from +the hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = OPNsense stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the device on which the system was previously + installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/343-super-I-O-initialization-on-QubesOS/index.html b/unified-test-documentation/dasharo-compatibility/343-super-I-O-initialization-on-QubesOS/index.html new file mode 100644 index 00000000000..62f4052284c --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/343-super-I-O-initialization-on-QubesOS/index.html @@ -0,0 +1,5918 @@ + + + + + + + + + + + + + + + + + + Super I/O initialization - QubesOS - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: Super I/O initialization - QubesOS

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    PPS001.001 PS/2 keyboard detection

    +

    Test description

    +

    This test aims to verify that the external PS/2 keyboard is detected correctly +by the OPERATING_SYSTEM and that all basic keys work according to their +labels.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = QubesOS stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install libinput-tools in dom0 on the DUT.
    4. +
    5. Connect the external PS/2 keyboard to the PS/2 port.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window in dom0 and run the following command:

      +
      sudo dmesg | grep -i PS/2
      +
      +
    8. +
    9. +

      Run the following command in the terminal:

      +
      libinput debug-events --show-keycodes
      +
      +
    10. +
    11. +

      Test the alphanumeric keys and note the generated keycodes.

      +
    12. +
    13. Test non-alphanumeric keys and verify that they generate the correct + keycodes.
    14. +
    15. Test key combinations with the Shift, Ctrl and Alt modifier keys + (this tests 2-key rollover).
    16. +
    +

    Expected result

    +
      +
    1. The external PS/2 keyboard is detected in OS.
    2. +
    3. All standard keyboard keys generate the correct keycodes and events as per + their labels.
    4. +
    5. Key combinations are detected correctly.
    6. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/344-power-operations/index.html b/unified-test-documentation/dasharo-compatibility/344-power-operations/index.html new file mode 100644 index 00000000000..a0d8cce72b9 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/344-power-operations/index.html @@ -0,0 +1,5898 @@ + + + + + + + + + + + + + + + + + + Device power control operations - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: Device power control operations

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    DPC001.001 Reset button (QubesOS)

    +

    Test description

    +

    This test aims to verify that the reset button works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = QubesOS stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Observe the power LED and use the reset button.
    8. +
    9. Note the results.
    10. +
    +

    Expected result

    +
      +
    1. The DUT should perform a reset, the power LED should be on all the time.
    2. +
    3. The DUT shouldn't perform a power cycle, the power LED shouldn't be off even + for a moment.
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/345-display-resolution/index.html b/unified-test-documentation/dasharo-compatibility/345-display-resolution/index.html new file mode 100644 index 00000000000..219f5d03df3 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/345-display-resolution/index.html @@ -0,0 +1,5906 @@ + + + + + + + + + + + + + + + + + + Display Resolution - QubesOS - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: Display resolution - QubesOS

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    DSR001.001 Changing the display resolution

    +

    Test description

    +

    This test aims to verify that the display resolution could be changed in the +OPERATING_SYSTEM and that the GUI is displayed correctly after this change.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = QubesOS stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect any display.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window in dom0 and run the following command:

      +
      xrandr -s <display_resolution>
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    +

    Expected result

    +
      +
    1. Changing the display resolution is possible.
    2. +
    3. After changing the resolution, all icons and subtitles should be displayed + correctly.
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/346-SATA-hotplug-detection/index.html b/unified-test-documentation/dasharo-compatibility/346-SATA-hotplug-detection/index.html new file mode 100644 index 00000000000..b59bdd5566a --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/346-SATA-hotplug-detection/index.html @@ -0,0 +1,6023 @@ + + + + + + + + + + + + + + + + + + SATA hot plug - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: SATA hot plug

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    SHT001.001 SATA hot plug (firmware)

    +

    Test description

    +

    This test aims to verify that the disk connected to the SATA port could be +detected after hot-plug.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Any operating system should be installed on the SATA disk.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Hold the BOOT_MENU_KEY to enter the UEFI Boot Menu.
    4. +
    5. Select the UEFI Shell option using the arrow keys and press Enter.
    6. +
    7. +

      Execute the following command in the shell:

      +
      map -t hd
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. Connect the disk to the SATA port.
    12. +
    13. +

      Execute the following command in the shell:

      +
      map -t hd -r
      +
      +
    14. +
    +

    Expected result

    +
      +
    1. The output of the first command should contain mapping table for all hard + disks connected to the device.
    2. +
    3. The output of the second command should contain refreshed mapping table for + all hard disks connected to the device.
    4. +
    5. The refreshed list should contain additional item - mounted SATA disk.
    6. +
    +

    SHT001.002 SATA hot plug (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the disk connected to the SATA port could be +detected after hot-plug.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Connect the disk to the SATA port.
    8. +
    9. +

      Check that the connected disk is detected by running the following command:

      +
      sudo parted -l
      +
      +
    10. +
    11. +

      Note the results.

      +
    12. +
    +

    Expected result

    +

    The SATA disk should be detected in OS, example output:

    +
    (...)
    +Model: ATA SSDPR-CL100-240- (scsi)
    +Disk /dev/sda: 240GB
    +Sector size (logical/physical): 512B/512B
    +Partition Table: gpt
    +Disk Flags:
    +
    +Number  Start   End     Size    File system  Name                  Flags
    + 1      1049kB  538MB   537MB   fat32        EFI System Partition  boot, esp
    + 2      538MB   240GB   240GB   ext4
    +(...)
    +
    +

    SHT001.003 SATA hot plug (Windows 11)

    +

    Test description

    +

    This test aims to verify that the disk connected to the SATA port could be +detected after hot-plug.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Connect the disk to the SATA port.
    8. +
    9. +

      Check that the connected disk is detected by running the following command:

      +
      Get-WMIObject -Class Win32_DiskDrive
      +
      +
    10. +
    11. +

      Note the results.

      +
    12. +
    +

    Expected result

    +

    The SATA disk should be detected in OS, example output:

    +
    (...)
    +Partitions : 4
    +DeviceID   : \\.\PHYSICALDRIVE0
    +Model      : SSDPR-CL100-240-G2
    +Size       : 240054796800
    +Caption    : SSDPR-CL100-240-G2
    +(...)
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/347-sign-of-life/index.html b/unified-test-documentation/dasharo-compatibility/347-sign-of-life/index.html new file mode 100644 index 00000000000..0d2abeb9ac9 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/347-sign-of-life/index.html @@ -0,0 +1,5938 @@ + + + + + + + + + + + + + + + + + + Sign of life - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo compatibility: Sign of life

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    SOL001.001 SOL string shows Dasharo firmware and EC version

    +

    Test description

    +

    This test aims to verify that the information about the version of Dasharo +firmware and Dasharo EC firmware is recognized correctly and displayed during +the boot phase.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. EC firmware = Dasharo
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Sign of life string.
    4. +
    5. Note the results.
    6. +
    +

    Expected result

    +

    During the boot phase, the information about the version of Dasharo firmware and +Dasharo EC firmware should be displayed.

    +

    Example output:

    +
    Firmware version: Dasahro (coreboot+UEFI) v1.5.0
    +EC firmware version: 2023-03-20_c398446
    +
    +

    SOL002.001 SOL string shows information about proprietary EC

    +

    Test description

    +

    This test aims to verify that the information about the version of Dasharo +firmware and proprietary EC firmware is recognized correctly and displayed +during the boot phase.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. EC firmware = Proprietary
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for the Sign of life string.
    4. +
    5. Note the results.
    6. +
    +

    Expected result

    +

    During the boot phase, the information about the version of Dasharo firmware and +proprietary EC firmware should be displayed. In addition, the prompt asking for +updated EC firmware should be displayed also.

    +

    Example output:

    +
    Firmware version: Dasahro (coreboot+UEFI) v1.5.0
    +EC firmware version: 1.07.02
    +Proprietary EC firmware detected!
    +Please update your EC firmware per docs.dasharo.com instructions!
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/348-proxmox-support/index.html b/unified-test-documentation/dasharo-compatibility/348-proxmox-support/index.html new file mode 100644 index 00000000000..2c98af956cb --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/348-proxmox-support/index.html @@ -0,0 +1,5924 @@ + + + + + + + + + + + + + + + + + + Proxmox support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Proxmox support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    PVE001.001 Proxmox Virtual Environment stable installation on Hard Disk

    +

    Test description

    +

    This test aims to verify that Proxmox VE stable could be installed on the hard +disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Proxmox VE stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    PVE001.002 Boot Proxmox Virtual Environment stable from Hard Disk

    +

    Test description

    +

    This test aims to verify that Proxmox VE stable could be booted from the hard +disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Proxmox VE stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the device on which the system was previously + installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/349-ubuntu-server-support/index.html b/unified-test-documentation/dasharo-compatibility/349-ubuntu-server-support/index.html new file mode 100644 index 00000000000..d3b70e637a6 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/349-ubuntu-server-support/index.html @@ -0,0 +1,5924 @@ + + + + + + + + + + + + + + + + + + Ubuntu Server support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Ubuntu Server support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    USS001.001 Ubuntu Server stable installation on Hard Disk

    +

    Test description

    +

    This test aims to verify that Ubuntu Server stable could be installed on the +hard disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu Server stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. According to the Documentation + perform the OS installation process.
    2. +
    +

    Expected result

    +

    The information about successful installation should be displayed.

    +

    USS001.002 Boot Ubuntu Server stable from Hard Disk

    +

    Test description

    +

    This test aims to verify that Ubuntu Server stable could be booted from the hard +disk on the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu Server stable
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the device on which the system was previously + installed.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/357-bios-menu-function-keys/index.html b/unified-test-documentation/dasharo-compatibility/357-bios-menu-function-keys/index.html new file mode 100644 index 00000000000..955b85de3d7 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/357-bios-menu-function-keys/index.html @@ -0,0 +1,5904 @@ + + + + + + + + + + + + + + + + + + BIOS menu function keys - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: BIOS menu function keys

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    BMF001.001 Reset to Defaults option

    +

    Test description

    +

    This test aims to verify that the F9 key feature properly reset to Defaults +all Dasharo System Features settings.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While booting, press the SETUP_MENU_KEY to enter Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu option.
    6. +
    7. Enter the any of submenus eg. Power Management Options.
    8. +
    9. Verify that the F9=Reset to Defaults entry is displayed at the bottom of + the screen.
    10. +
    11. Press F9 to reset options to defaults.
    12. +
    13. Press Y to confirm saving the changes.
    14. +
    15. Go back to the main menu using the ESC key. If necessary - press Y to + confirm saving the changes again.
    16. +
    17. Select the Reset option to apply the settings and reboot.
    18. +
    19. While booting, press the SETUP_MENU_KEY to enter Setup Menu.
    20. +
    21. Enter the Dasharo System Features menu option.
    22. +
    23. Check the state of each option in each submenu.
    24. +
    25. Note the results.
    26. +
    +

    Expected result

    +
      +
    1. The F9=Reset to Defaults entry is displayed in each submenu of Dasharo + System Features.
    2. +
    3. After using the F9 key, all Dasharo System Features options should be set + to default. All options covered by this functionality can be found + here.
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/358-suspend-mechanism-switching-S0ix-S3/index.html b/unified-test-documentation/dasharo-compatibility/358-suspend-mechanism-switching-S0ix-S3/index.html new file mode 100644 index 00000000000..33f63abb90c --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/358-suspend-mechanism-switching-S0ix-S3/index.html @@ -0,0 +1,5967 @@ + + + + + + + + + + + + + + + + + + Suspend Mechanism Switching S0ix/S3 - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Suspend mechanism switching (S0ix/S3)

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    +

    SMS001.001 Suspend to Idle (S0ix) check (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the Suspend to Idle (S0ix) option selected in +the BIOS firmware is correctly recognised in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Enter the BIOS setup using BIOS_SETUP_KEY.
    4. +
    5. Inside the BIOS setup, navigate to Dasharo System Features -> + Power Management Options -> Platform Sleep Type and choose the option + Suspend to Idle (S0ix).
    6. +
    7. Press F10 and confirm with y key to save selected settings.
    8. +
    9. Select reset option to reboot the system.
    10. +
    11. After the system reboots, log into the system by using the proper login and + password.
    12. +
    13. +

      Open a terminal window and execute the following command to confirm that + Suspend to Idle (S0ix) mode is enabled and properly recognised in the OS:

      +
      sudo cat /sys/power/mem_sleep
      +
      +
    14. +
    15. +

      Note the results.

      +
    16. +
    +

    Expected result

    +

    The output from the command above should contain the phrase s2idle enclosed +in square brackets, indicating that the Suspend to Idle (S0ix) mode is +enabled.

    +

    Example output:

    +
    [s2idle] shallow
    +
    +

    SMS001.002 Suspend to RAM (S3) check (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the Suspend to RAM (S3) option selected in +the BIOS firmware is correctly recognised in the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Enter the BIOS setup using BIOS_SETUP_KEY.
    4. +
    5. Inside the BIOS setup, navigate to Dasharo System Features -> + Power Management Options -> Platform Sleep Type and choose the option + Suspend to RAM (S3).
    6. +
    7. Press F10 and confirm with y key to save selected settings.
    8. +
    9. Select reset option to reboot the system.
    10. +
    11. After the system reboots, log into the system by using the proper login and + password.
    12. +
    13. +

      Open a terminal window and execute the following command to confirm that + Suspend to RAM (S3) mode is enabled and properly recognised in the OS:

      +
      sudo cat /sys/power/mem_sleep
      +
      +
    14. +
    15. +

      Note the results.

      +
    16. +
    +

    Expected result

    +

    The output from the command above should contain the phrase deep enclosed +in square brackets, indicating that the Suspend to RAM (S3) mode is +enabled.

    +

    Example output:

    +
    s2idle [deep]
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/S30-fan-speed/index.html b/unified-test-documentation/dasharo-compatibility/S30-fan-speed/index.html new file mode 100644 index 00000000000..a122ce99f84 --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/S30-fan-speed/index.html @@ -0,0 +1,5969 @@ + + + + + + + + + + + + + + + + + + Fan speed - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Fan speed measure

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    FAN001.001 CPU fan speed measure

    +

    Test description

    +

    This test aims to verify that the CPU fan works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install lm-sensors on the DUT.
    4. +
    5. If the command in the 4th step fails, make sure the system76_acpi driver is + available on your system. An appropriate kernel version could be installed + with the command sudo apt install linux-oem-22.04a, which version + definitely supports this driver.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      In the terminal window run the following command to get the RPM value of the + CPU fan:

      +
      sensors | grep "CPU fan"
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    +

    Expected result

    +

    The CPU fan RPM value is displayed and isn't zero.

    +

    Example output:

    +
    CPU fan:     4347 RPM
    +
    +

    FAN002.001 GPU fan speed measure

    +

    Test description

    +

    The fan has been configured to follow a custom curve. This test aims to verify +that the fan curve is configured correctly and the fan spins up and down +according to the defined values.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install nvidia-smi and mesa-utils on the DUT.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open the terminal window and execute the following command:

      +
      watch -n1 nvidia-smi
      +
      +
    8. +
    9. +

      Verify using that the temperature is below 40°C.

      +
    10. +
    11. If the temperature is above 40, enable the fan turbo mode (Fn + 1) until it + cools down.
    12. +
    13. Flip the laptop over and check if the GPU fan (located under the Escape + key) is spinning.
    14. +
    15. +

      In another terminal window, run the following command:

      +
      _NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia __GL_SYNC_TO_VBLANK=0 glxgears
      +
      +
    16. +
    17. +

      Verify that the temperature increases above 40.

      +
    18. +
    19. Flip the laptop over and check if the GPU fan is spinning.
    20. +
    +

    Expected result

    +
      +
    1. The fan should not be spinning while the temperature is below 40 degrees.
    2. +
    3. The fan should be spinning while the temperature is above 40 degrees.
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-compatibility/S31-coreboot-fan-control/index.html b/unified-test-documentation/dasharo-compatibility/S31-coreboot-fan-control/index.html new file mode 100644 index 00000000000..10bfecd0a1c --- /dev/null +++ b/unified-test-documentation/dasharo-compatibility/S31-coreboot-fan-control/index.html @@ -0,0 +1,5939 @@ + + + + + + + + + + + + + + + + + + coreboot Fan control - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: coreboot Fan Control

    +

    FAN001.001 Check CPU entry temperature and CPU fan speed

    +

    Test description

    +

    This test aims to verify that data for CPU temperature and CPU fan speed is +available.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Select the proper number for USB_STICK option.
    8. +
    9. Wait for debian login:.
    10. +
    11. Type proper login.
    12. +
    13. Wait for Password:.
    14. +
    15. Type the proper password.
    16. +
    17. Wait for root@debian:~#.
    18. +
    19. Execute watch -n 1 "sensors w83795g-i2c-1-2f |grep fan1 -A 16".
    20. +
    +

    Expected result

    +

    There are visible data for fan1 and temp7 which represents CPU fan speed and +CPU temperature.

    +

    FAN001.002 Check if increasing CPU temperature increases CPU fan speed

    +

    Test description

    +

    This test aims to verify that CPU fan speed responds properly to increasing CPU +temperature.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait for boot until BOOT_MENU_STRING appears.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. Select the proper number for USB_STICK option.
    8. +
    9. Wait for debian login:.
    10. +
    11. Type proper login.
    12. +
    13. Wait for Password:.
    14. +
    15. Type the proper password.
    16. +
    17. Wait for root@debian:~#.
    18. +
    19. Install stress-ng package by executing: sudo apt install stress-ng.
    20. +
    21. Confirm installation by typing Y and pressing Enter when asked.
    22. +
    23. Execute command: watch -n 1 "sensors w83795g-i2c-1-2f |grep fan1 -A 16" + and check current CPU temperature and CPU fan speed.
    24. +
    25. Execute command: + stress-ng --cpu 16 --io 8 --vm 4 --vm-bytes 4G --timeout 30s --metrics.
    26. +
    27. Wait 2 minutes.
    28. +
    29. Execute command: watch -n 1 "sensors w83795g-i2c-1-2f |grep fan1 -A 16" + and check current CPU temperature and CPU fan speed.
    30. +
    +

    Expected result

    +
      +
    1. The CPU temperature after the second check is higher at least 20 degrees.
    2. +
    3. The CPU fan speed after the second check is higher at least 1000 RPM.
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/400-coreboot-boot-measure/index.html b/unified-test-documentation/dasharo-performance/400-coreboot-boot-measure/index.html new file mode 100644 index 00000000000..91abaecb3fa --- /dev/null +++ b/unified-test-documentation/dasharo-performance/400-coreboot-boot-measure/index.html @@ -0,0 +1,5971 @@ + + + + + + + + + + + + + + + + + + Coreboot boot measure - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: coreboot boot measure

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Download cbmem from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd + to the DUT.
    8. +
    +

    CBMEM001.001 coreboot booting time measure after coldboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the DUT boots after coldboot and how long this +process takes. This test case may be re-done several times to to average the +results and specify the platform stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Open a terminal window and execute the following command:
    2. +
    +
    sudo ./cbmem -T
    +
    +

    Expected result

    +

    The output of the command should contain the information about duration of +all boot stages.

    +

    CBMEM002.001 coreboot booting time measure after warmboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the DUT boots after warmboot and how long this +process takes. This test case may be re-done several times to to average the +results and specify the platform stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Open a terminal window and execute the following command:
    2. +
    +
    sudo ./cbmem -T
    +
    +

    Expected result

    +

    The output of the command should contain the information about duration of +all boot stages.

    +

    CBMEM003.001 coreboot booting time measure after system reboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the DUT boots after system reboot and how long +this process takes. This test case may be re-done several times to to average +the results and specify the platform stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Open a terminal window and execute the following command:
    2. +
    +
    sudo ./cbmem -T
    +
    +

    Expected result

    +

    The output of the command should contain the information about duration of +all boot stages.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/401-cpu-temperature/index.html b/unified-test-documentation/dasharo-performance/401-cpu-temperature/index.html new file mode 100644 index 00000000000..5efa337458d --- /dev/null +++ b/unified-test-documentation/dasharo-performance/401-cpu-temperature/index.html @@ -0,0 +1,5974 @@ + + + + + + + + + + + + + + + + + + CPU temperature measure - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    + +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: CPU temperature measure

    +

    Common

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Install lm-sensors package: sudo apt install lm-sensors.
    8. +
    +

    CPT001.001 CPU temperature without load (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the temperature of CPU cores after system +booting is not higher than the maximum allowed temperature.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = coreboot
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sensors
      +
      +
    8. +
    9. +

      Note the result.

      +
    10. +
    +

    Expected result

    +

    Example output:

    +
        coretemp-isa-0000
    +    Adapter: ISA adapter
    +    Package id 0:  +34.0°C  (high = +100.0°C, crit = +100.0°C)
    +    Core 0:        +34.0°C  (high = +100.0°C, crit = +100.0°C)
    +    Core 1:        +34.0°C  (high = +100.0°C, crit = +100.0°C)
    +    Core 2:        +32.0°C  (high = +100.0°C, crit = +100.0°C)
    +    Core 3:        +33.0°C  (high = +100.0°C, crit = +100.0°C)
    +
    +

    Displayed temperature should be not higher than declared by the DUT +specifications.

    +

    CPT002.001 CPU temperature during stress test (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the temperature of the CPU cores is not higher +than the maximum allowed temperature during stress test.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = coreboot
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the stress-ng package: sudo apt install stress-ng.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command to turn on the stressor:

      +
      stress-ng --cpu 0 --tz -t 60m
      +
      +

      Stress test duration time might be changed by change the value of the +parameter -t.

      +
    8. +
    9. +

      While test runs, open a terminal window and run the following command every + one minute until the test finishes, to check the current temperature.

      +
      sensors
      +
      +
    10. +
    11. +

      Note the results.

      +
    12. +
    +

    Expected result

    +

    Example output:

    +
        coretemp-isa-0000
    +    Adapter: ISA adapter
    +    Package id 0:  +54.0°C  (high = +100.0°C, crit = +100.0°C)
    +    Core 0:        +50.0°C  (high = +100.0°C, crit = +100.0°C)
    +    Core 1:        +49.0°C  (high = +100.0°C, crit = +100.0°C)
    +    Core 2:        +53.0°C  (high = +100.0°C, crit = +100.0°C)
    +    Core 3:        +51.0°C  (high = +100.0°C, crit = +100.0°C)
    +
    +

    The displayed temperatures should be not higher than displayed high and +critical. Also the temperatures should be not higher than +those declared by the DUT's producer.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/402-cpu-frequency/index.html b/unified-test-documentation/dasharo-performance/402-cpu-frequency/index.html new file mode 100644 index 00000000000..35a5cb54aca --- /dev/null +++ b/unified-test-documentation/dasharo-performance/402-cpu-frequency/index.html @@ -0,0 +1,6647 @@ + + + + + + + + + + + + + + + + + + CPU frequency measure - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: CPU frequency measure

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    +

    CPF001.001 CPU not stuck on initial frequency (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU does not stuck on the +initial frequency after booting into the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      cat /proc/cpuinfo | grep -i mhz
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    +

    Expected result

    +

    The output of the command should contain information about the current +frequency of each CPU core. If the current frequency for each core is the +same as initial frequency, the test should be considered as failed.

    +

    Example output with unwanted results:

    +
    cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +
    +

    CPF001.002 CPU not stuck on initial frequency (Windows 11)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU does not stuck on the +initial frequency after booting into the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a powershell as administrator and run the following command:
    8. +
    +
    while(1){(Get-CimInstance CIM_Processor).MaxClockSpeed*((Get-Counter -Counter "\Processor Information(_Total)\% Processor Performance").CounterSamples.CookedValue)/100}
    +
    +
      +
    1. Note the results.
    2. +
    +

    Expected result

    +

    The output of the command should contain information about the current +frequency of CPU. If the following frequency values are the same, the test +should be considered as failed.

    +

    Example output with unwanted results:

    +
    2800.00000000000
    +2800.00000000000
    +2800.00000000000
    +2800.00000000000
    +2800.00000000000
    +2800.00000000000
    +2800.00000000000
    +2800.00000000000
    +
    +

    CPF001.003 CPU not stuck on initial frequency (Heads+Debian)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU does not stuck on the +initial frequency after booting into the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 12
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      cat /proc/cpuinfo | grep -i mhz
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    +

    Expected result

    +

    The output of the command should contain information about the current +frequency of each CPU core. If the current frequency for each core is the +same as initial frequency, the test should be considered as failed.

    +

    Example output with unwanted results:

    +
    cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +cpu MHz     : 2800.000
    +
    +

    CPF002.001 CPU runs on expected frequency (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU is running on +expected frequency.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lscpu | grep -i mhz
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. +

      Run the following command in the terminal:

      +
      cat /proc/cpuinfo | grep -i mhz
      +
      +
    12. +
    13. +

      Repeat command every one minute, for 60 minutes.

      +
    14. +
    15. Compare the results.
    16. +
    +

    Expected result

    +
      +
    1. +

      The result of running the first command should contain the information about + current, minimum and maximum CPU frequency.

      +

      Example output:

      +
      CPU MHz:                         2800.0000
      +CPU max MHz:                     4700.0000
      +CPU min MHz:                     400.0000
      +
      +
    2. +
    3. +

      The result of running the second command should contain the information + about current frequency of each CPU core.

      +

      Example output:

      +
      cpu MHz     : 2800.000
      +cpu MHz     : 2800.000
      +cpu MHz     : 2800.000
      +cpu MHz     : 2800.000
      +cpu MHz     : 2800.000
      +cpu MHz     : 2800.000
      +cpu MHz     : 900.542
      +cpu MHz     : 461.831
      +
      +
    4. +
    5. +

      None of CPU core frequencies should be higher than maximum frequency or + lower than minimum frequency.

      +
    6. +
    +

    CPF002.002 CPU runs on expected frequency (Windows 11)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU is running on +expected frequency.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a powershell as administrator and run the following command:
    8. +
    +
    (Get-CimInstance CIM_Processor).MaxClockSpeed
    +
    +
      +
    1. Note the result.
    2. +
    3. Run the following command in the powershell:
    4. +
    +
    while(1){(Get-CimInstance CIM_Processor).MaxClockSpeed*((Get-Counter -Counter "\Processor Information(_Total)\% Processor Performance").CounterSamples.CookedValue)/100}
    +
    +
      +
    1. Repeat command every one minute, for 60 minutes.
    2. +
    3. Note the results.
    4. +
    +

    Expected result

    +
      +
    1. +

      The result of running the first command should contain the information about + maximum CPU frequency.

      +

      Example output:

      +
      2419
      +
      +
    2. +
    3. +

      None of displayed values ​​that follow the second command should be higher than + maximum frequency.

      +

      Example output:

      +
      1023.98759600614
      +1009.23827168367
      +940.831608527132
      +1201.62695181908
      +1140.59449053201
      +1021.87762893503
      +983.647614379085
      +1206.27777992278
      +
      +
    4. +
    +

    CPF003.001 CPU runs on expected frequency (Ubuntu 22.04, battery)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU is running on expected +frequency when charger is disconnected. The DUT during test works on battery.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lscpu | grep -i mhz
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. +

      Run the following command in the terminal:

      +
      cat /proc/cpuinfo | grep -i mhz
      +
      +
    12. +
    13. +

      Repeat command every one minute, for 60 minutes.

      +
    14. +
    15. Compare the results.
    16. +
    +

    Expected result

    +
      +
    1. +

      The result of running the first command should contain the information about + current, minimum and maximum CPU frequency.

      +

      Example output:

      +
      CPU MHz:                         1800.000
      +CPU max MHz:                     3900.0000
      +CPU min MHz:                     1600.0000
      +
      +
    2. +
    3. +

      The result of running the second command should contain the information + about current frequency of each CPU core.

      +

      Example output:

      +
      cpu MHz     : 1700.000
      +cpu MHz     : 3719.954
      +cpu MHz     : 1600.000
      +cpu MHz     : 1600.000
      +cpu MHz     : 3778.321
      +cpu MHz     : 1800.000
      +cpu MHz     : 1700.000
      +cpu MHz     : 3806.530
      +
      +
    4. +
    5. +

      None of CPU core frequencies should be higher than maximum frequency or + lower than minimum frequency.

      +
    6. +
    +

    CPF003.002 CPU runs on expected frequency (Windows 11, battery)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU is running on expected +frequency when charger is disconnected. The DUT during test works on battery.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a powershell as administrator and run the following command:
    8. +
    +
    (Get-CimInstance CIM_Processor).MaxClockSpeed
    +
    +
      +
    1. Note the result.
    2. +
    3. Run the following command in the powershell:
    4. +
    +
    while(1){(Get-CimInstance CIM_Processor).MaxClockSpeed*((Get-Counter -Counter "\Processor Information(_Total)\% Processor Performance").CounterSamples.CookedValue)/100}
    +
    +
      +
    1. Repeat command couple times
    2. +
    3. Note the results.
    4. +
    +

    Expected result

    +
      +
    1. +

      The result of running the first command should contain the information about + maximum CPU frequency.

      +

      Example output:

      +
      2419
      +
      +
    2. +
    3. +

      None of displayed values ​​that follow the second command should be higher than + maximum frequency.

      +

      Example output:

      +
      1023.98759600614
      +1009.23827168367
      +940.831608527132
      +1201.62695181908
      +1140.59449053201
      +1021.87762893503
      +983.647614379085
      +1206.27777992278
      +
      +
    4. +
    +

    CPF004.001 CPU with load runs on expected frequency (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU is running on expected +frequency during the stress test.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lscpu | grep -i mhz
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. +

      Open a terminal window and run the following command to turn on the stressor:

      +
      stress-ng --cpu 0 --tz -t 60m
      +
      +

      Stress test duration time might be changed by change the value of the +parameter -t.

      +
    12. +
    13. +

      While test runs, open a terminal window and run the following command every + one minute until the test finishes, to check the current frequency.

      +
      cat /proc/cpuinfo | grep -i mhz
      +
      +
    14. +
    15. +

      Note the results.

      +
    16. +
    +

    Expected result

    +
      +
    1. +

      The result of running the first command should contain the information about + current, minimum and maximum CPU frequency.

      +

      Example output:

      +
      CPU MHz:                         1800.000
      +CPU max MHz:                     3900.0000
      +CPU min MHz:                     1600.0000
      +
      +
    2. +
    3. +

      The result of running the third command should contain the information + about current frequency of each CPU core.

      +

      Example output:

      +
      cpu MHz     : 1900.000
      +cpu MHz     : 1600.000
      +cpu MHz     : 2849.923
      +cpu MHz     : 1700.000
      +cpu MHz     : 2200.000
      +cpu MHz     : 3386.400
      +cpu MHz     : 1600.000
      +cpu MHz     : 1600.000
      +
      +
    4. +
    5. +

      None of CPU core frequencies should be higher than maximum frequency or + lower than minimum frequency.

      +
    6. +
    +

    CPF004.002 CPU with load runs on expected frequency (Windows 11)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU is running on +expected frequency during the stress test.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a powershell as administrator and run the following command:
    8. +
    +
    (Get-CimInstance CIM_Processor).MaxClockSpeed
    +
    +
      +
    1. Note the result.
    2. +
    3. Run the stressor.
    4. +
    5. While test runs, open Powershell and run the following command every + one minute until the test finishes, to check the current frequency:
    6. +
    +
    (Get-CimInstance CIM_Processor).MaxClockSpeed*((Get-Counter -Counter "\Processor Information(_Total)\% Processor Performance").CounterSamples.CookedValue)/100
    +
    +
      +
    1. Repeat command couple times.
    2. +
    3. Note the results.
    4. +
    +

    Expected result

    +
      +
    1. +

      The result of running the first command should contain the information about + maximum CPU frequency.

      +

      Example output:

      +
      2419
      +
      +
    2. +
    3. +

      None of displayed values ​​that follow the second command should be higher than + maximum frequency.

      +

      Example output:

      +
      1023.98759600614
      +1009.23827168367
      +940.831608527132
      +1201.62695181908
      +1140.59449053201
      +1021.87762893503
      +983.647614379085
      +1206.27777992278
      +
      +
    4. +
    +

    CPF005.001 CPU with load runs on expected frequency (Ubuntu 22.04, battery)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU is running on expected +frequency during the stress test. The DUT during test works on battery.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lscpu | grep -i mhz
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. +

      Open a terminal window and run the following command to turn on the stressor:

      +
      stress-ng --cpu 0 --tz -t 60m
      +
      +

      Stress test duration time might be changed by change the value of the +parameter -t.

      +
    12. +
    13. +

      While test runs, open a terminal window and run the following command every + one minute until the test finishes, to check the current frequency.

      +
      cat /proc/cpuinfo | grep -i mhz
      +
      +
    14. +
    15. +

      Note the results.

      +
    16. +
    +

    Expected result

    +
      +
    1. +

      The result of running the first command should contain the information about + current, minimum and maximum CPU frequency.

      +

      Example output:

      +
      CPU MHz:                         1800.000
      +CPU max MHz:                     3900.0000
      +CPU min MHz:                     1600.0000
      +
      +
    2. +
    3. +

      The result of running the third command should contain the information + about current frequency of each CPU core.

      +

      Example output:

      +
      cpu MHz     : 1900.000
      +cpu MHz     : 1600.000
      +cpu MHz     : 2849.923
      +cpu MHz     : 1700.000
      +cpu MHz     : 2200.000
      +cpu MHz     : 3386.400
      +cpu MHz     : 1600.000
      +cpu MHz     : 1600.000
      +
      +
    4. +
    5. +

      None of CPU core frequencies should be higher than maximum frequency or + lower than minimum frequency.

      +
    6. +
    +

    CPF005.002 CPU with load runs on expected frequency (Windows 11, battery)

    +

    Test description

    +

    This test aims to verify whether the mounted CPU is running on +expected frequency during the stress test.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a powershell as administrator and run the following command:
    8. +
    +
    (Get-CimInstance CIM_Processor).MaxClockSpeed
    +
    +
      +
    1. Note the result.
    2. +
    3. Run the stressor.
    4. +
    5. While test runs, open Powershell and run the following command every + one minute until the test finishes, to check the current frequency:
    6. +
    +
    (Get-CimInstance CIM_Processor).MaxClockSpeed*((Get-Counter -Counter "\Processor Information(_Total)\% Processor Performance").CounterSamples.CookedValue)/100
    +
    +
      +
    1. Repeat command couple times.
    2. +
    3. Note the results.
    4. +
    +

    Expected result

    +
      +
    1. +

      The result of running the first command should contain the information about + maximum CPU frequency.

      +

      Example output:

      +
      2419
      +
      +
    2. +
    3. +

      None of displayed values that follow the second command should be higher than + maximum frequency.

      +

      Example output:

      +
      1023.98759600614
      +1009.23827168367
      +940.831608527132
      +1201.62695181908
      +1140.59449053201
      +1021.87762893503
      +983.647614379085
      +1206.27777992278
      +
      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/403-device-boot-measure/index.html b/unified-test-documentation/dasharo-performance/403-device-boot-measure/index.html new file mode 100644 index 00000000000..b222d2325c2 --- /dev/null +++ b/unified-test-documentation/dasharo-performance/403-device-boot-measure/index.html @@ -0,0 +1,6005 @@ + + + + + + + + + + + + + + + + + + Device boot measure - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: Device boot measure

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    DBM001.001 Device boot measure after coldboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the DUT boots after coldboot and how long this +process takes. This test case may be re-done several times to to average the +results and specify the platform stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Boot into the system.
    6. +
    7. Log into the system by using the proper login and password.
    8. +
    9. +

      Open a terminal window and run the following command:

      +
      systemd-analyze
      +
      +
    10. +
    11. +

      Note the results.

      +
    12. +
    +

    Expected result

    +

    The output of the command should contain the information about duration of +all boot stages.

    +

    DBM002.001 Device boot measure after warmboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the DUT boots after warmboot and how long this +process takes. This test case may be re-done several times to to average the +results and specify the platform stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      systemd-analyze
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    +

    Expected result

    +

    The output of the command should contain the information about duration of +all boot stages.

    +

    DBM003.001 Device boot measure after reboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether the DUT boots after system reboot and how long +this process takes. This test case may be re-done several times to to average +the results and specify the platform stability.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Boot into the system.

      +
    10. +
    11. Log into the system by using the proper login and password.
    12. +
    13. +

      Open a terminal window and run the following command:

      +
      systemd-analyze
      +
      +
    14. +
    15. +

      Note the results.

      +
    16. +
    +

    Expected result

    +

    The output of the command should contain the information about duration of +all boot stages.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/404-platform-stability/index.html b/unified-test-documentation/dasharo-performance/404-platform-stability/index.html new file mode 100644 index 00000000000..1a332353b65 --- /dev/null +++ b/unified-test-documentation/dasharo-performance/404-platform-stability/index.html @@ -0,0 +1,6063 @@ + + + + + + + + + + + + + + + + + + Platform stability - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: Platform stability

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    STB001.001 Verify if no reboot occurs in the firmware

    +

    Test description

    +

    This test aims to verify that the DUT booted to the BIOS does not reset. The +test is performed in multiple iterations - after a defined time an attempt to +read the same menu is repeated.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While booting, press SETUP_MENU_KEY to enter the setup menu.
    4. +
    5. Note the results.
    6. +
    7. After the specified time has elapsed, repeat the operation described in + step 3.
    8. +
    +

    Expected result

    +

    The platform should remain in the setup menu in every testing iteration.

    +

    STB001.002 Verify if no reboot occurs in the OS (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the DUT booted to the Operation System does not +reset. The test is performed in multiple iterations - after a defined time an +attempt to read the output of specific commands confirming the stability of +work is repeated.

    +

    For testing purposes, additional stability criteria are adopted:

    +
      +
    • Whether the platform has not lost connection to the Internet.
    • +
    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      uptime -p
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. +

      Run the following command in the terminal to check if the platform has + a connection with the Internet:

      +
      ip link | grep -E 'enp'
      +
      +
    12. +
    13. +

      Note the results.

      +
    14. +
    15. After the specified time has elapsed, repeat the operations described in + steps 4-7.
    16. +
    +

    Expected result

    +
      +
    1. +

      Subsequent readings of the first command output should indicate that + the platform has not undergone a reboot.

      +

      Example output of the command after 30 minutes of working:

      +
      up 30 minutes
      +
      +
    2. +
    3. +

      Subsequent readings of the second command output should indicate that the + platform has not lost the connection to the Internet.

      +

      Example output of the command:

      +
      2: enp46s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
      +
      +

      If the device is connected to the Internet, a UP status should appear +for at least one physical interface.

      +
    4. +
    +

    STB001.003 Verify if no reboot occurs in the OS (Windows 11)

    +

    Test description

    +

    This test aims to verify that the DUT booted to the Operation System does not +reset. The test is performed in multiple iterations - after a defined time an +attempt to read the output of specific commands confirming the stability of +work is repeated.

    +

    For testing purposes, additional stability criteria are adopted:

    +
      +
    • Whether the platform has not lost connection to the Internet.
    • +
    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Run PowerShell as administrator and execute the following command:

      +
      (get-date) - (gcim Win32_OperatingSystem).LastBootUpTime
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. +

      Run the following command in PowerShell to check if the platform has + a connection with the Internet:

      +
      Get-NetAdapter -Name "Ethernet*"
      +
      +
    12. +
    13. +

      Note the results.

      +
    14. +
    15. After the specified time has elapsed, repeat the operations described in + steps 4-7.
    16. +
    +

    Expected result

    +
      +
    1. +

      Subsequent readings of the first command output should indicate that + the platform has not undergone a reboot.

      +

      Example output of the command after 17 minutes of working:

      +
      Days              : 0
      +Hours             : 0
      +Minutes           : 17
      +Seconds           : 8
      +Milliseconds      : 784
      +Ticks             : 10287845330
      +TotalDays         : 0.0119072283912037
      +TotalHours        : 0.285773481388889
      +TotalMinutes      : 17.1464088833333
      +TotalSeconds      : 1028.784533
      +TotalMilliseconds : 1028784.533
      +
      +
    2. +
    3. +

      Subsequent readings of the second command output should indicate that the + platform has not lost the connection to the Internet.

      +

      Example output of the command:

      +
      Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
      +----                      --------------------                    ------- ------       ----------             ---------
      +Ethernet                  Realtek PCIe GbE Family Controller           15 Up           D4-93-90-0C-23-A1       100 Mbps
      +
      +

      If the device is connected to the Internet, a UP status should appear +for at least one physical interface.

      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/405-fan-control-measure/index.html b/unified-test-documentation/dasharo-performance/405-fan-control-measure/index.html new file mode 100644 index 00000000000..19c4ed5706f --- /dev/null +++ b/unified-test-documentation/dasharo-performance/405-fan-control-measure/index.html @@ -0,0 +1,6017 @@ + + + + + + + + + + + + + + + + + + Fan control measure - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: Fan Control

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. +

      Check if package lm-sensors is installed and if not, use below command in + the terminal to install:

      +
      apt-get install --assume-yes lm-sensors
      +
      +
    10. +
    +

    FNM001.001 Fan does not stuck after coldboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the fan does not stuck on initial or any defined +speed after coldboot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Boot into the system.
    6. +
    7. Log into the system by using the proper login and password.
    8. +
    9. +

      In the terminal window run the following command\:

      +
      sensors | grep fan1
      +
      +
    10. +
    11. +

      Repeat command every one minute, for 60 minutes.

      +
    12. +
    13. Compare the results.
    14. +
    +

    Expected result

    +

    The output of the command should contain information about the current +fan speed. If the current speed is the same as initial speed, the test should +be considered as failed. If the current speed does not change in the long term, +the test should be considered as failed.

    +

    Example output:

    +
    fan1:        1131 RPM  (min =  329 RPM)
    +
    +

    FNM002.001 Fan does not stuck after warmboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the fan does not stuck on initial or any defined +speed after warmboot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      In the terminal window run the following command:

      +
      sensors | grep fan1
      +
      +
    8. +
    9. +

      Repeat command every one minute, for 60 minutes.

      +
    10. +
    11. Compare the results.
    12. +
    +

    Expected result

    +

    The output of the command should contain information about the current +fan speed. If the current speed is the same as initial speed, the test should +be considered as failed. If the current speed does not change in the long term, +the test should be considered as failed.

    +

    Example output:

    +
    fan1:        1131 RPM  (min =  329 RPM)
    +
    +

    FNM003.001 Fan does not stuck after reboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the fan does not stuck on initial or any defined +speed after reboot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      In the terminal window run the following command:

      +
      sensors | grep fan1
      +
      +
    8. +
    9. +

      Repeat command every one minute, for 60 minutes.

      +
    10. +
    11. Compare the results.
    12. +
    +

    Expected result

    +

    The output of the command should contain information about the current +fan speed. If the current speed is the same as initial speed, the test should +be considered as failed. If the current speed does not change in the long term, +the test should be considered as failed.

    +

    Example output:

    +
    fan1:        1131 RPM  (min =  329 RPM)
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/406-custom-fan-curve/index.html b/unified-test-documentation/dasharo-performance/406-custom-fan-curve/index.html new file mode 100644 index 00000000000..72533d6054b --- /dev/null +++ b/unified-test-documentation/dasharo-performance/406-custom-fan-curve/index.html @@ -0,0 +1,6051 @@ + + + + + + + + + + + + + + + + + + Custom fan curve - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: Custom fan curve

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    CFC001.001 Custom fan curve silent profile measure (Ubuntu 22.04)

    +

    Test description

    +

    The fan has been configured to follow a custom curve. This test aims to verify +that the fan curve is configured correctly in silent profile and the fan spins +up and down according to the defined values.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install stress-ng on the DUT.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Power Management Options submenu.
    8. +
    9. Verify that the Fan profile field is set to Silent - if not, using the + arrow keys and Enter, choose the Silent option.
    10. +
    11. Press F10 to save the changes.
    12. +
    13. If necessary - press Y to confirm saving the changes.
    14. +
    15. Go back to the main menu using the ESC key.
    16. +
    17. Select the Reset option to apply the settings and reboot.
    18. +
    19. Boot into the system.
    20. +
    21. Log into the system by using the proper login and password.
    22. +
    23. +

      Open the terminal window and run the following command:

      +
      stress-ng --cpu 16 --timeout 30m
      +
      +
    24. +
    25. +

      Open the terminal window and run the following command to get the + temperature:

      +
      cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/temp1_input
      +
      +
      +

      The last three digits of the output are the value of the number after the + decimal point. Example output 47000 means 47°C.

      +
      +
    26. +
    27. +

      In the terminal window run the following command to get the PWM value of the + CPU fan:

      +
      cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/pwm1
      +
      +
    28. +
    29. +

      Repeat steps 13-14 a couple of times.

      +
    30. +
    31. Note the results.
    32. +
    +

    Expected result

    +

    Silent fan profile

    +

    Keep in mind that the EC firmware is smoothing, i.e. the fans will enter the +target speed with a delay.

    +

    The algorithm by which the EC calculates the speed is as follows:

    +
      +
    • If the temperature is below the first one defined in the curve, set the speed + to 0.
    • +
    • If the temperature is above the last defined curve, set the maximum speed.
    • +
    • If the temperature is equal to one of the temperatures of the points on the + curve, set the speed from that point on the curve
    • +
    • +

      If the temperature is between points on the curve:

      +
      slope = (right_point_speed - left_point_speed)/right_point_temperature - left_point_temperature)
      +speed = slope*(temperature - left_point_temperature) + left_point_speed
      +
      +
    • +
    +

    Divide the PWM value by 2.55 to get the percentage to compare.

    +

    Example check for 30°C and 70 PWM values:

    +
    ```text
    +expected_speed = ((30-25)/(65-0))*(30-0)+25 ≈ 27
    +actual_speed = 70/2.55 ≈ 27
    +```
    +
    +

    Values expected_speed and actual_speed are strongly similar. This means +that the fan control is set correctly.

    +

    CFC002.001 Custom fan curve performance profile measure (Ubuntu 22.04)

    +

    Test description

    +

    The fan has been configured to follow a custom curve. This test aims to verify +that the fan curve is configured correctly in the performance profile and the +fan spins up and down according to the defined values.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install stress-ng on the DUT.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Power Management Options submenu.
    8. +
    9. Verify that the Fan profile field is set to Performance - if not, using + the arrow keys and Enter, choose the Performance option.
    10. +
    11. Press F10 to save the changes.
    12. +
    13. If necessary - press Y to confirm saving the changes.
    14. +
    15. Go back to the main menu using the ESC key.
    16. +
    17. Select the Reset option to apply the settings and reboot.
    18. +
    19. Boot into the system.
    20. +
    21. Log into the system by using the proper login and password.
    22. +
    23. +

      Open the terminal window and run the following command:

      +
      stress-ng --cpu 16 --timeout 30m
      +
      +
    24. +
    25. +

      Open the terminal window and run the following command to get the + temperature:

      +
      cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/temp1_input
      +
      +
      +

      The last three digits of the output are the value of the number after the + decimal point. Example output 47000 means 47°C.

      +
      +
    26. +
    27. +

      In the terminal window run the following command to get the PWM value of the + CPU fan:

      +
      cat /sys/devices/LNXSYSTM:00/LNXSYBUS:00/17761776:00/hwmon/hwmon3/pwm1
      +
      +
    28. +
    29. +

      Repeat steps 13-14 a couple of times.

      +
    30. +
    31. Note the results.
    32. +
    +

    Expected result

    +

    Performance fan profile

    +

    Keep in mind that the EC firmware is smoothing, i.e. the fans will enter the +target speed with a delay.

    +

    The algorithm by which the EC calculates the speed is as follows:

    +
      +
    • If the temperature is below the first one defined in the curve, set the speed + to 0.
    • +
    • If the temperature is above the last defined curve, set the maximum speed.
    • +
    • If the temperature is equal to one of the temperatures of the points on the + curve, set the speed from that point on the curve
    • +
    • +

      If the temperature is between points on the curve:

      +
      slope = (right_point_speed - left_point_speed)/right_point_temperature - left_point_temperature)
      +speed = slope*(temperature - left_point_temperature) + left_point_speed
      +
      +
    • +
    +

    Divide the PWM value by 2.55 to get the percentage to compare.

    +

    Example check for 30°C and 79 PWM values:

    +
    ```text
    +expected_speed = ((35-25)/(55-0))*(35-0)+25 ≈ 31
    +actual_speed = 79/2.55 ≈ 31
    +```
    +
    +

    Values expected_speed and actual_speed are strongly similar. This means +that the fan control is set correctly.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/407-ubuntu-booting-performance-test/index.html b/unified-test-documentation/dasharo-performance/407-ubuntu-booting-performance-test/index.html new file mode 100644 index 00000000000..7423cd520eb --- /dev/null +++ b/unified-test-documentation/dasharo-performance/407-ubuntu-booting-performance-test/index.html @@ -0,0 +1,5981 @@ + + + + + + + + + + + + + + + + + + Ubuntu booting performance test - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: Ubuntu booting performance test

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    BUB001.001 Boot Ubuntu LTS from disk after cold-boot

    +

    Test description

    +

    This test aims to verify that Ubuntu LTS could be booted from the disk on the +DUT after cold-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04 LTS
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot and note the result.
    10. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BUB002.001 Boot Ubuntu LTS from disk after warm-boot

    +

    Test description

    +

    This test aims to verify that Ubuntu LTS could be booted from the disk on the +DUT after warm-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04 LTS
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BUB003.001 Boot Ubuntu LTS from disk after reboot

    +

    Test description

    +

    This test aims to verify that Ubuntu LTS could be booted from the disk on the +DUT after reboot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04 LTS
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Press BOOT_MENU_KEY to enter the boot menu.

      +
    10. +
    11. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    12. +
    13. Wait for the OPERATING_SYSTEM to boot and note the result.
    14. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/408-debian-booting-performance-test/index.html b/unified-test-documentation/dasharo-performance/408-debian-booting-performance-test/index.html new file mode 100644 index 00000000000..0ba62dc3c15 --- /dev/null +++ b/unified-test-documentation/dasharo-performance/408-debian-booting-performance-test/index.html @@ -0,0 +1,5981 @@ + + + + + + + + + + + + + + + + + + Debian booting performance test - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: Debian booting performance test

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    BDE001.001 Boot Debian LTS from disk after cold-boot

    +

    Test description

    +

    This test aims to verify that Debian LTS could be booted from the disk +on the DUT after cold-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.6
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot and note the result.
    10. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BDE002.001 Boot Debian LTS from disk after warm-boot

    +

    Test description

    +

    This test aims to verify that Debian LTS could be booted from the disk +on the DUT after warm-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.6
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BDE003.001 Boot Debian LTS from disk after reboot

    +

    Test description

    +

    This test aims to verify that Debian LTS could be booted from the disk +on the DUT after reboot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Debian 11.6
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Press BOOT_MENU_KEY to enter the boot menu.

      +
    10. +
    11. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    12. +
    13. Wait for the OPERATING_SYSTEM to boot and note the result.
    14. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/409-freebsd-booting-performance-test/index.html b/unified-test-documentation/dasharo-performance/409-freebsd-booting-performance-test/index.html new file mode 100644 index 00000000000..26c3de8377c --- /dev/null +++ b/unified-test-documentation/dasharo-performance/409-freebsd-booting-performance-test/index.html @@ -0,0 +1,5981 @@ + + + + + + + + + + + + + + + + + + FreeBSD booting performance test - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: FreeBSD booting performance test

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    BFB001.001 Boot FreeBSD-RELEASE from disk after cold-boot

    +

    Test description

    +

    This test aims to verify that FreeBSD-RELEASE could be booted from the disk +on the DUT after cold-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = FreeBSD 13.2
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot and note the result.
    10. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BFB002.001 Boot FreeBSD-RELEASE from disk after warm-boot

    +

    Test description

    +

    This test aims to verify that FreeBSD-RELEASE could be booted from the disk +on the DUT after warm-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = FreeBSD 13.2
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BFB003.001 Boot FreeBSD-RELEASE from disk after reboot

    +

    Test description

    +

    This test aims to verify that FreeBSD-RELEASE could be booted from the disk +on the DUT after reboot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = FreeBSD 13.2
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Press BOOT_MENU_KEY to enter the boot menu.

      +
    10. +
    11. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    12. +
    13. Wait for the OPERATING_SYSTEM to boot and note the result.
    14. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/410-proxmox-booting-performance-test/index.html b/unified-test-documentation/dasharo-performance/410-proxmox-booting-performance-test/index.html new file mode 100644 index 00000000000..ecdadfb0b11 --- /dev/null +++ b/unified-test-documentation/dasharo-performance/410-proxmox-booting-performance-test/index.html @@ -0,0 +1,5981 @@ + + + + + + + + + + + + + + + + + + Proxmox booting performance test - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: Proxmox booting performance test

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    BPM001.001 Boot Proxmox Virtual Environment from disk after cold-boot

    +

    Test description

    +

    This test aims to verify that Proxmox VE could be booted from the disk on +the DUT after cold-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Proxmox VE 7.4
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot and note the result.
    10. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BPM002.001 Boot Proxmox Virtual Environment from disk after warm-boot

    +

    Test description

    +

    This test aims to verify that Proxmox VE could be booted from the disk on +the DUT after warm-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Proxmox VE 7.4
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BPM003.001 Boot Proxmox Virtual Environment from disk after reboot

    +

    Test description

    +

    This test aims to verify that Proxmox VE could be booted from the disk on +the DUT after reboot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Proxmox VE 7.4
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Press BOOT_MENU_KEY to enter the boot menu.

      +
    10. +
    11. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    12. +
    13. Wait for the OPERATING_SYSTEM to boot and note the result.
    14. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/411-ubuntu-server-booting-performance-test/index.html b/unified-test-documentation/dasharo-performance/411-ubuntu-server-booting-performance-test/index.html new file mode 100644 index 00000000000..460a257cc23 --- /dev/null +++ b/unified-test-documentation/dasharo-performance/411-ubuntu-server-booting-performance-test/index.html @@ -0,0 +1,5981 @@ + + + + + + + + + + + + + + + + + + Ubuntu Server booting performance test - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: Ubuntu Server booting performance test

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    BUS001.001 Boot Ubuntu Server LTS from disk after cold-boot

    +

    Test description

    +

    This test aims to verify that Ubuntu Server LTS could be booted from the disk +on the DUT after cold-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu Server 22.04 LTS
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot and note the result.
    10. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BUS002.001 Boot Ubuntu Server LTS from disk after warm-boot

    +

    Test description

    +

    This test aims to verify that Ubuntu Server LTS could be booted from the disk +on the DUT after warm-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu Server 22.04 LTS
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BUS003.001 Boot Ubuntu Server LTS from disk after reboot

    +

    Test description

    +

    This test aims to verify that Ubuntu Server LTS could be booted from the disk +on the DUT after reboot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu Server 22.04 LTS
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Press BOOT_MENU_KEY to enter the boot menu.

      +
    10. +
    11. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    12. +
    13. Wait for the OPERATING_SYSTEM to boot and note the result.
    14. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/412-opnsense-serial-booting-performance-test/index.html b/unified-test-documentation/dasharo-performance/412-opnsense-serial-booting-performance-test/index.html new file mode 100644 index 00000000000..0b1746593e3 --- /dev/null +++ b/unified-test-documentation/dasharo-performance/412-opnsense-serial-booting-performance-test/index.html @@ -0,0 +1,5981 @@ + + + + + + + + + + + + + + + + + + OPNsense (serial output) booting performance test - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: OPNsense (serial output) booting performance test

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    BOS001.001 Boot OPNsense (serial output) from disk after cold-boot

    +

    Test description

    +

    This test aims to verify that OPNsense (serial output) could be booted from the +disk on the DUT after cold-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = OPNsense serial 23.01
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot and note the result.
    10. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BOS002.001 Boot OPNsense (serial output) from disk after warm-boot

    +

    Test description

    +

    This test aims to verify that OPNsense (serial output) could be booted from the +disk on the DUT after warm-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = OPNsense serial 23.01
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BOS003.001 Boot OPNsense (serial output) from disk after reboot

    +

    Test description

    +

    This test aims to verify that OPNsense (serial output) could be booted from the +disk on the DUT after reboot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = OPNsense serial 23.01
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Press BOOT_MENU_KEY to enter the boot menu.

      +
    10. +
    11. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    12. +
    13. Wait for the OPERATING_SYSTEM to boot and note the result.
    14. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/413-opnsense-vga-booting-performance-test/index.html b/unified-test-documentation/dasharo-performance/413-opnsense-vga-booting-performance-test/index.html new file mode 100644 index 00000000000..7933f1f43f0 --- /dev/null +++ b/unified-test-documentation/dasharo-performance/413-opnsense-vga-booting-performance-test/index.html @@ -0,0 +1,5983 @@ + + + + + + + + + + + + + + + + + + OPNsense (VGA output) booting performance test - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: OPNsense (VGA output) booting performance test

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    BOV001.001 Boot OPNsense (VGA output) from disk after cold-boot

    +

    Test description

    +

    This test aims to verify that OPNsense (VGA output) could be booted from the +disk on the DUT after cold-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = OPNsense VGA 23.01
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot and note the result.
    10. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BOV002.001 Boot OPNsense (VGA output) stable from disk after warm-boot

    +

    Test description

    +

    This test aims to verify that OPNsense (VGA output) stable could be booted +from the disk on the DUT after warm-boot. The test is performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = OPNsense VGA 23.01
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BOV003.001 Boot OPNsense (VGA output) stable from disk after reboot

    +

    Test description

    +

    This test aims to verify that OPNsense (VGA output) stable could be booted +from the disk on the DUT after reboot. The test is performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = OPNsense VGA 23.01
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Press BOOT_MENU_KEY to enter the boot menu.

      +
    10. +
    11. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    12. +
    13. Wait for the OPERATING_SYSTEM to boot and note the result.
    14. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/414-pfsense-serial-booting-performance-test/index.html b/unified-test-documentation/dasharo-performance/414-pfsense-serial-booting-performance-test/index.html new file mode 100644 index 00000000000..66d33592639 --- /dev/null +++ b/unified-test-documentation/dasharo-performance/414-pfsense-serial-booting-performance-test/index.html @@ -0,0 +1,5984 @@ + + + + + + + + + + + + + + + + + + pfSense (serial output) booting performance test - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: pfSense (serial output) booting performance test

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    BPS001.001 Boot pfSense LTS CE (serial output) from disk after cold-boot

    +

    Test description

    +

    This test aims to verify that pfSense LTS CE (serial output) could be booted +from the disk on the DUT after cold-boot. The test is performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = pfSense CE serial 2.6.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot and note the result.
    10. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BPS002.001 Boot pfSense LTS CE (serial output) from disk after warm-boot

    +

    Test description

    +

    This test aims to verify that pfSense LTS CE (serial output) could be booted +from the disk on the DUT after warm-boot. The test is performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = pfSense CE serial 2.6.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BPS003.001 Boot pfSense LTS CE (serial output) from disk after reboot

    +

    Test description

    +

    This test aims to verify that pfSense LTS CE (serial output) could be booted +from the disk on the DUT after reboot. The test is performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = pfSense CE serial 2.6.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Press BOOT_MENU_KEY to enter the boot menu.

      +
    10. +
    11. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    12. +
    13. Wait for the OPERATING_SYSTEM to boot and note the result.
    14. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/415-pfsense-vga-booting-performance-test/index.html b/unified-test-documentation/dasharo-performance/415-pfsense-vga-booting-performance-test/index.html new file mode 100644 index 00000000000..3d843c73090 --- /dev/null +++ b/unified-test-documentation/dasharo-performance/415-pfsense-vga-booting-performance-test/index.html @@ -0,0 +1,5984 @@ + + + + + + + + + + + + + + + + + + pfSense (VGA output) booting performance test - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: pfSense (VGA output) booting performance test

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    BPV001.001 Boot pfSense LTS CE (VGA output) from disk after cold-boot

    +

    Test description

    +

    This test aims to verify that pfSense LTS CE (VGA output) could be booted +from the disk on the DUT after cold-boot. The test is performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = pfSense CE VGA 2.6.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot and note the result.
    10. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BPV002.001 Boot pfSense LTS CE (VGA output) from disk after warm-boot

    +

    Test description

    +

    This test aims to verify that pfSense LTS CE (VGA output) could be booted +from the disk on the DUT after warm-boot. The test is performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = pfSense CE VGA 2.6.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BPV003.001 Boot pfSense LTS CE (VGA output) from disk after reboot

    +

    Test description

    +

    This test aims to verify that pfSense LTS CE (VGA output) could be booted +from the disk on the DUT after reboot. The test is performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = pfSense CE VGA 2.6.0
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      sudo reboot
      +
      +
    8. +
    9. +

      Press BOOT_MENU_KEY to enter the boot menu.

      +
    10. +
    11. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    12. +
    13. Wait for the OPERATING_SYSTEM to boot and note the result.
    14. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-performance/416-windows-booting-performance-test/index.html b/unified-test-documentation/dasharo-performance/416-windows-booting-performance-test/index.html new file mode 100644 index 00000000000..8b9f8b2c023 --- /dev/null +++ b/unified-test-documentation/dasharo-performance/416-windows-booting-performance-test/index.html @@ -0,0 +1,5981 @@ + + + + + + + + + + + + + + + + + + Windows booting performance test - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Performance: Windows booting performance test

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    BWI001.001 Boot Windows 11 from disk after cold-boot

    +

    Test description

    +

    This test aims to verify that Windows 11 could be booted from the disk +on the DUT after cold-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Cut the power off while DUT is turned on.
    2. +
    3. Restore power and power on the DUT.
    4. +
    5. Press BOOT_MENU_KEY to enter the boot menu.
    6. +
    7. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    8. +
    9. Wait for the OPERATING_SYSTEM to boot and note the result.
    10. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BWI002.001 Boot Windows 11 from disk after warm-boot

    +

    Test description

    +

    This test aims to verify that Windows 11 could be booted from the disk +on the DUT after warm-boot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press BOOT_MENU_KEY to enter the boot menu.
    4. +
    5. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    6. +
    7. Wait for the OPERATING_SYSTEM to boot and note the result.
    8. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    +

    BWI003.001 Boot Windows 11 from disk after reboot

    +

    Test description

    +

    This test aims to verify that Windows 11 could be booted from the disk +on the DUT after reboot. The test is performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Reboot the device executing in PowerShell:

      +
      Restart-Computer
      +
      +
    8. +
    9. +

      Press BOOT_MENU_KEY to enter the boot menu.

      +
    10. +
    11. In the Boot Menu, select the disk on which the system was previously + installed or boot entry with the name of OPERATING_SYSTEM.
    12. +
    13. Wait for the OPERATING_SYSTEM to boot and note the result.
    14. +
    +

    Expected result

    +

    The OPERATING_SYSTEM login screen should be displayed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/200-tpm-support/index.html b/unified-test-documentation/dasharo-security/200-tpm-support/index.html new file mode 100644 index 00000000000..7f260222a74 --- /dev/null +++ b/unified-test-documentation/dasharo-security/200-tpm-support/index.html @@ -0,0 +1,6523 @@ + + + + + + + + + + + + + + + + + + TPM support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Security: TPM Support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    TPM001.001 TPM Support (firmware)

    +

    Test description

    +

    This test aims to verify that the TPM is initialized correctly and the PCRs can +be accessed from the firmware.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the BIOS.
    4. +
    5. Enter the shell.
    6. +
    7. +

      Run the following command in the shell:

      +
      cbmem -L
      +
      +
    8. +
    +

    Expected result

    +

    The command should return information about the TPM log entries.

    +

    Example output:

    +
    TPM2 log:
    +    Specification: 2.00
    +    Platform class: PC Client
    +    No vendor information provided
    +TPM2 log entry 1:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: f78a530fb5a70afcffdc86a98529abd24a90bac9
    +    Event data: FMAP: FMAP
    +TPM2 log entry 2:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: 369155e6eab3b0a874140e591a4c0e992268b4b9
    +    Event data: FMAP: BOOTBLOCK
    +TPM2 log entry 3:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: 5e785c080264aa6e169f70c80ac40b556066292b
    +    Event data: FMAP: COREBOOT CBFS: fallback/romstage
    +TPM2 log entry 4:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: ba2a5af955811fbac58a5198545539596eb38c3e
    +    Event data: FMAP: COREBOOT CBFS: fallback/ramstage
    +TPM2 log entry 5:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: ba35d4ce29d7b633b5644e2a3206c6069cf7f24d
    +    Event data: FMAP: COREBOOT CBFS: fallback/payload
    +TPM2 log entry 6:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: 47b49026133377e05193f8440c9a7cad239e883c
    +    Event data: FMAP: COREBOOT CBFS: 1-cpu.dtb
    +TPM2 log entry 7:
    +    PCR: 3
    +    Event type: Action
    +    Digests:
    +         SHA256: 6e7b06693452d997ac534e823b1ea79e5bb8ed19ba8a7af878abf10199c3d515
    +         SHA1: 6e7b06693452d997ac534e823b1ea79e5bb8ed19
    +    Event data: VERSION
    +TPM2 log entry 8:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA256: de73053377e1ae5ba5d2b637a4f5bfaeb410137722f11ef135e7a1be524e3092
    +         SHA1: de73053377e1ae5ba5d2b637a4f5bfaeb4101377
    +    Event data: IMA_CATALOG
    +TPM2 log entry 9:
    +    PCR: 4
    +    Event type: Action
    +    Digests:
    +         SHA256: ba427f9349b1f9e589f98909e26086b0cfd5ced78a7fbcb140a70a506c38a8e5
    +         SHA1: ba427f9349b1f9e589f98909e26086b0cfd5ced7
    +    Event data: BOOTKERNEL
    +(...)
    +
    +

    TPM001.002 TPM Support (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the TPM is initialized correctly and the PCRs can +be accessed from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the tpm2-tools package: sudo apt install tpm2-tools.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Check the version of installed tpm2-tools - execute the following command + in the terminal:

      +
      dpkg --list tpm2-tools
      +
      +
    8. +
    9. +

      If your device is equipped with TPM2.0 and the version of tpm2-tools + is 4.0 or higher - execute the following command in the terminal:

      +
      tpm2_pcrread
      +
      +
    10. +
    11. +

      If your device is equipped with TPM2.0 and the version of tpm2-tools + is lower than 4.0 - execute the following command in the terminal:

      +
      tpm2_pcrlist
      +
      +
    12. +
    13. +

      If your device is equipped with TPM1.2 - execute the following command in the + terminal:

      +
      cat /sys/class/tpm/tpm0/pcrs
      +
      +
    14. +
    +

    Expected result

    +

    The command should return a list of PCRs and their contents.

    +

    Output example for TPM2.0:

    +
    sha1 :
    +  0  : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275
    +  1  : 8a074fdf65a11e5dbf02d25e7f26b00c26c98b41
    +  2  : c36c2509d636c9cfa075d6d0a03b7a37bec14ee9
    +  3  : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275
    +  4  : 2d247bb671ec17ded623ca45967df5482517291b
    +  5  : 49d543eb1d1df3439d9fca695ee47b8cdf4b9e2f
    +  6  : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275
    +  7  : 3a3f780f11a4b49969fcaa80cd6e3957c33b2275
    +  8  : 0000000000000000000000000000000000000000
    +  9  : 0000000000000000000000000000000000000000
    +  10 : 0000000000000000000000000000000000000000
    +  11 : 0000000000000000000000000000000000000000
    +  12 : 0000000000000000000000000000000000000000
    +  13 : 0000000000000000000000000000000000000000
    +  14 : 0000000000000000000000000000000000000000
    +  15 : 0000000000000000000000000000000000000000
    +  16 : 0000000000000000000000000000000000000000
    +  17 : ffffffffffffffffffffffffffffffffffffffff
    +  18 : ffffffffffffffffffffffffffffffffffffffff
    +  19 : ffffffffffffffffffffffffffffffffffffffff
    +  20 : ffffffffffffffffffffffffffffffffffffffff
    +  21 : ffffffffffffffffffffffffffffffffffffffff
    +  22 : ffffffffffffffffffffffffffffffffffffffff
    +  23 : 0000000000000000000000000000000000000000
    +sha256 :
    +  0  : d27cc12614b5f4ff85ed109495e320fb1e5495eb28d507e952d51091e7ae2a72
    +  1  : b29a64bd6895966b777eb803f45e6bbffade81cc1b996a34f7cbd26f1d04028b
    +  2  : 3122422e43b9fbfc0cb70eb467b55e99ec61462370e6b15c515484f821e1d4d9
    +  3  : 909e4261938378c0556a4c335c38718d1c313bd151fdf222df674aabb7aeee97
    +  4  : 984763b42633ee11e5167e2f67c2e6879bd6efac683f1df1ef16d7ce96d4b49b
    +  5  : dab92c45eeb765e29784f8cc33f92d0a39afed173f2b07e0e328586c3c3b19ed
    +  6  : d27cc12614b5f4ff85ed109495e320fb1e5495eb28d507e952d51091e7ae2a72
    +  7  : d27cc12614b5f4ff85ed109495e320fb1e5495eb28d507e952d51091e7ae2a72
    +  8  : 0000000000000000000000000000000000000000000000000000000000000000
    +  9  : 0000000000000000000000000000000000000000000000000000000000000000
    +  10 : 0000000000000000000000000000000000000000000000000000000000000000
    +  11 : 0000000000000000000000000000000000000000000000000000000000000000
    +  12 : 0000000000000000000000000000000000000000000000000000000000000000
    +  13 : 0000000000000000000000000000000000000000000000000000000000000000
    +  14 : 0000000000000000000000000000000000000000000000000000000000000000
    +  15 : 0000000000000000000000000000000000000000000000000000000000000000
    +  16 : 0000000000000000000000000000000000000000000000000000000000000000
    +  17 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    +  18 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    +  19 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    +  20 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    +  21 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    +  22 : ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
    +  23 : 0000000000000000000000000000000000000000000000000000000000000000
    +
    +

    Output example for TPM1.2:

    +
    PCR-00: B3 F3 60 E1 D5 1F 82 D4 62 E6 B9 69 92 2F 65 F4 9F 1A 5F 8E
    +PCR-01: 21 9F 1F 4A C1 AD AD 4D F1 8B 9F AB 98 23 68 B1 73 A6 32 87
    +PCR-02: 40 CF E3 DC A7 FF 67 FB AA BB 20 85 A4 39 43 D8 54 A7 AB 98
    +PCR-03: E3 E7 E6 89 CA FB F5 75 38 95 D0 CD 83 96 F6 0C 38 04 DC D5
    +PCR-04: 01 7A 3D E8 2F 4A 1B 77 FC 33 A9 03 FE F6 AD 27 EE 92 BE 04
    +PCR-05: 93 6A 12 98 07 73 85 9D 91 27 61 82 E7 11 C5 1D 08 98 C4 28
    +PCR-06: 3A 3F 78 0F 11 A4 B4 99 69 FC AA 80 CD 6E 39 57 C3 3B 22 75
    +PCR-07: 3A 3F 78 0F 11 A4 B4 99 69 FC AA 80 CD 6E 39 57 C3 3B 22 75
    +PCR-08: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    +PCR-09: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    +PCR-10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    +PCR-11: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    +PCR-12: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    +PCR-13: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    +PCR-14: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    +PCR-15: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    +PCR-16: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    +PCR-17: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    +PCR-18: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    +PCR-19: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    +PCR-20: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    +PCR-21: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    +PCR-22: FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    +PCR-23: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    +
    +

    TPM001.003 TPM Support (Windows 11)

    +

    Test description

    +

    This test aims to verify that the TPM is initialized correctly and the PCRs can +be accessed from the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a PowerShell as administrator and run the following command:

      +
      get-tpm
      +
      +
    8. +
    +

    Expected result

    +

    The command should return information about the TPM state: if the TPM is +present, ready and enabled:

    +
    TpmPresent     : True
    +TpmReady       : True
    +TpmEnabled     : True
    +
    +

    TPM002.001 Verify TPM version (firmware)

    +

    Test description

    +

    This test aims to verify that the TPM version is correctly recognized by the +firmware.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the BIOS.
    4. +
    5. Enter the shell.
    6. +
    7. +

      Run the following command in the shell:

      +
      cbmem -L
      +
      +
    8. +
    +

    Expected result

    +

    The output of the command should contain information about the TPM version.

    +

    Example output:

    +
    TPM2 log:
    +    Specification: 2.00
    +
    +

    TPM002.002 Verify TPM version (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the TPM version is correctly recognized by the +operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Check the version of installed tpm2-tools - execute the following command + in the terminal:

      +
      dmesg | grep -i tpm
      +
      +
    8. +
    +

    Expected result

    +

    The command should return information about the TPM version.

    +

    Example output:

    +
    tpm_tis 00:07: 1.2 TPM (device-id 0x0, rev-id 78)
    +
    +

    TPM002.003 Verify TPM version (Windows 11)

    +

    Test description

    +

    This test aims to verify that the TPM version is correctly recognized by the +operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a PowerShell as administrator and run the following command:

      +
      wmic /namespace:\\root\cimv2\security\microsofttpm path win32_tpm get * /format:textvaluelist.xsl
      +
      +
    8. +
    +

    Expected result

    +

    The command should return information about the TPM version.

    +

    Example output:

    +
    SpecVersion=2.0
    +
    +

    TPM003.001 Check TPM Physical Presence Interface (firmware)

    +

    Test description

    +

    This test aims to verify that the TPM Physical Presence Interface is supported +by the firmware.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    5. Download cbmem from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd + to the DUT.
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open the terminal and run the following command and note results:

      +
      sudo cbmem -1 |grep PPI
      +
      +
    8. +
    +

    Expected result

    +

    The cbmem.log should contain the following lines (the hex numbers may be +different per platform):

    +
    [DEBUG]  PPI: Pending OS request: 0x0 (0x0)
    +[DEBUG]  PPI: OS response: CMD 0x39073907 = 0x0
    +[DEBUG]    TPM PPI     8. 0x76ffe620 0x0000015a
    +
    +

    If the above lines are present, the firmware supports TPM PPI.

    +

    TPM003.002 Check TPM Physical Presence Interface (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the TPM Physical Presence Interface is correctly +recognized by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    5. Platform with TPM 2.0 module present.
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open the terminal and run the following command to check the version of TPM + PPI in sysfs:

      +
      cat /sys/class/tpm/tpm0/ppi/version
      +
      +
    8. +
    +

    Expected result

    +

    The command should return information about the TPM PPI version (only 1.3 is +valid). If PPI is not available the file will not be found and test fails.

    +

    Example output:

    +
    $ cat /sys/class/tpm/tpm0/ppi/version
    +1.3
    +
    +

    TPM003.003 Check TPM Physical Presence Interface (Windows 11)

    +

    Test description

    +

    This test aims to verify that the TPM Physical Presence Interface is correctly +recognized by the operating system.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    5. Platform with TPM 2.0 module present.
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a PowerShell as administrator and run the following command:

      +
      tpmtool getdeviceinformation
      +
      +
    8. +
    +

    Expected result

    +

    The command should return information about the TPM PPI version (only 1.3 is +valid). If PPI is not available on the list, test fails.

    +

    Example output:

    +
    tpmtool getdeviceinformation
    +
    +-TPM Present: True
    +-TPM Version: 2.0
    +-TPM Manufacturer ID: INTC
    +-TPM Manufacturer Full Name: Intel
    +-TPM Manufacturer Version: 600.18.0.0
    +-PPI Version: 1.3
    +-Is Initialized: True
    +-Ready For Storage: True
    +-Ready For Attestation: True
    +-Is Capable For Attestation: True
    +-Clear Needed To Recover: False
    +-Clear Possible: True
    +-TPM Has Vulnerable Firmware: False
    +-Maintenance Task Complete: True
    +-Bitlocker PCR7 Binding State: Binding Not Possible
    +-TPM Spec Version: 1.38
    +-TPM Errata Date: Wednesday, December 18, 2019
    +-PC Client Version: 1.04
    +-Lockout Information:
    +    -Is Locked Out: False
    +    -Lockout Counter: 0
    +    -Max Auth Fail: 32
    +    -Lockout Interval: 7200s
    +    -Lockout Recovery: 86400s
    +
    +

    TPM003.004 Change active PCR banks with TPM PPI (firmware)

    +

    Test description

    +

    This test aims to verify that the TPM Physical Presence Interface is working +properly in the firmware by changing active TPM PCR banks.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. Platform with TPM 2.0 module present.
    4. +
    5. TPM003.001 indicating that TPM PPI is supported.
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the firmware setup using the BIOS_SETUP_KEY.
    4. +
    5. Enter the Device Manager -> TCG2 Configuration.
    6. +
    7. Scroll down to the bottom of the page using arrow down key.
    8. +
    9. Switch active PCR banks depending on the currently active banks.:
    10. +
    11. if both SHA1 and SHA256 are active, deactivate SHA1
    12. +
    13. if SHA1 only is active, activate SHA256 and deactivate SHA1
    14. +
    15. if SHA256 only is active, activate SHA1 and deactivate SHA256
    16. +
    17. Press F10 to save and go back to the main setup page using ESC key.
    18. +
    19. Use the Reset option on the main setup page to reboot the DUT.
    20. +
    21. After reset a prompt should appear explaining a TPM state change request has + been made. Press F12 as instructed to apply changes. The DUT will need to + reboot again.
    22. +
    23. After the reboot enter the Device Manager -> TCG2 Configuration again.
    24. +
    25. Scroll down to the bottom of the page using arrow down key.
    26. +
    27. Verify the active PCR banks were changed according to the choice made in + step 5.
    28. +
    +

    NOTE: Certain TPMs like Intel PTT (fTPM) do not allow to set more than one +active PCR bank at a given time, that is why the test case keeps only one bank +active. Discrete TPMs may have multiple banks enabled simultaneously, but it is +TPM module and TPM firmware dependent.

    +

    Expected result

    +
      +
    1. The prompt appears at step 8.
    2. +
    3. The requested changes are applied as verified in step 11.
    4. +
    +

    The prompt seen on the DUT screen has the following format (example change from +SHA256 to SHA1):

    +
    A configuration change was requested to PCR bank(s) of this computer's TPM
    +(Trusted Platform Module)
    +
    +WARNING: Changing the PCR bank(s) of the boot measurements may prevent the
    +Operating System from properly processing the measurements. Please check if
    +your Operating System supports the new PCR bank(s).
    +
    +WARNING: Secrets in the TPM that are bound to the boot state of your machine
    +may become unusable.
    +
    +Current PCRBanks is 0x2. (SHA256)
    +New PCRBanks is 0x1. (SHA1)
    +
    +Press F12 change the boot measurements to use PCR bank(s) of the TPM
    +Press ESC to reject this change request and continue
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/201-verified-boot/index.html b/unified-test-documentation/dasharo-security/201-verified-boot/index.html new file mode 100644 index 00000000000..d107ee07287 --- /dev/null +++ b/unified-test-documentation/dasharo-security/201-verified-boot/index.html @@ -0,0 +1,6489 @@ + + + + + + + + + + + + + + + + + + Verified Boot - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Security: Verified Boot support

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    +

    VBO001.001 Generating keys for Verified Boot

    +

    Test description

    +

    This test aims to verify whether there is a possibility to generate vboot keys +for signing the firmware.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Based on the dedicated documentation + generate the keys.
    8. +
    9. Check if the keys, after finishing the generating process, are available in + the keys subdirectory.
    10. +
    +

    Expected result

    +

    The keys location should contain the generated keys.

    +

    VBO002.001 Signing image without rebuild

    +

    Test description

    +

    This test aims to verify whether there is a possibility to sign the firmware +image with generated keys without rebuilding.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Localize the keys, which were generated in the VBO001.001 test case.
    8. +
    9. Based on the + dedicated documentation + sign the firmware image with the keys without rebuilding.
    10. +
    11. Note the result.
    12. +
    +

    Expected result

    +

    The output of the last command should contain information that resigning +procedure was successful.

    +

    Example output:

    +
    ...
    +INFO: sign_bios_at_end: BIOS image does not have FW_MAIN_B. Signing only FW_MAIN_A
    + - import root_key from /.../keys/root_key.vbpubk: success
    + - import recovery_key from /.../keys/recovery_key.vbpubk: success
    +successfully saved new image to: /.../protectli_vault_cml_v1.0.16_resigned.rom
    +The /.../protectli_vault_cml_v1.0.16.rom was resigned and saved as: /.../protectli_vault_cml_v1.0.16_resigned.rom
    +
    +

    VBO003.001 Flashing device with the signed firmware

    +

    Test description

    +

    This test aims to verify whether there is a possibility to flash the locally +signed firmware to the DUT.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Localize the firmware, which was signed in the VBO002.001 test case.
    8. +
    9. +

      Flash the firmware by using the internal programmer and flashrom tool. If + DUT is already flashed with the Dasharo firmware, the following command + should be used:

      +
      flashrom -p internal -w [path-to-binary] --fmap -i RW_SECTION_A
      +
      +

      Otherwise, the following command should be used:

      +
      flashrom -p internal -w [path-to-binary] --ifd -i bios
      +
      +
    10. +
    11. +

      Reboot the DUT. and note the results.

      +
    12. +
    +

    Expected result

    +

    The DUT reboots properly without issues related to firmware signing.

    +

    VBO004.001 Adding keys and building image

    +

    Test description

    +

    This test aims to verify whether there is a possibility to build firmware +on the local machine, based on Build manual procedure dedicated to the +platform and sign it with the locally generated keys.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Make yourself familiar with Building manual procedure dedicated for + the relevant platform: +
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Localize the keys, which were generated in the VBO001.001 test case.
    8. +
    9. Based on the + dedicated documentation + add locally generated keys to the coreboot config.
    10. +
    11. Based on the dedicated documentation build firmware.
    12. +
    13. Check if the binary file, after finishing the building process, is available + in the build subdirectory.
    14. +
    +

    Expected result

    +

    The build location should contain the binary file, which size is equal to the +flash chip size.

    +

    VBO005.001 Flashing device with built firmware

    +

    Test description

    +

    This test aims to verify it is possible to flash and boot DUT with signed +firmware image.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Localize the firmware, which was built in the VBO004.001 test case.
    8. +
    9. +

      Flash the firmware by using the internal programmer and flashrom tool. If + DUT is already flashed with the Dasharo firmware, the following command + should be used:

      +
      flashrom -p internal -w [path-to-binary] --fmap -i RW_SECTION_A
      +
      +

      Otherwise, the following command should be used:

      +
      flashrom -p internal -w [path-to-binary] --ifd -i bios
      +
      +
    10. +
    11. +

      Reboot the DUT. and note the results.

      +
    12. +
    +

    Expected result

    +

    The DUT reboots properly without issues related to firmware signing.

    +

    VBO006.001 Verified boot support (firmware)

    +

    Test description

    +

    Verified Boot is a method of verifying that the firmware components come from a +trusted source. This test aims to confirm that verified boot is enabled and +functional.

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Disable Secure Boot.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Read coreboot loading logs.
    4. +
    +

    Expected result

    +

    The logs should indicate that vboot is enabled and verstage has been entered:

    +
    VBOOT: Loading verstage.
    +
    +

    VBO006.002 Verified boot support (Ubuntu 22.04)

    +

    Test description

    +

    Verified Boot is a method of verifying that the firmware components come from a +trusted source. This test aims to confirm that verified boot is enabled and +functional.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd + to the DUT.
    4. +
    5. Disable Secure Boot.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following command:
    8. +
    +
    sudo ./cbmem -c | grep VBOOT
    +
    +

    Expected result

    +

    The output of the command should indicate that vboot is enabled and verstage +has been entered:

    +
    VBOOT: Loading verstage.
    +TPM: Extending digest for VBOOT: boot mode into PCR 0
    +TPM: Extending digest for VBOOT: GBB HWID into PCR 1
    +VBOOT WORK  8. 0x76c05000 0x00014000
    +PCR-0 2547cc736e951fa4919853c43ae890861a3b3264000000000000000000000000 SHA256 [VBOOT: boot mode]
    +PCR-1 e3324765a25f8a59c7c20cc35c1c33a8ab384159d2b40a269246b0b4491cdf89 SHA256 [VBOOT: GBB HWID]
    +
    +

    VBO007.001 Verified boot: Booting from Slot A (firmware)

    +

    Test description

    +

    If the signatures for firmware stored in vboot Slot A are correct, vboot should +proceed to boot from Slot A.

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Disable Secure Boot.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Read coreboot loading logs.
    4. +
    +

    Expected result

    +

    The logs should indicate that vboot has chosen to boot from slot A:

    +
    Slot A is selected
    +
    +

    VBO007.002 Verified boot: Booting from Slot A (Ubuntu 22.04)

    +

    Test description

    +

    If the signatures for firmware stored in vboot Slot A are correct, vboot should +proceed to boot from Slot A.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd + to the DUT.
    4. +
    5. Disable Secure Boot.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following command:
    8. +
    +
    sudo ./cbmem -c | grep "Slot A"
    +
    +

    Expected result

    +

    The output of the command should indicate that vboot has chosen to boot from +slot A:

    +
    Slot A is selected
    +
    +

    VBO008.001 Verified boot: Booting from Recovery (Ubuntu 22.04)

    +

    Test description

    +

    If the signatures for firmware stored in vboot Slot A are incorrect, vboot +should revert to booting from the recovery slot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd + to the DUT.
    4. +
    5. Disable Secure Boot.
    6. +
    7. Obtain coreboot binary + signed with wrong vboot keys.
    8. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Flash coreboot signed with wrong vboot keys by executing the following +command:

      +
      flashrom -p internal --fmap -i RW_SECTION_A -w [coreboot binary]
      +
      +
    8. +
    9. +

      Power off the DUT

      +
    10. +
    11. Connect to the DUT using the serial port.
    12. +
    13. Power on the DUT
    14. +
    15. Boot into the system.
    16. +
    17. Log into the system by using the proper login and password.
    18. +
    19. +

      Open a terminal window and execute the following command:

      +
      sudo ./cbmem -c | grep -i recovery
      +
      +
    20. +
    21. +

      If booting into the system is impossible, read coreboot loading logs.

      +
    22. +
    +

    Expected result

    +

    The logs should indicate that vboot has chosen to boot from the recovery slot.

    +

    Example:

    +
    VB2:vb2_check_recovery() Recovery reason from previous boot: 0x3 / 0x3
    +VB2:vb2_check_recovery() We have a recovery request: 0x3 / 0x0
    +Recovery requested (1009000e)
    +
    +

    VBO009.001 Recovery boot popup (firmware)

    +

    Test description

    +

    This test aims to verify whether the recovery mode information is displayed +as the popup after rebooting the DUT which is flashed with the firmware with +the wrong vboot keys.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Disable Secure Boot.
    4. +
    5. Obtain coreboot binary signed with wrong vboot keys.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Flash coreboot signed with wrong vboot keys by executing the following +command:

      +
      flashrom -p internal --fmap -i RW_SECTION_A -w [coreboot binary]
      +
      +
    8. +
    9. +

      Reboot the DUT.

      +
    10. +
    11. Wait for the popup to appear.
    12. +
    +

    Expected result

    +

    Popup with information about recovery mode should be displayed.

    +

    VBO010.001 Recovery boot popup confirmation (firmware)

    +

    Test description

    +

    This test aims to verify whether the recovery popup might be confirmed which +allows to proceed to the next booting stages.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Disable Secure Boot.
    4. +
    5. Obtain coreboot binary signed with wrong vboot keys.
    6. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Flash coreboot signed with wrong vboot keys by executing the following +command:

      +
      flashrom -p internal --fmap -i RW_SECTION_A -w [coreboot binary]
      +
      +
    8. +
    9. +

      Reboot the DUT.

      +
    10. +
    11. Wait for the popup to appear.
    12. +
    13. Press ENTER.
    14. +
    +

    Expected result

    +

    After pressing ENTER the DUT should immediately move to the next stages of +booting.

    +

    VBO011.001 Booting after flashing with valid binary (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify whether after flashing the DUT with the valid binary, +the DUT will boot correctly from the default slot and no recovery popup will be +displayed.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Download cbmem and flashrom from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd + to the DUT.
    4. +
    5. Disable Secure Boot.
    6. +
    7. Slot A is flashed with an binary with wrong-signed vboot keys.
    8. +
    9. Obtain the correct coreboot binary appropriate for the DUT.
    10. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Flash firmware with valid binary by executing the following command:

      +
      flashrom -p internal --fmap -i RW_SECTION_A -w [coreboot binary]
      +
      +
    8. +
    9. +

      Reboot the DUT.

      +
    10. +
    11. Boot into the system.
    12. +
    13. Log into the system by using the proper login and password.
    14. +
    15. +

      Open a terminal window and execute the following command:

      +
      sudo ./cbmem -c | grep -i recovery
      +
      +
    16. +
    +

    Expected result

    +
      +
    1. Popup with information about recovery mode should not be displayed.
    2. +
    3. +

      The logs should indicate that vboot hasn't chosen to boot from the recovery + slot. Example output:

      +
      VB2:vb2_check_recovery() Recovery reason from previous boot: 0x0 / 0x0
      +
      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/203-measured-boot/index.html b/unified-test-documentation/dasharo-security/203-measured-boot/index.html new file mode 100644 index 00000000000..8b28e51d3d4 --- /dev/null +++ b/unified-test-documentation/dasharo-security/203-measured-boot/index.html @@ -0,0 +1,5911 @@ + + + + + + + + + + + + + + + + + + Measured Boot - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Security: Measured Boot support

    +

    MBO001.001 Measured Boot support (Ubuntu 22.04)

    +

    Test description

    +

    Measured Boot is a method for detecting changes to the firmware by storing +hashes of each firmware component in the TPM PCR registers. If a PCR changes +value across reboots, a change to the firmware has been made. This test aims to +verify that Measured Boot is functional and that measurements are stored in the +TPM.a.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Download cbmem from the + cloud to the DUT.
    10. +
    11. Disable Secure Boot.
    12. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Open a terminal window and execute the following command:
    8. +
    +
    sudo ./cbmem -c | grep -i PCR
    +
    +

    Expected result

    +
      +
    1. +

      The output of the command should indicate that measurements of the coreboot + components have been made.

      +

      Example output:

      +
      TPM: Extending digest for `VBOOT: boot mode` into PCR 0
      +TPM: Digest of `VBOOT: boot mode` to PCR 0 measured
      +TPM: Extending digest for `VBOOT: GBB HWID` into PCR 1
      +TPM: Digest of `VBOOT: GBB HWID` to PCR 1 measured
      +TPM: Extending digest for `FMAP: FMAP` into PCR 2
      +TPM: Digest of `FMAP: FMAP` to PCR 2 measured
      +TPM: Extending digest for `CBFS: bootblock` into PCR 2
      +TPM: Digest of `CBFS: bootblock` to PCR 2 measured
      +TPM: Extending digest for `CBFS: fallback/romstage` into PCR 2
      +TPM: Digest of `CBFS: fallback/romstage` to PCR 2 measured
      +TPM: Extending digest for `CBFS: fspm.bin` into PCR 2
      +TPM: Digest of `CBFS: fspm.bin` to PCR 2 measured
      +TPM: Extending digest for `CBFS: fallback/postcar` into PCR 2
      +TPM: Digest of `CBFS: fallback/postcar` to PCR 2 measured
      +TPM: Extending digest for `CBFS: fallback/ramstage` into PCR 2
      +TPM: Digest of `CBFS: fallback/ramstage` to PCR 2 measured
      +...
      +
      +
    2. +
    3. +

      The output shouldn't contain the following message:

      +
      TPM: Extending hash into PCR failed.
      +
      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/206-secure-boot/index.html b/unified-test-documentation/dasharo-security/206-secure-boot/index.html new file mode 100644 index 00000000000..a794ad8730d --- /dev/null +++ b/unified-test-documentation/dasharo-security/206-secure-boot/index.html @@ -0,0 +1,6401 @@ + + + + + + + + + + + + + + + + + + Secure Boot - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Security: UEFI Secure Boot

    +

    SBO001.001 Check Secure Boot default state (firmware)

    +

    Test description

    +

    Secure Boot is a verification mechanism for ensuring that code launched by +firmware is trusted. This test aims to verify that the Secure Boot state after +flashing the platform with the Dasharo firmware is correct.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Device Manager menu using the arrow keys and Enter.
    6. +
    7. Enter the Secure Boot Configuration submenu.
    8. +
    9. Verify the Current Secure Boot State field.
    10. +
    +

    Expected result

    +

    The Secure Boot State field should inform that the current state of +Secure Boot is Disabled.

    +

    SBO002.001 UEFI Secure Boot (Ubuntu 22.04)

    +

    Test description

    +

    This test verifies that Secure Boot can be enabled from the boot menu and, after +the DUT reset, it is seen from the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Secure Boot Configuration + to enable the Attempt Secure Boot option in the + Secure Boot Configuration menu.
    8. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Device Manager menu using the arrow keys and Enter.
    6. +
    7. Enter the Secure Boot Configuration submenu.
    8. +
    9. Verify that the Current Secure Boot State field says Enabled - if not, + select the Attempt Secure Boot option below.
    10. +
    11. Go back to the main menu using the ESC key.
    12. +
    13. Select the Reset option to apply the settings and reboot.
    14. +
    15. The DUT will now attempt to boot OPERATING_SYSTEM with Secure Boot enabled.
    16. +
    17. Log into the system by using the proper login and password.
    18. +
    19. +

      Open a terminal window and run the following command:

      +
      sudo dmesg | grep secureboot
      +
      +
    20. +
    21. +

      Note the results.

      +
    22. +
    +

    Expected result

    +

    The output of the command should contain the line:

    +
    secureboot: Secure boot enabled
    +
    +

    SBO002.002 UEFI Secure Boot (Windows 11)

    +

    Test description

    +

    This test verifies that Secure Boot can be enabled from the boot menu and, after +the DUT reset, it is seen from the OS.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Windows 11
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Secure Boot Configuration + to enable the Attempt Secure Boot option in the + Secure Boot Configuration menu.
    8. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Device Manager menu using the arrow keys and Enter.
    6. +
    7. Enter the Secure Boot Configuration submenu.
    8. +
    9. Verify that the Current Secure Boot State field says Enabled - if not, + select the Attempt Secure Boot option below.
    10. +
    11. Go back to the main menu using the ESC key.
    12. +
    13. Select the Reset option to apply the settings and reboot.
    14. +
    15. The DUT will now attempt to boot OPERATING_SYSTEM with Secure Boot enabled.
    16. +
    17. Log into the system by using the proper login and password.
    18. +
    19. +

      Open Powershell as administrator and run the following command:

      +
      Confirm-SecureBootUEFI
      +
      +
    20. +
    21. +

      Note the results.

      +
    22. +
    +

    Expected result

    +

    The output of the command should return the information, that Secure Boot is +enabled:

    +
    True
    +
    +

    SBO003.001 Attempt to boot file with the correct key from Shell (firmware)

    +

    Test description

    +

    This test verifies that Secure Boot allows booting a signed file with a correct +key.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. Additional USB storage - at least 1GB - for keeping files for booting
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Download the signed with the correct key file from the + cloud.
    2. +
    3. Download the certificate from the + cloud.
    4. +
    5. Place the certificate and the file on the USB storage.
    6. +
    7. Plug the USB storage into DUT.
    8. +
    9. Power on the DUT.
    10. +
    11. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    12. +
    13. Enter the Device Manager menu using the arrow keys and Enter.
    14. +
    15. Enter the Secure Boot Configuration submenu.
    16. +
    17. Set the Secure Boot Mode field to Custom Mode.
    18. +
    19. Select options in the given order: Custom Secure Boot Options -> + DB Options -> Enroll Signature -> Enroll Signature Using File
    20. +
    21. Select the certificate from the USB storage.
    22. +
    23. Select the Commit Changes and Exit option.
    24. +
    25. Press ESC until the setup menu.
    26. +
    27. Select the Reset option.
    28. +
    29. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu.
    30. +
    31. Select the UEFI Shell option using the arrow keys and press Enter.
    32. +
    33. +

      In the shell open the USB storage by executing the following command:

      +
      FS0:
      +
      +
      +

      One of the filesystems in the FS list will be the USB storage - typically +FS0:

      +
      +
    34. +
    35. +

      Boot the previously prepared file by typing its full name:

      +
      hello-valid-keys.efi
      +
      +
    36. +
    +

    Expected result

    +
      +
    1. File boots correctly (no information: Command Error Status: Access Denied + on the output).
    2. +
    3. The output of the command shows file content.
    4. +
    +

    Example output:

    +
    Hello, world!
    +
    +

    SBO004.001 Attempt to boot file without the key from Shell (firmware)

    +

    Test description

    +

    This test verifies that Secure Boot blocks booting a file without a key.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. Additional USB storage - at least 1GB - for keeping files for booting
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Download the not signed file from the + cloud.
    2. +
    3. Place the file on the USB storage.
    4. +
    5. Plug the USB storage into DUT.
    6. +
    7. Power on the DUT.
    8. +
    9. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu.
    10. +
    11. Select the UEFI Shell option using the arrow keys and press Enter.
    12. +
    13. +

      In the shell open the USB storage by executing the following command:

      +
      FS0:
      +
      +
      +

      One of the filesystems in the FS list will be the USB storage - typically +FS0:

      +
      +
    14. +
    15. +

      Boot the previously prepared file by typing its full name:

      +
      hello.efi
      +
      +
    16. +
    +

    Expected result

    +

    The output of the command doesn't show file content and information about access +denied is displayed.

    +

    Example output:

    +
    Command Error Status: Access Denied
    +
    +

    SBO005.001 Attempt to boot file with the wrong-signed key from Shell (firmware)

    +

    Test description

    +

    This test verifies that Secure Boot blocks booting a file with the wrong-signed +key.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. Additional USB storage - at least 1GB - for keeping files for booting
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Download the signed with the incorrect key file from the + cloud.
    2. +
    3. Place the file on the USB storage.
    4. +
    5. Plug the USB storage into DUT.
    6. +
    7. Power on the DUT.
    8. +
    9. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu.
    10. +
    11. Select the UEFI Shell option using the arrow keys and press Enter.
    12. +
    13. +

      In the shell open the USB storage by executing the following command:

      +
      FS0:
      +
      +
      +

      One of the filesystems in the FS list will be the USB storage - typically +FS0:

      +
      +
    14. +
    15. +

      Boot the previously prepared file by typing its full name:

      +
      hello-bad-keys.efi
      +
      +
    16. +
    +

    Expected result

    +

    The output of the command doesn't show file content and information about access +denied is displayed.

    +

    Example output:

    +
    Command Error Status: Access Denied
    +
    +

    SBO006.001 Reset Secure Boot Keys option availability (firmware)

    +

    Test description

    +

    This test aims to verify, that the Reset Secure Boot Keys option is available +after flashing the platform with the Dasharo firmware.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Device Manager menu using the arrow keys and Enter.
    6. +
    7. Enter the Secure Boot Configuration submenu.
    8. +
    9. Verify the Reset Secure Boot Keys field.
    10. +
    +

    Expected result

    +

    The Reset Secure Boot Keys option should be listed after entering the +Secure Boot Configuration submenu.

    +

    SBO007.001 Attempt to boot the file after restoring keys to default (firmware)

    +

    Test description

    +

    This test verifies that the Reset Secure Boot Keys option works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. Additional USB storage - at least 1GB - for keeping files for booting
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    Test steps

    +
      +
    1. Download the signed with the correct key file from the + cloud.
    2. +
    3. Download the certificate from the + cloud.
    4. +
    5. Place the certificate and the file on the USB storage.
    6. +
    7. Plug the USB storage into DUT.
    8. +
    9. Power on the DUT.
    10. +
    11. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    12. +
    13. Enter the Device Manager menu using the arrow keys and Enter.
    14. +
    15. Enter the Secure Boot Configuration submenu.
    16. +
    17. Set the Secure Boot Mode field to Custom Mode.
    18. +
    19. Select options in the given order: Custom Secure Boot Options -> + DB Options -> Enroll Signature -> Enroll Signature Using File
    20. +
    21. Select the certificate from the USB storage.
    22. +
    23. Select the Commit Changes and Exit option.
    24. +
    25. Press ESC until the setup menu.
    26. +
    27. Select the Reset option.
    28. +
    29. While the DUT is booting, hold the BOOT_MENU_KEY to enter the boot menu.
    30. +
    31. Select the UEFI Shell option using the arrow keys and press Enter.
    32. +
    33. +

      In the shell open the USB storage by executing the following command:

      +
      FS0:
      +
      +
      +

      One of the filesystems in the FS list will be the USB storage - typically +FS0:

      +
      +
    34. +
    35. +

      Boot the previously prepared file by typing its full name:

      +
      hello-valid-keys.efi
      +
      +
    36. +
    37. +

      Exit the shell by executing the following command:

      +
      exit
      +
      +
    38. +
    39. +

      Press ESC until the setup menu.

      +
    40. +
    41. Enter the Device Manager menu using the arrow keys and Enter.
    42. +
    43. Enter the Secure Boot Configuration submenu.
    44. +
    45. Select the Reset Secure Boot Keys option using the arrow keys and Enter.
    46. +
    47. If necessary - press Y to confirm saving the changes.
    48. +
    49. Press ESC until the setup menu.
    50. +
    51. Select the Reset option to apply the settings and reboot.
    52. +
    53. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    54. +
    55. Enter the Device Manager menu using the arrow keys and Enter.
    56. +
    57. Enter the Secure Boot Configuration submenu.
    58. +
    59. Verify that the Current Secure Boot State field says Enabled.
    60. +
    61. Press ESC until the setup menu.
    62. +
    63. Select the One Time Boot menu using the arrow keys and Enter.
    64. +
    65. Select the UEFI Shell option using the arrow keys and press Enter.
    66. +
    67. +

      In the shell open the USB storage by executing the following command:

      +
      FS0:
      +
      +
      +

      One of the filesystems in the FS list will be the USB storage - typically +FS0:

      +
      +
    68. +
    69. +

      Boot the previously prepared file by typing its full name:

      +
      hello-valid-keys.efi
      +
      +
    70. +
    +

    Expected result

    +
      +
    1. +

      The first attempt to run the hello-valid-keys.efi script:

      +
        +
      1. File boots correctly (no information: + Command Error Status: Access Denied on the output).
      2. +
      3. +

        The output of the command shows file content.

        +

        Example output:

        +
        Hello, world!
        +
        +
      4. +
      +
    2. +
    3. +

      The second attempt to run the hello-valid-keys.efi script:

      +
        +
      1. +

        The output of the command doesn't show file content and information about + access denied is displayed.

        +

        Example output:

        +
        Command Error Status: Access Denied
        +
        +
      2. +
      +
    4. +
    5. +

      After selecting the Reset Secure Boot Keys option, the Secure boot state + should be automatically enabled.

      +
    6. +
    +

    SBO008.001 Attempt to enroll the key in the incorrect format (firmware)

    +

    Test description

    +

    This test verifies that Secure Boot doesn't allow enrolling keys in the +incorrect format.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Additional USB storage - at least 1GB - for keeping files for booting
    4. +
    +

    Test steps

    +
      +
    1. Place the file with the .txt extension on the USB storage.
    2. +
    3. Plug the USB storage into DUT.
    4. +
    5. Power on the DUT.
    6. +
    7. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    8. +
    9. Enter the Device Manager menu using the arrow keys and Enter.
    10. +
    11. Enter the Secure Boot Configuration submenu.
    12. +
    13. Set the Secure Boot Mode field to Custom Mode.
    14. +
    15. Select options in the given order: Custom Secure Boot Options -> + DB Options -> Enroll Signature -> Enroll Signature Using File
    16. +
    17. Select the file with the .txt extension from the USB storage.
    18. +
    19. Select the Commit Changes and Exit option.
    20. +
    +

    Expected result

    +

    The popup with information about ERROR: Unsupported file type! should appear.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/207-boot-guard-support/index.html b/unified-test-documentation/dasharo-security/207-boot-guard-support/index.html new file mode 100644 index 00000000000..e6275698c9d --- /dev/null +++ b/unified-test-documentation/dasharo-security/207-boot-guard-support/index.html @@ -0,0 +1,5929 @@ + + + + + + + + + + + + + + + + + + Boot Guard support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Security: Boot Guard support

    +

    BGS001.001 Boot Guard support (Ubuntu 22.04)

    +

    Test description

    +

    Intel Boot Guard is a hardware-based technology intended to protect the device +against executing non-genuine firmware, which could happen when a possible +attacker has bypassed protection against modification of BIOS. This test aims +to verify that the implemented Boot Guard mechanism works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Download cbmem from the + cloud to the DUT.
    10. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and execute the following command:

      +
      sudo ./cbmem -1 | grep CBnT
      +
      +
    8. +
    9. +

      Analyze the output from the command.

      +
    10. +
    +

    Expected result

    +

    The output of the command should indicate the state of the Boot Guard.

    +

    Example output:

    +
    CBnT: SACM INFO MSR (0x13A) raw: 0x000000130000007d
    +CBnT:   NEM status:                 1
    +CBnT:   TPM type:                   TPM 2.0
    +CBnT:   TPM success:                1
    +CBnT:   FACB:                       1
    +CBnT:   measured boot:              1
    +CBnT:   verified boot:              1
    +CBnT:   revoked:                    0
    +CBnT:   BtG capable:                1
    +CBnT:   Server TXT capable:         0
    +CBnT: BOOTSTATUS (0xA0) raw: 0x1840000080000000
    +CBnT:   TXT startup success:        0
    +CBnT:   BtG startup success:        1
    +CBnT:   Block boot enabled:         0
    +CBnT:   PFR startup success:        0
    +CBnT:   Memory power down executed: 0
    +CBnT:   BtG thread sync failed:     0
    +CBnT:   Bios trusted:               1
    +CBnT:   TXT disabled by policy:     1
    +CBnT:   Bootguard startup error:    0
    +CBnT:   TXT ucode or ACM error:     0
    +CBnT:   S-ACM success:              0
    +CBnT: ERRORCODE (0x30) raw: 0x00000000
    +CBnT: TXT disabled in Policy
    +CBnT: BIOSACM_ERRORCODE (0x328) raw: 0xc000acf0
    +CBnT: BIOSACM_ERRORCODE: TXT ucode or ACM error
    +CBnT:   AC Module Type:          BIOS ACM Error
    +CBnT:   class:                   0xf
    +CBnT:   major:                   0xb
    +CBnT:   External:                0x1
    +
    +

    During the analyzing process, the main thing is to pay attention to the +following:

    +
      +
    1. The field NEM status should have the value 1.
    2. +
    3. If the Boot Guard profile is 4 or 5, the field FACB should have the value + 1.
    4. +
    5. If the Boot Guard profile is 3 or 5, the fields measured boot and + verified boot should have the value 1.
    6. +
    7. If TPM is physically mounted on the platform, the TPM type field should + contain information about the type of the mounted TPM; also, in that + situation, field TPM success should have the value 1.
    8. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/20F-me-neuter/index.html b/unified-test-documentation/dasharo-security/20F-me-neuter/index.html new file mode 100644 index 00000000000..cd90bfc4d9a --- /dev/null +++ b/unified-test-documentation/dasharo-security/20F-me-neuter/index.html @@ -0,0 +1,6245 @@ + + + + + + + + + + + + + + + + + + ME neuter/disable - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Security: ME neuter/disable

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    MNE001.001 Check Intel ME version (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Intel ME version might be read on the +Operating System level. The read version should be the same as in the release +notes.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      cat /sys/class/mei/mei0/fw_ver
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    +

    Expected result

    +

    The output of the command should contain information about the Management +Engine Interface firmware version.

    +

    Example output:

    +
    0:16.0.15.1735
    +0:16.0.15.1735
    +0:16.0.15.1723
    +
    +

    Value from the first line, considering the numbers after the colon, should +correspond to the value from the release notes

    +

    MNE002.001 Intel ME mode option is available and has the correct default state

    +

    Test description

    +

    This test aims to verify that the Intel ME mode state after flashing the +platform with the Dasharo firmware is correct.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Intel Management Engine Options submenu.
    8. +
    9. Verify the Intel ME mode field.
    10. +
    +

    Expected result

    +

    The Intel ME mode field should inform that the current state is Enabled.

    +

    MNE003.001 Intel ME mode option Enabled works correctly (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that Intel ME mode option in state Enabled works +correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Intel Management Engine Options submenu.
    8. +
    9. Verify that the Intel ME mode option is state Enabled - if not, using the + arrow keys and Enter, choose option Enabled.
    10. +
    11. Press F10 to save the changes.
    12. +
    13. If necessary - press Y to confirm saving the changes.
    14. +
    15. Go back to the main menu using the ESC key.
    16. +
    17. Select the Reset option to apply the settings and reboot.
    18. +
    19. Boot into the system.
    20. +
    21. Log into the system by using the proper login and password.
    22. +
    23. +

      Open a terminal window and run the following command:

      +
      lspci | grep 00:16.0
      +
      +
    24. +
    25. +

      Note the results.

      +
    26. +
    +

    Expected result

    +

    The output of the command should contain the information about Management Engine +Interface.

    +

    Example output:

    +
    Intel Corporation Comet Lake Management Engine Interface
    +
    +

    MNE004.001 Intel ME mode option Disable (Soft) works correctly (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that Intel ME mode option in state Disable (Soft) +works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Intel Management Engine Options submenu.
    8. +
    9. Verify that the Intel ME mode option is state Disable (Soft) - if not, + using the arrow keys and Enter, choose option Disable (Soft).
    10. +
    11. Press F10 to save the changes.
    12. +
    13. If necessary - press Y to confirm saving the changes.
    14. +
    15. Go back to the main menu using the ESC key.
    16. +
    17. Select the Reset option to apply the settings and reboot.
    18. +
    19. Boot into the system.
    20. +
    21. Log into the system by using the proper login and password.
    22. +
    23. +

      Open a terminal window and run the following command:

      +
      lspci | grep 00:16.0
      +
      +
    24. +
    25. +

      Note the results.

      +
    26. +
    +

    Expected result

    +

    The output of the command shouldn't contain the information about Management +Engine Interface.

    +

    Example of unwanted output:

    +
    Intel Corporation Comet Lake Management Engine Interface
    +
    +

    MNE005.001 Intel ME mode option Disable (HAP) works correctly (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that Intel ME mode option in state Disable (HAP) +works correctly.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Intel Management Engine Options submenu.
    8. +
    9. Verify that the Intel ME mode option is state Disable (HAP) - if not, + using the arrow keys and Enter, choose option Disable (HAP).
    10. +
    11. Press F10 to save the changes.
    12. +
    13. If necessary - press Y to confirm saving the changes.
    14. +
    15. Go back to the main menu using the ESC key.
    16. +
    17. Select the Reset option to apply the settings and reboot.
    18. +
    19. Boot into the system.
    20. +
    21. Log into the system by using the proper login and password.
    22. +
    23. +

      Open a terminal window and run the following command:

      +
      lspci | grep 00:16.0
      +
      +
    24. +
    25. +

      Note the results.

      +
    26. +
    +

    Expected result

    +

    The output of the command shouldn't contain the information about Management +Engine Interface.

    +

    Example of unwanted output:

    +
    Intel Corporation Comet Lake Management Engine Interface
    +
    +

    MNE006.001 PCI Express 5.0 port is functional when ME disabled (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that Intel ME mode option in state Disable (HAP) or +Disable (Soft) does not break the PCIe 5.0 port functionality and the caching +of PCIe 5.0 firmware by Dasharo works.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    5. DUT (Alder Lake or newer) with PCIe 5.0 port and a PCIe device plugged to + the port.
    6. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Intel Management Engine Options submenu.
    8. +
    9. Verify that the Intel ME mode option is in state Disable (HAP) or + Disable (Soft) - if not, using the arrow keys and Enter, choose option + Disable (HAP) or Disable (Soft).
    10. +
    11. Press F10 to save the changes.
    12. +
    13. If necessary - press Y to confirm saving the changes.
    14. +
    15. Go back to the main menu using the ESC key.
    16. +
    17. Select the Reset option to apply the settings and reboot.
    18. +
    19. Boot into the system.
    20. +
    21. Log into the system by using the proper login and password.
    22. +
    23. +

      Open a terminal window and run the following command:

      +
      sudo cbmem -1 > cbmem.log
      +lspci
      +lspci -t
      +
      +
    24. +
    25. +

      Note the results. Repeat all steps to cover both disable methods.

      +
    26. +
    +

    Expected result

    +

    The output of the command should contain the information about PCI Express 5.0 +interface located at PCI 00:01.0. Also the device plugged to the PCI port +00:01.0 should be visible and functional.

    +

    Example of desired output:

    +
    lspci -t
    +-[0000:00]-+-00.0
    +           +-01.0-[01]--+-00.0
    +           |            \-00.1
    +           +-02.0
    +           +-06.0-[02]----00.0
    +           +-14.0
    +           +-14.2
    +           +-17.0
    +           +-1a.0-[03]----00.0
    +           +-1c.0-[04]--
    +           +-1c.2-[05]----00.0
    +           +-1c.4-[06-08]----00.0-[07-08]----00.0-[08]--+-00.0
    +           |                                            \-00.1
    +           +-1d.0-[09]----00.0
    +           +-1f.0
    +           +-1f.3
    +           +-1f.4
    +           \-1f.5
    +
    +
    lspci
    +00:00.0 Host bridge: Intel Corporation Device 4648 (rev 02)
    +00:01.0 PCI bridge: Intel Corporation 12th Gen Core Processor PCI Express x16 Controller #1 (rev 02)
    +00:02.0 Display controller: Intel Corporation AlderLake-S GT1 (rev 0c)
    +00:06.0 PCI bridge: Intel Corporation 12th Gen Core Processor PCI Express x4 Controller #0 (rev 02)
    +00:14.0 USB controller: Intel Corporation Device 7ae0 (rev 11)
    +00:14.2 RAM memory: Intel Corporation Device 7aa7 (rev 11)
    +00:17.0 SATA controller: Intel Corporation Device 7ae2 (rev 11)
    +00:1a.0 PCI bridge: Intel Corporation Device 7ac8 (rev 11)
    +00:1c.0 PCI bridge: Intel Corporation Device 7ab8 (rev 11)
    +00:1c.2 PCI bridge: Intel Corporation Device 7aba (rev 11)
    +00:1c.4 PCI bridge: Intel Corporation Device 7abc (rev 11)
    +00:1d.0 PCI bridge: Intel Corporation Device 7ab0 (rev 11)
    +00:1f.0 ISA bridge: Intel Corporation Device 7a84 (rev 11)
    +00:1f.3 Audio device: Intel Corporation Device 7ad0 (rev 11)
    +00:1f.4 SMBus: Intel Corporation Device 7aa3 (rev 11)
    +00:1f.5 Serial bus controller: Intel Corporation Device 7aa4 (rev 11)
    +01:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] (rev a1)
    +01:00.1 Audio device: NVIDIA Corporation Device 228e (rev a1)
    +02:00.0 Non-Volatile memory controller: Intel Corporation Device f1aa (rev 03)
    +03:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO
    +05:00.0 Ethernet controller: Intel Corporation Ethernet Controller I225-V (rev 03)
    +06:00.0 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] Navi 10 XL Upstream Port of PCI Express Switch (rev c1)
    +07:00.0 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] Navi 10 XL Downstream Port of PCI Express Switch
    +08:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Device 743f (rev c1)
    +08:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Navi 21 HDMI Audio [Radeon RX 6800/6800 XT / 6900 XT]
    +09:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller PM9A1/PM9A3/980PRO
    +
    +

    The device that must be visible and working:

    +
    00:01.0 PCI bridge: Intel Corporation 12th Gen Core Processor PCI Express x16 Controller #1 (rev 02)
    +
    +

    The device behind the port must also be visible, in this example it is:

    +
    01:00.0 VGA compatible controller: NVIDIA Corporation GA106 [GeForce RTX 3060 Lite Hash Rate] (rev a1)
    +01:00.1 Audio device: NVIDIA Corporation Device 228e (rev a1)
    +
    +

    To verify the PCIe 5.0 firmware caching is working, check the cbmem.log for +the following string:

    +
    [INFO ]  Loading HSPHY firmware from cache
    +
    +

    If there are no errors printed nearby concerning the HSPHY, test pass.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/20J-bios-lock-support/index.html b/unified-test-documentation/dasharo-security/20J-bios-lock-support/index.html new file mode 100644 index 00000000000..2b193603ba3 --- /dev/null +++ b/unified-test-documentation/dasharo-security/20J-bios-lock-support/index.html @@ -0,0 +1,5973 @@ + + + + + + + + + + + + + + + + + + BIOS lock support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Security: BIOS lock support

    +

    BLS001.001 BIOS lock support (Ubuntu 22.04)

    +

    Test description

    +

    BIOS lock is a method to prevent a specific region of the firmware from being +flashed. This test aims to verify that, after turning on the mechanism, +the BIOS region should be correctly recognized during attempt to overwrite it +by using flashrom tool.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Disable Secure Boot.
    10. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Dasharo Security Options submenu.
    8. +
    9. Verify that the Lock the BIOS boot medium option is chosen - if not, + press Space and then F10 to save the changes.
    10. +
    11. If necessary - press Y to confirm saving the changes.
    12. +
    13. Go back to the main menu using the ESC key.
    14. +
    15. Select the Reset option to apply the settings and reboot.
    16. +
    17. Boot into the system.
    18. +
    19. Log into the system by using the proper login and password.
    20. +
    21. +

      Execute the following command in the terminal to check platform flashing + conditions:

      +
      flashrom -p internal
      +
      +
    22. +
    23. +

      Note the result.

      +
    24. +
    +

    Expected result

    +

    The output of the flashing command should contain the information, that the +BIOS region is read-only.

    +

    Example output:

    +
    SPI Configuration is locked down.
    +PR0: Warning: 0x00c00000-0x00ffffff is read-only.
    +At least some flash regions are write protected. For write operations,
    +you should use a flash layout and include only writable regions. See
    +manpage for more details.
    +
    +

    BLS002.001 BIOS lock support deactivation (Ubuntu 22.04)

    +

    Test description

    +

    BIOS lock is a method to prevent a specific region of the firmware from being +flashed. This test aims to verify that, after turning off the mechanism, +the BIOS region overwriting operation is available again.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Disable Secure Boot.
    10. +
    11. Obtain any other binary (e.g. vendor firmware or older Dasharo firmware).
    12. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Dasharo Security Options submenu.
    8. +
    9. Verify that the Lock the BIOS boot medium option is not chosen - if so, + press Space and then F10 to save the changes.
    10. +
    11. If necessary - press Y to confirm saving the changes.
    12. +
    13. Go back to the main menu using the ESC key.
    14. +
    15. Select the Reset option to apply the settings and reboot.
    16. +
    17. Boot into the system.
    18. +
    19. Log into the system by using the proper login and password.
    20. +
    21. +

      Execute the following command in the terminal to check platform flashing + conditions:

      +
      flashrom -p internal
      +
      +
    22. +
    23. +

      Note the result.

      +
    24. +
    +

    Expected result

    +

    The output of the flashing command should not contain the information, that +the BIOS region is read-only.

    +

    Example output with unwanted results:

    +
    SPI Configuration is locked down.
    +PR0: Warning: 0x00c00000-0x00ffffff is read-only.
    +At least some flash regions are write protected. For write operations,
    +you should use a flash layout and include only writable regions. See
    +manpage for more details.
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/20L-early-boot-dma-protection/index.html b/unified-test-documentation/dasharo-security/20L-early-boot-dma-protection/index.html new file mode 100644 index 00000000000..315243e6131 --- /dev/null +++ b/unified-test-documentation/dasharo-security/20L-early-boot-dma-protection/index.html @@ -0,0 +1,6007 @@ + + + + + + + + + + + + + + + + + + Early boot DMA protection - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Security: Early Boot DMA Protection

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Disable Secure Boot.
    10. +
    11. Download cbmem from https://cloud.3mdeb.com/index.php/s/zTqkJQdNtJDo5Nd + to the DUT.
    12. +
    +

    EDP001.001 Enable early Boot DMA Protection support

    +

    Test description

    +

    This test aims to verify that the early boot DMA protection might be activated. +If the functionality is enabled, the protection against malicious PCIe devices +DMA transactions by configuring VT-D/IOMMU should be active.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While booting, press the SETUP_MENU_KEY to enter Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Dasharo Security Options submenu.
    8. +
    9. Verify that the Enable early DMA protection field is checked - if not, use + Spacebar to change option settings.
    10. +
    11. Save the changes using F10, and exit from the menu using Esc.
    12. +
    13. Reboot the device.
    14. +
    15. While booting, press BOOT_MENU_KEY to enter Boot Menu.
    16. +
    17. Boot into the system.
    18. +
    19. Log into the system by using the proper login and password.
    20. +
    21. Open a terminal window and execute the following command:
    22. +
    +
    sudo ./cbmem -1
    +
    +
      +
    1. Note the result.
    2. +
    +

    Expected result

    +

    The output of the cbmem utility should contain the information, that the +DMA protection has been set up.

    +

    Example output:

    +
    [DEBUG]  VT-d @ 0xfed91000, version 5.0
    +[INFO ]  Setting DMA protection [0x0 - 0x46c00000]
    +[INFO ]  Setting DMA protection [0x100000000 - 0x00000008afc00000]
    +[INFO ]  Successfully enabled VT-d PMR DMA protection
    +
    +

    Note the memory address ranges in square braces may differ per DUT.

    +

    If the DUT does not support serial redirection, it is also possible to +investigate UEFI Payload logs if VT-d is being used properly. Check for +following output:

    +
    EnableDmar
    +>>>>>>EnableDmar() for engine [0] BAR [0xFED90000]
    +RootEntryTable 0x4518C000
    +EnableDmar: waiting for RTPS bit to be set...
    +Set GCMD_REG bits 0x40000000.
    +EnableDmar: Waiting B_GSTS_REG_TE ...
    +Set GCMD_REG bits 0x80000000.
    +VTD (0) enabled!<<<<<<
    +>>>>>>EnableDmar() for engine [1] BAR [0xFED91000]
    +RootEntryTable 0x44FDD000
    +EnableDmar: waiting for RTPS bit to be set...
    +Set GCMD_REG bits 0x40000000.
    +EnableDmar: Waiting B_GSTS_REG_TE ...
    +Set GCMD_REG bits 0x80000000.
    +VTD (1) enabled!<<<<<<
    +DisablePmr
    +Pmr(0) not enabled
    +Pmr(1) disabled
    +
    +

    The most important are VTD (0) enabled!<<<<<< and VTD (1) enabled!<<<<<<. +Also the following:

    +
    DisablePmr
    +Pmr(0) not enabled
    +Pmr(1) disabled
    +
    +

    Indicate that VT-D engine 1 had PMR enabled earlier, which is expected.

    +

    If all above conditions are met, test pass.

    +

    EDP002.001 Disable early Boot DMA Protection support

    +

    Test description

    +

    This test aims to verify that the early boot DMA protection might be +deactivated. If the functionality is disabled, the protection against malicious +PCIe devices DMA transactions by configuring VT-D/IOMMU should be non-active.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While booting, press the SETUP_MENU_KEY to enter Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Dasharo Security Options submenu.
    8. +
    9. Verify that the Enable early DMA protection option is checked - if so, use + Spacebar to change option settings.
    10. +
    11. Save the changes using F10, and exit from the menu using Esc.
    12. +
    13. Reboot the device.
    14. +
    15. While booting, press BOOT_MENU_KEY to enter Boot Menu.
    16. +
    17. Boot into the system.
    18. +
    19. Log into the system by using the proper login and password.
    20. +
    21. Open a terminal window and execute the following command:
    22. +
    +
    sudo ./cbmem -1
    +
    +
      +
    1. Note the result.
    2. +
    +

    Expected result

    +

    The output of the cbmem utility should not contain the information, that the +DMA protection has been set up.

    +

    Example output with unwanted results:

    +
    [DEBUG]  VT-d @ 0xfed91000, version 5.0
    +[INFO ]  Setting DMA protection [0x0 - 0x46c00000]
    +[INFO ]  Setting DMA protection [0x100000000 - 0x00000008afc00000]
    +[INFO ]  Successfully enabled VT-d PMR DMA protection
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/20O-SMM-bios-write-protection/index.html b/unified-test-documentation/dasharo-security/20O-SMM-bios-write-protection/index.html new file mode 100644 index 00000000000..e1e7fea3d87 --- /dev/null +++ b/unified-test-documentation/dasharo-security/20O-SMM-bios-write-protection/index.html @@ -0,0 +1,5982 @@ + + + + + + + + + + + + + + + + + + SMM BIOS write protection - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Security: SMM BIOS write protection

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Disable Secure Boot.
    10. +
    +

    SMM001.001 SMM BIOS write protection enabling (Ubuntu 22.04)

    +

    Test description

    +

    SMM BIOS write protection is the method to prevent a specific region of the +firmware from being flashed - when enabled allows only SMM code (the privileged +code installed by the firmware in the system memory) to write to BIOS flash. +This test aims to verify that, the SMM BIOS protection option is available in +the Dasharo Security Options and, if the mechanism works correctly - during +the attempt of firmware flashing information about the SMM protection is +returned.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Dasharo Security Options submenu.
    8. +
    9. Verify that the Enable SMM BIOS write protection option is chosen - if not, + press Space and then F10 to save the changes.
    10. +
    11. If necessary - press Y to confirm saving the changes.
    12. +
    13. Go back to the main menu using the ESC key.
    14. +
    15. Select the Reset option to apply the settings and reboot.
    16. +
    17. Boot into the system.
    18. +
    19. Log into the system by using the proper login and password.
    20. +
    21. +

      Execute the following command in the terminal to check platform flashing + conditions:

      +
      flashrom -p internal
      +
      +
    22. +
    23. +

      Note the result.

      +
    24. +
    +

    Expected result

    +

    The output of the flashing command should contain the information, that the +BIOS region SMM protection is enabled.

    +

    Example output:

    +
    Enabling flash write... Warning: BIOS region SMM protection is enabled!
    +
    +

    SMM002.001 SMM BIOS write protection disabling (Ubuntu 22.04)

    +

    Test description

    +

    SMM BIOS write protection is the method to prevent a specific region of the +firmware from being flashed - when enabled allows only SMM code (the privileged +code installed by the firmware in the system memory) to write to BIOS flash. +This test aims to verify that, after disabling the mechanism, information about +SMM protection is not returned any more.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Dasharo Security Options submenu.
    8. +
    9. Verify that the Enable SMM BIOS write protection option is not chosen - if + so, press Space and then F10 to save the changes.
    10. +
    11. If necessary - press Y to confirm saving the changes.
    12. +
    13. Go back to the main menu using the ESC key.
    14. +
    15. Select the Reset option to apply the settings and reboot.
    16. +
    17. Boot into the system.
    18. +
    19. Log into the system by using the proper login and password.
    20. +
    21. +

      Execute the following command in the terminal to check platform flashing + conditions:

      +
      flashrom -p internal
      +
      +
    22. +
    23. +

      Note the result.

      +
    24. +
    +

    Expected result

    +

    The output of the flashing command should not contain the information, that the +BIOS region SMM protection is enabled.

    +

    Example output with unwanted results:

    +
    Enabling flash write... Warning: BIOS region SMM protection is enabled!
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/20P-boot-menu/index.html b/unified-test-documentation/dasharo-security/20P-boot-menu/index.html new file mode 100644 index 00000000000..b2756b3a7da --- /dev/null +++ b/unified-test-documentation/dasharo-security/20P-boot-menu/index.html @@ -0,0 +1,5963 @@ + + + + + + + + + + + + + + + + + + Boot menu enable/disable - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Security: Boot menu enable/disable

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    BMA001.001 Boot menu enabling

    +

    Test description

    +

    This test aims to verify that, the boot menu is accessible when the +Boot menu enabled option in the Dasharo Security Options submenu is chosen.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Dasharo Security Options submenu.
    8. +
    9. Verify that the Boot menu enabled option is chosen - if not, press Space + and then F10 to save the changes.
    10. +
    11. If necessary - press Y to confirm saving the changes.
    12. +
    13. Go back to the main menu using the ESC key.
    14. +
    15. Select the Reset option to apply the settings and reboot.
    16. +
    17. While the DUT is booting, hold the BOOT_MENU_KEY to enter the UEFI Boot + Menu.
    18. +
    +

    Expected result

    +
      +
    1. +

      While the DUT is booting, the prompt + BOOT_MENU_KEY to enter Boot Manager Menu should be displayed. + Example output:

      +
      F11 to enter Boot Manager Menu
      +
      +
    2. +
    3. +

      After using the BOOT MENU KEY during boot, the boot menu should be + displayed.

      +
    4. +
    +

    BMA002.001 Boot menu disabling

    +

    Test description

    +

    This test aims to verify that, the boot menu is not accessible when the +Boot menu enabled option in the Dasharo Security Options submenu is not +chosen.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Dasharo Security Options submenu.
    8. +
    9. Verify that the Boot menu enabled option is not chosen - if so, press + Space and then F10 to save the changes.
    10. +
    11. If necessary - press Y to confirm saving the changes.
    12. +
    13. Go back to the main menu using the ESC key.
    14. +
    15. Select the Reset option to apply the settings and reboot.
    16. +
    17. While the DUT is booting, hold the BIOS_SETUP_KEY to enter the UEFI Boot + Menu.
    18. +
    +

    Expected result

    +
      +
    1. +

      While the DUT is booting, the prompt + BOOT_MENU_KEY to enter Boot Manager Menu should not be displayed. + Example of unwanted output:

      +
      F11 to enter Boot Manager Menu
      +
      +
    2. +
    3. +

      Despite using the BIOS_SETUP_KEY boot menu should not be displayed.

      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/20R-uefi-setup-password/index.html b/unified-test-documentation/dasharo-security/20R-uefi-setup-password/index.html new file mode 100644 index 00000000000..ed38ea21637 --- /dev/null +++ b/unified-test-documentation/dasharo-security/20R-uefi-setup-password/index.html @@ -0,0 +1,6175 @@ + + + + + + + + + + + + + + + + + + UEFI Setup password - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Security: UEFI Setup password

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    PSW001.001 Check Password Setup option availability and default state

    +

    Test description

    +

    This test aims to verify whether User Password Management submenu is +available and, whether all options in the submenu have correct default state.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press SETUP_MENU_KEY to enter the Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the User Password Management submenu using the arrow keys and Enter.
    8. +
    9. Verify the Admin Password Status field.
    10. +
    11. Verify the Change Admin Password field.
    12. +
    +

    Expected result

    +
      +
    1. The Admin Password Status field should be present and indicate, that + password setup is currently disabled.
    2. +
    3. The Change Admin Password field should be present. After passing the + cursor over this option, information about password minimum terms and + conditions should be displayed.
    4. +
    +

    PSW002.001 Password setting mechanism correctness checking

    +

    Test description

    +

    This test aims to verify whether Change Admin Password option works +correctly - after restarting the device and trying to enter the Setup Menu, +a window to enter the password will be displayed.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press SETUP_MENU_KEY to enter the Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the User Password Management submenu using the arrow keys and Enter.
    8. +
    9. Select the option Change Admin Password by using the arrow keys and Enter.
    10. +
    11. Set the password in accordance with the password minimum terms and + conditions.
    12. +
    13. Restart the DUT.
    14. +
    15. Press SETUP_MENU_KEY to enter the Setup Menu.
    16. +
    17. Verify if the password window will be displayed.
    18. +
    +

    Expected result

    +

    The password window should be displayed correctly.

    +

    PSW003.001 Attempt to log in with a correct password

    +

    Test description

    +

    This test aims to verify whether, after entering the correct Setup password, +the Setup menu will be displayed.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT
    2. +
    3. Press SETUP_MENU_KEY to enter the Setup Menu.
    4. +
    5. Enter the correct password and note the result.
    6. +
    +

    Expected result

    +

    After typing in the correct password Setup menu should be displayed.

    +

    PSW004.001 Attempt to log in with an incorrect password

    +

    Test description

    +

    This test aims to verify whether, after entering the incorrect Setup password, +the message about the demand for re-entering the password will be displayed.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT
    2. +
    3. Press BOOT_MENU_KEY key to display the boot menu.
    4. +
    5. Enter the incorrect password and note the result.
    6. +
    +

    Expected result

    +

    After typing in the incorrect password the message about the demand for +re-entering the password will be displayed.

    +

    PSW005.001 Attempt to log in with an incorrect password 3 times

    +

    Test description

    +

    This test aims to verify whether, after entering the incorrect Setup password +three times, the message about demand for rebooting the DUT will be displayed.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT
    2. +
    3. Press BOOT_MENU_KEY key to display the boot menu.
    4. +
    5. Enter the incorrect password three times and note the result.
    6. +
    +

    Expected result

    +

    After typing in the incorrect password three times the message about the demand +for rebooting the DUT will be displayed.

    +

    PSW006.001 Attempt to turn off setup password functionality

    +

    Test description

    +

    This test aims to verify whether there is a possibility to turn off the Setup +Password functionality by entering empty password.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press SETUP_MENU_KEY to enter the Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the User Password Management submenu using the arrow keys and Enter.
    8. +
    9. Select the option Change Admin Password by using the arrow keys and Enter.
    10. +
    11. Set the empty password.
    12. +
    13. Restart the DUT.
    14. +
    15. Press SETUP_MENU_KEY to enter the Setup Menu.
    16. +
    17. Verify if the password window will be displayed.
    18. +
    +

    Expected result

    +
      +
    1. Password window should not be displayed.
    2. +
    3. The DUT should boot into Setup Menu.
    4. +
    +

    PSW007.001 Attempt to set non-compilant password

    +

    Test description

    +

    This test aims to verify whether the attempt to set a non-compilant password +will be rejected.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press SETUP_MENU_KEY to enter the Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the User Password Management submenu using the arrow keys and Enter.
    8. +
    9. Select the option Change Admin Password by using the arrow keys and Enter.
    10. +
    11. Set the password in non-accordance with the password minimum terms and + conditions.
    12. +
    +

    Expected result

    +
      +
    1. The window with the information that requested password is not strong + enough should be displayed.
    2. +
    3. The attempt to set the password should be rejected.
    4. +
    +

    PSW008.001 Attempt to set old password

    +

    Test description

    +

    UEFI Setup password feature has been equipped with an additional functionality +that prevents re-setting one of the last 5 access passwords. This test aims to +verify whether the attempt to set old password again will be rejected.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Press SETUP_MENU_KEY to enter the Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the User Password Management submenu using the arrow keys and Enter.
    8. +
    9. Select the option Change Admin Password by using the arrow keys and Enter.
    10. +
    11. Set the password identically as one of the 5 latest passwords.
    12. +
    +

    Expected result

    +
      +
    1. The window with the information that requested password has been found in + the passwords history should be displayed.
    2. +
    3. The attempt to set the password should be rejected.
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/20S-usb-stack/index.html b/unified-test-documentation/dasharo-security/20S-usb-stack/index.html new file mode 100644 index 00000000000..480ff5bca64 --- /dev/null +++ b/unified-test-documentation/dasharo-security/20S-usb-stack/index.html @@ -0,0 +1,6034 @@ + + + + + + + + + + + + + + + + + + USB stack enable/disable - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Security: USB stack enable/disable

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    +

    USS001.001 Enable USB stack (firmware)

    +

    Test description

    +

    This test aims to verify that the USB stack might be enabled. If the stack is +activated, there will be an option to use USB bootable drives and USB keyboards +on the firmware level.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect PS/2 keyboard to the device.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While booting, press the SETUP_MENU_KEY to enter Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu option.
    6. +
    7. Verify that the Enable USB stack field is checked - if not, use Spacebar + to change option settings.
    8. +
    9. Save using F10, and exit from the menu using Esc.
    10. +
    11. Connect any USB with a bootable system and USB keyboard to the DUT.
    12. +
    13. Reboot the device.
    14. +
    15. While booting, press BOOT_MENU_KEY on the USB keyboard to enter Setup + Menu.
    16. +
    17. Note the results.
    18. +
    +

    Expected result

    +
      +
    1. USB keyboard should be operable.
    2. +
    3. USB installer should be visible as a bootable device.
    4. +
    +

    USS002.001 Disable USB stack (firmware)

    +

    Test description

    +

    This test aims to verify that the USB stack might be disabled. If the stack is +deactivated, there will be no option to use USB bootable drives and USB +keyboards on the firmware level.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Connect PS/2 keyboard to the device.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While booting, press the SETUP_MENU_KEY to enter Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu option.
    6. +
    7. Verify that the Enable USB stack field is not checked - if so, use + Spacebar to change option settings.
    8. +
    9. Save using F10, and exit from the menu using Esc.
    10. +
    11. Connect any USB with a bootable system and USB keyboard to the DUT.
    12. +
    13. Reboot the device.
    14. +
    15. While booting, press BOOT_MENU_KEY on the PS/2 keyboard to enter Setup + Menu.
    16. +
    17. Try to navigate through the menu by using the USB keyboard.
    18. +
    19. Note the results.
    20. +
    +

    Expected result

    +
      +
    1. USB keyboard should be non-operable.
    2. +
    3. USB installer should not be visible as a bootable device.
    4. +
    +

    USS003.001 Enable USB Mass Storage (firmware)

    +

    Test description

    +

    This test aims to verify that USB Mass Storage might be enabled. If the storage +support is activated, there will be an option to use USB bootable drives on the +firmware level.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While booting, press the SETUP_MENU_KEY to enter Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu option.
    6. +
    7. Verify that the Enable USB Mass Storage field is checked - if not, use + Spacebar to change option settings.
    8. +
    9. Save using F10, and exit from the menu using Esc.
    10. +
    11. Connect any USB with a bootable system and USB keyboard to the DUT.
    12. +
    13. Reboot the device.
    14. +
    15. While booting, press BOOT_MENU_KEY to enter Setup Menu.
    16. +
    17. Note the result.
    18. +
    +

    Expected result

    +

    USB installer should be visible as a bootable device.

    +

    USS004.001 Disable USB Mass Storage (firmware)

    +

    Test description

    +

    This test aims to verify that USB Mass Storage might be disabled. If the storage +support is deactivated, there will be no option to use USB bootable drives on +the firmware level.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While booting, press the SETUP_MENU_KEY to enter Setup Menu.
    4. +
    5. Enter the Dasharo System Features menu option.
    6. +
    7. Verify that the Enable USB Mass Storage field is not checked - if so, use + Spacebar to change option settings.
    8. +
    9. Save using F10, and exit from the menu using Esc.
    10. +
    11. Connect any USB with a bootable system and USB keyboard to the DUT.
    12. +
    13. Reboot the device.
    14. +
    15. While booting, press BOOT_MENU_KEY to enter Setup Menu.
    16. +
    17. Note the result.
    18. +
    +

    Expected result

    +

    USB installer should not be visible as a bootable device.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-security/20T-network-boot/index.html b/unified-test-documentation/dasharo-security/20T-network-boot/index.html new file mode 100644 index 00000000000..58981e61646 --- /dev/null +++ b/unified-test-documentation/dasharo-security/20T-network-boot/index.html @@ -0,0 +1,5938 @@ + + + + + + + + + + + + + + + + + + Network stack enable/disable - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Security: Network stack enable/disable

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. The DUT should be connected to the Internet by using an Ethernet cable.
    4. +
    +

    NBA001.001 Enable Network Boot (firmware)

    +

    Test description

    +

    This test aims to verify that the Network Boot option might be enabled. If this +option is activated, an additional option in the Boot menu which allows to boot +the system from iPXE servers will appear.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While booting, press the SETUP_MENU_KEY to enter Setup Menu.
    4. +
    5. Enter the Networking Options menu option.
    6. +
    7. Verify that the Enable Network Boot field is checked - if not, use + Spacebar to change option settings.
    8. +
    9. Save using F10, and exit from the menu using Esc.
    10. +
    11. Reboot the device.
    12. +
    13. While booting, press BOOT_MENU_KEY on the USB keyboard to enter Setup + Menu.
    14. +
    15. Note the results.
    16. +
    +

    Expected result

    +

    The Network Boot option in the Boot menu should be visible.

    +

    NBA002.001 Disable Network Boot (firmware)

    +

    Test description

    +

    This test aims to verify that the Network Boot option might be disabled. If this +option is deactivated, an additional option in the Boot menu which allows to +boot the system from iPXE servers will be hidden.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. While booting, press the SETUP_MENU_KEY to enter Setup Menu.
    4. +
    5. Enter the Networking Options menu option.
    6. +
    7. Verify that the Enable Network Boot field is checked - if so, use + Spacebar to change option settings.
    8. +
    9. Save using F10, and exit from the menu using Esc.
    10. +
    11. Reboot the device.
    12. +
    13. While booting, press BOOT_MENU_KEY on the USB keyboard to enter Setup + Menu.
    14. +
    15. Note the results.
    16. +
    +

    Expected result

    +

    The Network Boot option in the Boot menu should not be visible.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/index.html b/unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/index.html new file mode 100644 index 00000000000..ba6cbbba0f4 --- /dev/null +++ b/unified-test-documentation/dasharo-stability/01-net-controller-after-coldboot-warmboot-reboot-suspend/index.html @@ -0,0 +1,6218 @@ + + + + + + + + + + + + + + + + + + NET interface check after coldboot/warmboot/reboot/suspend - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: NET controller after coldboot/warmboot/reboot/suspend

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. The Thunderbolt docking station connected to the Thunderbolt port.
    10. +
    +

    NET001.001 NET controller after coldboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the network controller works and the platform +is able to connect to the network after coldboot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a Ethernet cable with internet connection to the platform.
    8. +
    9. Wait for internet connection to initialize.
    10. +
    11. +

      Open a terminal window and execute following command to list available + network interfaces:

      +
      ip a
      +
      +
    12. +
    13. +

      Determine the name of the ethernet controller. It typically is ethX or + enpXsY, where X and Y are numbers.

      +
    14. +
    15. +

      Then, execute following command to check if the network interface is working + correctly:

      +
      cat /sys/class/net/<interface_name>/operstate
      +
      +
    16. +
    17. +

      Perform coldboot.

      +
    18. +
    19. Boot into the system.
    20. +
    21. Log into the system by using the proper login and password.
    22. +
    23. Open a terminal window and execute the command mentioned in point 8.
    24. +
    +

    Expected result

    +
      +
    1. +

      The ip a command should return information about available NET + interfaces. The list should contain the ethernet network interface, which is + typically identified as ethX or enpXsY, where X and Y are numbers. + Example output:

      +
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
      +link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      +inet 127.0.0.1/8 scope host lo
      +   valid_lft forever preferred_lft forever
      +inet6 ::1/128 scope host
      +   valid_lft forever preferred_lft forever
      +2: enp46s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
      +link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff
      +inet 192.168.4.85/24 brd 192.168.4.255 scope global dynamic noprefixroute enp46s0
      +   valid_lft 40276sec preferred_lft 40276sec
      +inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute
      +   valid_lft forever preferred_lft forever
      +3: wlp0s20f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
      +link/ether 14:18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff
      +
      +
    2. +
    3. +

      The cat /sys/class/net/<interface_name>/operstate command should return + information indicating if the network interface works correctly (up) or + not (down). Example output:

      +
      up
      +
      +
    4. +
    +

    NET002.001 NET controller after warmboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the network controller works and the platform +is able to connect to the network after warmboot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a Ethernet cable with internet connection to the platform.
    8. +
    9. Wait for internet connection to initialize.
    10. +
    11. +

      Open a terminal window and execute following command to list available + network interfaces:

      +
      ip a
      +
      +
    12. +
    13. +

      Determine the name of the ethernet controller. It typically is ethX or + enpXsY, where X and Y are numbers.

      +
    14. +
    15. +

      Then, execute following command to check if the network interface is working + correctly:

      +
      cat /sys/class/net/<interface_name>/operstate
      +
      +
    16. +
    17. +

      Perform warmboot.

      +
    18. +
    19. Boot into the system.
    20. +
    21. Log into the system by using the proper login and password.
    22. +
    23. Open a terminal window and execute the command mentioned in point 8.
    24. +
    +

    Expected result

    +
      +
    1. +

      The ip a command should return information about available NET + interfaces. The list should contain the ethernet network interface, which is + typically identified as ethX or enpXsY, where X and Y are numbers. + Example output:

      +
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
      +link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      +inet 127.0.0.1/8 scope host lo
      +   valid_lft forever preferred_lft forever
      +inet6 ::1/128 scope host
      +   valid_lft forever preferred_lft forever
      +2: enp46s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
      +link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff
      +inet 192.168.4.85/24 brd 192.168.4.255 scope global dynamic noprefixroute enp46s0
      +   valid_lft 40276sec preferred_lft 40276sec
      +inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute
      +   valid_lft forever preferred_lft forever
      +3: wlp0s20f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
      +link/ether 14:18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff
      +
      +
    2. +
    3. +

      The cat /sys/class/net/<interface_name>/operstate command should return + information indicating if the network interface works correctly (up) or + not (down). Example output:

      +
      up
      +
      +
    4. +
    +

    NET003.001 NET controller after reboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the network controller works and the platform +is able to connect to the network after coldboot.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a Ethernet cable with internet connection to the platform.
    8. +
    9. Wait for internet connection to initialize.
    10. +
    11. +

      Open a terminal window and execute following command to list available + network interfaces:

      +
      ip a
      +
      +
    12. +
    13. +

      Determine the name of the ethernet controller. It typically is ethX or + enpXsY, where X and Y are numbers.

      +
    14. +
    15. +

      Then, execute following command to check if the network interface is working + correctly:

      +
      cat /sys/class/net/<interface_name>/operstate
      +
      +
    16. +
    17. +

      Reboot the system.

      +
    18. +
    19. Boot into the system.
    20. +
    21. Log into the system by using the proper login and password.
    22. +
    23. Open a terminal window and execute the command mentioned in point 8.
    24. +
    +

    Expected result

    +
      +
    1. +

      The ip a command should return information about available NET + interfaces. The list should contain the ethernet network interface, which is + typically identified as ethX or enpXsY, where X and Y are numbers. + Example output:

      +
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
      +link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      +inet 127.0.0.1/8 scope host lo
      +   valid_lft forever preferred_lft forever
      +inet6 ::1/128 scope host
      +   valid_lft forever preferred_lft forever
      +2: enp46s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
      +link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff
      +inet 192.168.4.85/24 brd 192.168.4.255 scope global dynamic noprefixroute enp46s0
      +   valid_lft 40276sec preferred_lft 40276sec
      +inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute
      +   valid_lft forever preferred_lft forever
      +3: wlp0s20f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
      +link/ether 14:18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff
      +
      +
    2. +
    3. +

      The cat /sys/class/net/<interface_name>/operstate command should return + information indicating if the network interface works correctly (up) or + not (down). Example output:

      +
      up
      +
      +
    4. +
    +

    NET004.001 NET controller after suspend (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the network controller works and the platform +is able to connect to the network after suspend.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. Plug in a Ethernet cable with internet connection to the platform.
    8. +
    9. Wait for internet connection to initialize.
    10. +
    11. +

      Open a terminal window and execute following command to list available + network interfaces:

      +
      ip a
      +
      +
    12. +
    13. +

      Determine the name of the ethernet controller. It typically is ethX or + enpXsY, where X and Y are numbers.

      +
    14. +
    15. +

      Then, execute following command to check if the network interface is working + correctly:

      +
      cat /sys/class/net/<interface_name>/operstate
      +
      +
    16. +
    17. +

      Execute following command to suspend the system and automatically wake it + up after 10 seconds:

      +
      sudo fwts s3 --s3-sleep-delay=10
      +
      +
    18. +
    19. +

      After the system wakes up, log into the system and execute the command + mentioned in point 8.

      +
    20. +
    +

    Expected result

    +
      +
    1. +

      The ip a command should return information about available NET + interfaces. The list should contain the ethernet network interface, which is + typically identified as ethX or enpXsY, where X and Y are numbers. + Example output:

      +
      1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
      +link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      +inet 127.0.0.1/8 scope host lo
      +   valid_lft forever preferred_lft forever
      +inet6 ::1/128 scope host
      +   valid_lft forever preferred_lft forever
      +2: enp46s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
      +link/ether d4:93:90:16:92:f8 brd ff:ff:ff:ff:ff:ff
      +inet 192.168.4.85/24 brd 192.168.4.255 scope global dynamic noprefixroute enp46s0
      +   valid_lft 40276sec preferred_lft 40276sec
      +inet6 fe80::8317:79e3:81ec:a1f4/64 scope link noprefixroute
      +   valid_lft forever preferred_lft forever
      +3: wlp0s20f3: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
      +link/ether 14:18:c3:7d:77:06 brd ff:ff:ff:ff:ff:ff
      +
      +
    2. +
    3. +

      The cat /sys/class/net/<interface_name>/operstate command should return + information indicating if the network interface works correctly (up) or + not (down). Example output:

      +
      up
      +
      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/index.html b/unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/index.html new file mode 100644 index 00000000000..c25d95cea7b --- /dev/null +++ b/unified-test-documentation/dasharo-stability/C01-usb-type-a-devices-detection/index.html @@ -0,0 +1,6095 @@ + + + + + + + + + + + + + + + + + + USB Type-A devices detection - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Stability: USB Type-A devices detection

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    9. Connect the USB device to the USB Type-A port.
    10. +
    +

    SUD0001.001 USB devices detection after cold boot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the external USB devices are detected correctly +after performing a cold boot. The test should be performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. Disconnect the power source, and remove the battery if present.
    12. +
    13. Connect power and battery again.
    14. +
    15. Power on the DUT.
    16. +
    17. Boot into the system.
    18. +
    19. Log into the system by using the proper login and password.
    20. +
    21. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    22. +
    23. +

      Note the results.

      +
    24. +
    +

    Expected result

    +

    The output of each lsusb command should contain an entry of the connected +USB device.

    +

    SUD0002.001 USB devices detection after warm boot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the external USB devices are detected correctly +after performing a warm boot. The test should be performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. Power off the DUT using the power button.
    12. +
    13. Power on the DUT.
    14. +
    15. Boot into the system.
    16. +
    17. Log into the system by using the proper login and password.
    18. +
    19. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    20. +
    21. +

      Note the results.

      +
    22. +
    +

    Expected result

    +

    The output of each lsusb command should contain an entry of the connected +USB device.

    +

    SUD0003.001 USB devices detection after reboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the external USB devices are detected correctly +after performing a reboot. The test should be performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. Disconnect the power source, and remove the battery if present.
    12. +
    13. Connect power and battery again.
    14. +
    15. Power on the DUT.
    16. +
    17. Boot into the system.
    18. +
    19. Log into the system by using the proper login and password.
    20. +
    21. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    22. +
    23. +

      Note the results.

      +
    24. +
    +

    Expected result

    +

    The output of each lsusb command should contain an entry of the connected +USB device.

    +

    SUD0004.001 USB devices detection after suspension (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the external USB devices are detected correctly +after performing suspension. The test should be performed in multiple +iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the Firmware test suite + package.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    8. +
    9. +

      Note the results.

      +
    10. +
    11. +

      Execute the following command to suspend the system and automatically wake it + up after 10 seconds:

      +
      sudo fwts s3 --s3-sleep-delay=10
      +
      +
    12. +
    13. +

      Open a terminal window and run the following command:

      +
      lsusb
      +
      +
    14. +
    15. +

      Note the results.

      +
    16. +
    +

    Expected result

    +

    The output of each lsusb command should contain an entry of the connected +USB device.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-stability/C02-m2-wi-fi/index.html b/unified-test-documentation/dasharo-stability/C02-m2-wi-fi/index.html new file mode 100644 index 00000000000..8a56a0fe131 --- /dev/null +++ b/unified-test-documentation/dasharo-stability/C02-m2-wi-fi/index.html @@ -0,0 +1,6229 @@ + + + + + + + + + + + + + + + + + + M.2 Wi-fi - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Stability: M.2 Wi-fi

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    SMW0001.001 Wi-fi connection after cold boot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi card is detected and working correctly +after performing a cold boot. The test should be performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lspci | grep "Network Controller"
      +
      +
    8. +
    9. +

      Open a terminal window and run the following commands:

      +
      nmcli radio wifi on
      +nmcli device wifi rescan
      +# Wait ~5 seconds
      +nmcli device wifi list
      +
      +
    10. +
    11. +

      Disconnect the power source, and remove the battery if present.

      +
    12. +
    13. Connect power and battery again.
    14. +
    15. Power on the DUT.
    16. +
    17. Boot into the system.
    18. +
    19. Log into the system by using the proper login and password.
    20. +
    21. +

      Open a terminal window and run the following command:

      +
      lspci | grep "Network Controller"
      +
      +
    22. +
    23. +

      Open a terminal window and run the following commands:

      +
      nmcli radio wifi on
      +nmcli device wifi rescan
      +# Wait ~5 seconds
      +nmcli device wifi list
      +
      +
    24. +
    +

    Expected result

    +
      +
    1. +

      The output of each lspci command should contain information about the + mounted on the DUT network controller. Example output:

      +
      2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 (rev 1a)
      +
      +
    2. +
    3. +

      The output of each nmcli device wifi list` command should return a list of + available Wi-Fi networks. Example output:

      +
      IN-USE  BSSID              SSID                    MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
      +        XX:XX:XX:XX:XX:XX  DIRECT-ny               Infra  6     65 Mbit/s   75      ▂▄▆_  WPA2
      +*       XX:XX:XX:XX:XX:XX  3mdeb_abr_5GHz          Infra  48    405 Mbit/s  72      ▂▄▆_  WPA2
      +        XX:XX:XX:XX:XX:XX  3mdeb_abr               Infra  11    54 Mbit/s   69      ▂▄▆_  WPA2
      +        XX:XX:XX:XX:XX:XX  FunBox2-F9BF_2.4GHz     Infra  1     130 Mbit/s  50      ▂▄__  WPA1 WPA2
      +        XX:XX:XX:XX:XX:XX  H_Office                Infra  2     270 Mbit/s  35      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-xpPhaser 3330    Infra  1     65 Mbit/s   34      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  108   540 Mbit/s  32      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-KRM288x Series   Infra  11    54 Mbit/s   22      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  11    130 Mbit/s  20      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-ejPhaser 3330    Infra  1     65 Mbit/s   17      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  NED-WIFI                Infra  11    270 Mbit/s  17      ▂___  WPA2
      +
      +
    4. +
    +

    SMW0002.001 Wi-fi connection after warm boot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi card is detected and working correctly +after performing a warm boot. The test should be performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lspci | grep "Network Controller"
      +
      +
    8. +
    9. +

      Open a terminal window and run the following commands:

      +
      nmcli radio wifi on
      +nmcli device wifi rescan
      +# Wait ~5 seconds
      +nmcli device wifi list
      +
      +
    10. +
    11. +

      Power off the DUT using the power button.

      +
    12. +
    13. Power on the DUT.
    14. +
    15. Boot into the system.
    16. +
    17. Log into the system by using the proper login and password.
    18. +
    19. +

      Open a terminal window and run the following command:

      +
      lspci | grep "Network Controller"
      +
      +
    20. +
    21. +

      Open a terminal window and run the following commands:

      +
      nmcli radio wifi on
      +nmcli device wifi rescan
      +# Wait ~5 seconds
      +nmcli device wifi list
      +
      +
    22. +
    +

    Expected result

    +
      +
    1. +

      The output of each lspci command should contain information about the + mounted on the DUT network controller. Example output:

      +
      2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 (rev 1a)
      +
      +
    2. +
    3. +

      The output of each nmcli device wifi list` command should return a list of + available Wi-Fi networks. Example output:

      +
      IN-USE  BSSID              SSID                    MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
      +        XX:XX:XX:XX:XX:XX  DIRECT-ny               Infra  6     65 Mbit/s   75      ▂▄▆_  WPA2
      +*       XX:XX:XX:XX:XX:XX  3mdeb_abr_5GHz          Infra  48    405 Mbit/s  72      ▂▄▆_  WPA2
      +        XX:XX:XX:XX:XX:XX  3mdeb_abr               Infra  11    54 Mbit/s   69      ▂▄▆_  WPA2
      +        XX:XX:XX:XX:XX:XX  FunBox2-F9BF_2.4GHz     Infra  1     130 Mbit/s  50      ▂▄__  WPA1 WPA2
      +        XX:XX:XX:XX:XX:XX  H_Office                Infra  2     270 Mbit/s  35      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-xpPhaser 3330    Infra  1     65 Mbit/s   34      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  108   540 Mbit/s  32      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-KRM288x Series   Infra  11    54 Mbit/s   22      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  11    130 Mbit/s  20      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-ejPhaser 3330    Infra  1     65 Mbit/s   17      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  NED-WIFI                Infra  11    270 Mbit/s  17      ▂___  WPA2
      +
      +
    4. +
    +

    SMW0003.001 Wi-fi connection after reboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi card is detected and working correctly +after performing a reboot. The test should be performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lspci | grep "Network Controller"
      +
      +
    8. +
    9. +

      Open a terminal window and run the following commands:

      +
      nmcli radio wifi on
      +nmcli device wifi rescan
      +# Wait ~5 seconds
      +nmcli device wifi list
      +
      +
    10. +
    11. +

      Disconnect the power source, and remove the battery if present.

      +
    12. +
    13. Connect power and battery again.
    14. +
    15. Power on the DUT.
    16. +
    17. Boot into the system.
    18. +
    19. Log into the system by using the proper login and password.
    20. +
    21. +

      Open a terminal window and run the following command:

      +
      lspci | grep "Network Controller"
      +
      +
    22. +
    23. +

      Open a terminal window and run the following commands:

      +
      nmcli radio wifi on
      +nmcli device wifi rescan
      +# Wait ~5 seconds
      +nmcli device wifi list
      +
      +
    24. +
    +

    Expected result

    +
      +
    1. +

      The output of each lspci command should contain information about the + mounted on the DUT network controller. Example output:

      +
      2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 (rev 1a)
      +
      +
    2. +
    3. +

      The output of each nmcli device wifi list` command should return a list of + available Wi-Fi networks. Example output:

      +
      IN-USE  BSSID              SSID                    MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
      +        XX:XX:XX:XX:XX:XX  DIRECT-ny               Infra  6     65 Mbit/s   75      ▂▄▆_  WPA2
      +*       XX:XX:XX:XX:XX:XX  3mdeb_abr_5GHz          Infra  48    405 Mbit/s  72      ▂▄▆_  WPA2
      +        XX:XX:XX:XX:XX:XX  3mdeb_abr               Infra  11    54 Mbit/s   69      ▂▄▆_  WPA2
      +        XX:XX:XX:XX:XX:XX  FunBox2-F9BF_2.4GHz     Infra  1     130 Mbit/s  50      ▂▄__  WPA1 WPA2
      +        XX:XX:XX:XX:XX:XX  H_Office                Infra  2     270 Mbit/s  35      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-xpPhaser 3330    Infra  1     65 Mbit/s   34      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  108   540 Mbit/s  32      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-KRM288x Series   Infra  11    54 Mbit/s   22      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  11    130 Mbit/s  20      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-ejPhaser 3330    Infra  1     65 Mbit/s   17      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  NED-WIFI                Infra  11    270 Mbit/s  17      ▂___  WPA2
      +
      +
    4. +
    +

    SMW0004.001 Wi-fi connection after suspension (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the Wi-Fi card is detected and working correctly +after performing suspension. The test should be performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the Firmware test suite + package.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lspci | grep "Network Controller"
      +
      +
    8. +
    9. +

      Open a terminal window and run the following commands:

      +
      nmcli radio wifi on
      +nmcli device wifi rescan
      +# Wait ~5 seconds
      +nmcli device wifi list
      +
      +
    10. +
    11. +

      Execute the following command to suspend the system and automatically wake it + up after 10 seconds:

      +
      sudo fwts s3 --s3-sleep-delay=10
      +
      +
    12. +
    13. +

      Open a terminal window and run the following command:

      +
      lspci | grep "Network Controller"
      +
      +
    14. +
    15. +

      Open a terminal window and run the following commands:

      +
      nmcli radio wifi on
      +nmcli device wifi rescan
      +# Wait ~5 seconds
      +nmcli device wifi list
      +
      +
    16. +
    +

    Expected result

    +
      +
    1. +

      The output of each lspci command should contain information about the + mounted on the DUT network controller. Example output:

      +
      2f:00.0 Network controller: Intel Corporation Wi-Fi 6 AX201 (rev 1a)
      +
      +
    2. +
    3. +

      The output of each nmcli device wifi list` command should return a list of + available Wi-Fi networks. Example output:

      +
      IN-USE  BSSID              SSID                    MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
      +        XX:XX:XX:XX:XX:XX  DIRECT-ny               Infra  6     65 Mbit/s   75      ▂▄▆_  WPA2
      +*       XX:XX:XX:XX:XX:XX  3mdeb_abr_5GHz          Infra  48    405 Mbit/s  72      ▂▄▆_  WPA2
      +        XX:XX:XX:XX:XX:XX  3mdeb_abr               Infra  11    54 Mbit/s   69      ▂▄▆_  WPA2
      +        XX:XX:XX:XX:XX:XX  FunBox2-F9BF_2.4GHz     Infra  1     130 Mbit/s  50      ▂▄__  WPA1 WPA2
      +        XX:XX:XX:XX:XX:XX  H_Office                Infra  2     270 Mbit/s  35      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-xpPhaser 3330    Infra  1     65 Mbit/s   34      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  108   540 Mbit/s  32      ▂▄__  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-KRM288x Series   Infra  11    54 Mbit/s   22      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  Orange_Swiatlowod_A79A  Infra  11    130 Mbit/s  20      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  DIRECT-ejPhaser 3330    Infra  1     65 Mbit/s   17      ▂___  WPA2
      +        XX:XX:XX:XX:XX:XX  NED-WIFI                Infra  11    270 Mbit/s  17      ▂___  WPA2
      +
      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/dasharo-stability/C03-nvme-detection/index.html b/unified-test-documentation/dasharo-stability/C03-nvme-detection/index.html new file mode 100644 index 00000000000..a16ee54de54 --- /dev/null +++ b/unified-test-documentation/dasharo-stability/C03-nvme-detection/index.html @@ -0,0 +1,6081 @@ + + + + + + + + + + + + + + + + + + NVMe detection - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Dasharo Stability: NVMe detection

    +

    Test cases common documentation

    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware.
    2. +
    3. Proceed with the + Generic test setup: OS installer.
    4. +
    5. Proceed with the + Generic test setup: OS installation.
    6. +
    7. Proceed with the + Generic test setup: OS boot from disk.
    8. +
    +

    SNV0001.001 NVMe detection after cold boot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the NVMe disk is correctly detected after +performing a cold boot. The test should be performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lspci | grep -i nvme
      +
      +
    8. +
    9. +

      Disconnect the power source, and remove the battery if present.

      +
    10. +
    11. Connect power and battery again.
    12. +
    13. Power on the DUT.
    14. +
    15. Boot into the system.
    16. +
    17. Log into the system by using the proper login and password.
    18. +
    19. +

      Open a terminal window and run the following command:

      +
      lspci | grep -i nvme
      +
      +
    20. +
    +

    Expected result

    +

    The output of each lspci command should contain information about the mounted +on the DUT NVMe disk. Example output:

    +
    01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980
    +
    +

    SNV0001.001 NVMe detection after warm boot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the NVMe disk is correctly detected after +performing a warm boot. The test should be performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lspci | grep -i nvme
      +
      +
    8. +
    9. +

      Power off the DUT using the power button.

      +
    10. +
    11. Power on the DUT.
    12. +
    13. Boot into the system.
    14. +
    15. Log into the system by using the proper login and password.
    16. +
    17. +

      Open a terminal window and run the following command:

      +
      lspci | grep -i nvme
      +
      +
    18. +
    +

    Expected result

    +

    The output of each lspci command should contain information about the mounted +on the DUT NVMe disk. Example output:

    +
    01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980
    +
    +

    SNV0003.001 NVMe detection after reboot (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the NVMe disk is correctly detected after +performing a reboot. The test should be performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Generic test setup: firmware
    2. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lspci | grep -i nvme
      +
      +
    8. +
    9. +

      Disconnect the power source, and remove the battery if present.

      +
    10. +
    11. Connect power and battery again.
    12. +
    13. Power on the DUT.
    14. +
    15. Boot into the system.
    16. +
    17. Log into the system by using the proper login and password.
    18. +
    19. +

      Open a terminal window and run the following command:

      +
      lspci | grep -i nvme
      +
      +
    20. +
    +

    Expected result

    +

    The output of each lspci command should contain information about the mounted +on the DUT NVMe disk. Example output:

    +
    01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980
    +
    +

    SNV0004.001 NVMe detection after suspension (Ubuntu 22.04)

    +

    Test description

    +

    This test aims to verify that the NVMe disk is correctly detected after +performing suspension. The test should be performed in multiple iterations.

    +

    Test configuration data

    +
      +
    1. FIRMWARE = Dasharo
    2. +
    3. OPERATING_SYSTEM = Ubuntu 22.04
    4. +
    +

    Test setup

    +
      +
    1. Proceed with the + Test cases common documentation section.
    2. +
    3. Install the Firmware test suite + package.
    4. +
    +

    Test steps

    +
      +
    1. Power on the DUT.
    2. +
    3. Boot into the system.
    4. +
    5. Log into the system by using the proper login and password.
    6. +
    7. +

      Open a terminal window and run the following command:

      +
      lspci | grep -i nvme
      +
      +
    8. +
    9. +

      Execute the following command to suspend the system and automatically wake it + up after 10 seconds:

      +
      sudo fwts s3 --s3-sleep-delay=10
      +
      +
    10. +
    11. +

      Open a terminal window and run the following command:

      +
      lspci | grep -i nvme
      +
      +
    12. +
    +

    Expected result

    +

    The output of each lspci command should contain information about the mounted +on the DUT NVMe disk. Example output:

    +
    01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/generic-test-setup/index.html b/unified-test-documentation/generic-test-setup/index.html new file mode 100644 index 00000000000..d50aa357cb0 --- /dev/null +++ b/unified-test-documentation/generic-test-setup/index.html @@ -0,0 +1,5913 @@ + + + + + + + + + + + + + + + + + + Generic Test Setup - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility: Generic test setup

    +

    Test setup

    +

    Test setup is a set of procedures to be executed before the test execution. +Typically, the same setup can be reused by multiple test cases, so there is no +need to execute the setup actions before each independent case.

    +

    Generic test setup

    +

    Firmware

    +
      +
    1. Obtain FIRMWARE binary:
        +
      1. you can download it from release document dedicated for platform which + is used by you.
      2. +
      3. or you can build one yourself as shown in the building document + dedicated for platform which is used by you.
      4. +
      +
    2. +
    3. Flash FIRMWARE binary to the DUT. Device flashing procedure should be + carried out in accordance with the guidelines in Flashing document + dedicated for platform which is in use.
    4. +
    +

    OS installer

    +
      +
    1. Download OPERATING_SYSTEM installer image.
    2. +
    3. Attach USB stick to the PC.
    4. +
    5. Flash OPERATING_SYSTEM image to the USB stick.
    6. +
    7. Attach the USB stick to the DUT.
    8. +
    +

    OS installation

    +
      +
    1. Power on the DUT
    2. +
    3. Enter the boot menu using the BIOS_SETUP_KEY.
    4. +
    5. Select the Boot Menu and press Enter.
    6. +
    7. Select the USB stick and press Enter.
        +
      1. In case of the Ubuntu 22.04, select the Ubuntu (safe graphics) in the + GRUB menu.
      2. +
      +
    8. +
    9. Wait for the OPERATING_SYSTEM installer to start.
    10. +
    11. Install OPERATING_SYSTEM on the disk.
    12. +
    13. Power off the DUT.
    14. +
    15. Remove the installation media (USB stick with installer).
    16. +
    +

    NVIDIA drivers - Ubuntu 22.04

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait until the OPERATING_SYSTEM boots from disk.
    4. +
    5. Login into the OPERATING_SYSTEM.
    6. +
    7. Open a terminal window and execute the following commands:
    8. +
    +
    sudo apt update
    +sudo apt install nvidia-driver-470
    +
    +
      +
    1. A password prompt for secure boot configuration will appear. Choose a + password (you can use your system password) and press Enter.
    2. +
    3. Reboot the DUT.
    4. +
    5. Upon entry into MOKUtil, select Enroll MOK and enter the password you + chose during driver installation.
    6. +
    7. Select the option Continue boot.
    8. +
    9. Wait until the OPERATING_SYSTEM boots from disk.
    10. +
    11. Login into the OPERATING_SYSTEM.
    12. +
    13. Open the NVIDIA X Server Settings application.
    14. +
    15. Open the PRIME Profiles section.
    16. +
    17. Select NVIDIA On-demand and apply.
    18. +
    19. Enter the OPERATING_SYSTEM password when prompted.
    20. +
    +

    OS boot from disk

    +
      +
    1. Power on the DUT.
    2. +
    3. Wait until the OPERATING_SYSTEM boots from disk.
    4. +
    5. Login into the OPERATING_SYSTEM.
    6. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified-test-documentation/overview/index.html b/unified-test-documentation/overview/index.html new file mode 100644 index 00000000000..61256fad109 --- /dev/null +++ b/unified-test-documentation/overview/index.html @@ -0,0 +1,5902 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Test Specifiaction - overview

    +

    The release procedure is always preceded by validation procedure. It is done +on the basis of the test documentation, which can be found in this submenu. +To properly use the documentation, it is advisable to read the following +brief description of its components.

    +

    Test Matrix

    +

    Test Matrix is the document which shows platform-dedicated test suites and +test cases. Based on it, the customer may scope the checks performed by the +validation team each time before firmware release.

    +

    Generic test setup

    +

    Generic test setup is the document which describes all the steps that are +performed before testing the various functionalities.

    +

    Dasharo modules

    +

    Tests performed during validation procedure can be divided into test modules, +test suites and test cases.

    +

    Test cases are the smallest component of validation procedure. Their task +is to check, that the given functionality works properly under a certain +conditions.

    +

    Test suites group test cases related to the given functionality, while +test modules groups test cases related to the similar functionalities +(i. e. test suites which task is to check if differently OS boot properly +on the platform).

    +

    Currently in Dasharo test specification the following test modules can +be distinguished:

    +
      +
    • Dasharo Compatibility which contains test suites related to the basic + functionailited of the device.
    • +
    • Dasharo Security which contains test suites related to the platform + security and supporting security modules.
    • +
    • Dasharo Performance which contains test suites related to the platform + booting performance.
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified/clevo/post-install/index.html b/unified/clevo/post-install/index.html new file mode 100644 index 00000000000..e48d3612fb7 --- /dev/null +++ b/unified/clevo/post-install/index.html @@ -0,0 +1,5974 @@ + + + + + + + + + + + + + + + + + + Post-installation setup - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Post-installation setup

    +

    This document contains extra steps to perform after installing Dasharo in order +to enable full functionality of your device.

    +

    Linux

    +

    This section covers Linux post-install steps tested on Ubuntu 22.04. It is +likely thas similar procedures would for others Linux distributions as well.

    +

    Touchpad hotkey enablement

    +

    The touchpad hotkey needs extra setup to function correctly under Linux. To +enable the touchpad hotkey to work under Linux, follow the steps below:

    +
      +
    1. Execute fixup script:
    2. +
    +
    curl -sSf https://raw.githubusercontent.com/Dasharo/dasharo-tools/main/clevo/touchpad-fixup | sudo sh
    +
    +

    After executing these steps, it should be possible to enable and disable the +touchpad using the touchpad hotkey (Fn+F1) on the keyboard when using GNOME.

    +

    Touchpad multi-touch support

    +

    On NS7x an additional fix is necessary to enable multi-touch on Linux. Create +a file /etc/modprobe.d/blacklist-psmouse.conf with the following contents:

    +
    blacklist psmouse
    +
    +

    and then run the following commands:

    +
    sudo depmod -a
    +sudo update-initramfs -u
    +
    +

    Updated kernel

    +

    On Gen 12 (Alder Lake), it's recommended to install the ubuntu-oem kernel which +is a newer version than the default Ubuntu kernel. This version contains +additional fixes for newer hardware which helps with power management and +suspend on Gen 12 laptops. To install the ubuntu-oem kernel, run the following +command:

    +
    sudo apt install linux-oem-22.04a
    +
    +

    and reboot to use the new kernel.

    +

    Nvidia drivers

    +
    +

    It is only necessary to follow this step if your device has Nvidia GPU

    +
    +

    For proper working of the sleep mode on Ubuntu 22.04, it is required to +install additional Nvidia drivers.

    +
      +
    1. +

      Install drivers by executing the following command in the terminal:

      +
      sudo apt install nvidia-driver-515 nvidia-dkms-515
      +
      +
    2. +
    3. +

      Reboot the device to apply changes by executing the following command in the + terminal:

      +
      sudo reboot
      +
      +
    4. +
    5. +

      (Optional) For power saving while the card is not in use, enable On-Demand + mode in NVIDIA Control Panel:

      +
    6. +
    +

    +

    Suspend fix for SATA disks

    +

    Only affects laptops with M.2 SATA disks experiencing sleep issues (the power +LED not blinking while the laptop is suspended)

    +

    Windows and certain Linux distros such as Ubuntu do not enable the necessary +power saving tweaks to enable sleep mode while a SATA disk is installed.

    +
      +
    1. +

      Execute fixup script:

      +
      curl -sSf https://raw.githubusercontent.com/Dasharo/dasharo-tools/main/clevo/sata-suspend-fixup | sudo sh
      +
      +
    2. +
    +

    Windows 11

    +

    Updates and drivers installation

    +

    Several features on Windows 11 (i. e. suspending the device) may not work or +work unexpectedly without installing all of the updates and drivers.

    +

    To install all of them, log into the system, connect the device to the mains +and Internet, then follow the steps below:

    +
      +
    1. Press the Windows button on the keypad.
    2. +
    3. Type Windows Update Settings in the search and press Enter.
    4. +
    5. Select the Check for updates bar to start installing available updates and + drivers. During this process previously selected bar might be changed to + Restart now or Retry, so click them if something hasn't been installed + yet, something has gone wrong or a restart is just required. The entire + process may take up to 30 minutes.
    6. +
    7. Select the Advanced options option in the Windows Update Settings window.
    8. +
    9. Locate the Optional updates option and click on it.
    10. +
    11. Select all displayed updates and drivers.
    12. +
    13. Select the Download & Install bar to start installing additional updates + and drivers. During this process previously selected bar might be changed + to Restart now or Retry, so click them if something hasn't been + installed yet, something has gone wrong or a restart is just required. + The entire process may take up to 30 minutes.
    14. +
    15. Repeat all steps until all updates have been installed.
    16. +
    +

    Suspend fix for SATA disks (Windows and Linux)

    +

    Only affects laptops with M.2 SATA disks experiencing sleep issues (the power +LED not blinking while the laptop is suspended).

    +

    Windows and certain Linux distros such as Ubuntu do not enable the necessary +power saving tweaks to enable sleep mode while a SATA disk is installed.

    +
      +
    1. Download the script: link
    2. +
    3. Double click on the script to install the tweak
    4. +
    +

    Headset jack fix for NV4x 12th Gen

    +

    The headset jack in NV4x 12th Gen (Alder Lake) needs a fix that is available +starting with kernel version v6.0 (patch +be561ffad708f0cee18aee4231f80ffafaf7a419). +If you are using an older kernel, you need to add the fix manually:

    +
      +
    1. +

      Execute fixup script:

      +
      curl -sSf https://raw.githubusercontent.com/Dasharo/dasharo-tools/main/clevo/nv4x-audio-fixup | sudo sh
      +
      +
    2. +
    3. +

      Reboot. The audio jack will now work correctly.

      +
    4. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified/novacustom/building-manual/index.html b/unified/novacustom/building-manual/index.html new file mode 100644 index 00000000000..c01b951fefe --- /dev/null +++ b/unified/novacustom/building-manual/index.html @@ -0,0 +1,6116 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo firmware building guide

    +

    Intro

    +

    This guide shows how to build Dasharo firmware for NovaCustom devices. It +contains two components:

    + +

    Requirements

    +

    This guide was verified on Ubuntu 22.04. In practice, any Linux distribution +with Docker support should be enough to complete it.

    +

    Make sure that you have following packages installed:

    + +

    Build Dasharo BIOS firmware

    +
      +
    1. +

      Clone the Dasharo coreboot repository:

      +
      git clone https://github.com/Dasharo/coreboot.git
      +
      +
    2. +
    3. +

      Navigate to the source code directory and checkout to the desired revision:

      +
      cd coreboot
      +
      +
      +

      Replace X.Y.Z with a valid version

      +
      +
      +
      +
      +
      git checkout novacustom_ns5x_adl_vX.Y.Z
      +
      +
      +
      +
      git checkout novacustom_nv4x_adl_vX.Y.Z
      +
      +
      +
      +
      git checkout novacustom_ns5x_tgl_vX.Y.Z
      +
      +
      +
      +
      git checkout novacustom_nv4x_tgl_vX.Y.Z
      +
      +
      +
      +
      +
    4. +
    5. +

      Checkout submodules:

      +
      git submodule update --init --recursive --checkout
      +
      +
    6. +
    7. +

      Start docker container:

      +
      +
      +
      +
      docker run --rm -it -u $UID \
      +   -v $PWD:/home/coreboot/coreboot \
      +   -w /home/coreboot/coreboot \
      +   coreboot/coreboot-sdk:2021-09-23_b0d87f753c /bin/bash
      +
      +
      +
      +
      docker run --rm -it -u $UID \
      +   -v $PWD:/home/coreboot/coreboot \
      +   -w /home/coreboot/coreboot \
      +   coreboot/coreboot-sdk:2021-09-23_b0d87f753c /bin/bash
      +
      +
      +
      +
      docker run --rm -it -u $UID \
      +   -v $PWD:/home/coreboot/coreboot \
      +   -w /home/coreboot/coreboot \
      +   coreboot/coreboot-sdk:0ad5fbd48d /bin/bash
      +
      +
      +
      +
      docker run --rm -it -u $UID \
      +   -v $PWD:/home/coreboot/coreboot \
      +   -w /home/coreboot/coreboot \
      +   coreboot/coreboot-sdk:0ad5fbd48d /bin/bash
      +
      +
      +
      +
      +
    8. +
    9. +

      Inside of the container, configure the build process:

      +
      +
      +
      +
      make distclean && cp configs/config.novacustom_ns5x_adl .config
      +
      +
      +
      +
      make distclean && cp configs/config.novacustom_nv4x_adl .config
      +
      +
      +
      +
      make distclean && cp configs/config.novacustom_ns5x_tgl .config
      +
      +
      +
      +
      make distclean && cp configs/config.novacustom_nv4x_tgl .config
      +
      +
      +
      +
      +
    10. +
    11. +

      Start the build process:

      +
      make olddefconfig && make
      +
      +
    12. +
    +

    This will produce a Dasharo binary placed in build/coreboot.rom.

    +

    At the end of the build process, the following warning will be displayed:

    +
    ** WARNING **
    +coreboot has been built without an Intel Firmware Descriptor.
    +Never write a complete coreboot.rom without an IFD to your
    +board's flash chip! You can use flashrom's IFD or layout
    +parameters to flash only to the BIOS region.
    +
    +

    This is expected, and something you have to pay attention to if you would like +to flash your Dasharo binary. Make sure to only overwrite the BIOS region, +leaving everything else untouched. Otherwise, expect that your device will no +longer be able to boot unless fixed using an external programmer.

    +

    The binary will not contain a boot splash logo. Refer to +logo customization for including one.

    +

    Build Dasharo EC firmware

    +
      +
    1. +

      Clone the Dasharo ec repository:

      +
      git clone https://github.com/Dasharo/ec.git
      +
      +
    2. +
    3. +

      Navigate to the source code directory and checkout to the desired revision:

      +
      cd ec
      +
      +
      +

      Replace X.Y.Z with a valid version

      +
      +
      +
      +
      +
      git checkout novacustom_ns5x_adl_vX.Y.Z
      +
      +
      +
      +
      git checkout novacustom_nv4x_adl_vX.Y.Z
      +
      +
      +
      +
      git checkout novacustom_ns5x_tgl_vX.Y.Z
      +
      +
      +
      +
      git checkout novacustom_nv4x_tgl_vX.Y.Z
      +
      +
      +
      +
      +
    4. +
    5. +

      Checkout submodules:

      +
      git submodule update --init --recursive --checkout
      +
      +
    6. +
    7. +

      Build the EC firmware:

      +
      +
      +
      +
      EC_BOARD_VENDOR=novacustom EC_BOARD_MODEL=ns5x_adl ./build.sh
      +
      +

      The resulting image will be placed in: novacustom_ns5x_adl_ec.rom.

      +
      +
      +
      EC_BOARD_VENDOR=novacustom EC_BOARD_MODEL=nv4x_adl ./build.sh
      +
      +

      The resulting image will be placed in: novacustom_nv4x_adl_ec.rom.

      +
      +
      +
      EC_BOARD_VENDOR=novacustom EC_BOARD_MODEL=ns5x_tgl ./build.sh
      +
      +

      The resulting image will be placed in: novacustom_ns5x_tgl_ec.rom.

      +
      +
      +
      EC_BOARD_VENDOR=novacustom EC_BOARD_MODEL=nv4x_tgl ./build.sh
      +
      +

      The resulting image will be placed in: novacustom_nv4x_tgl_ec.rom.

      +
      +
      +
      +
    8. +
    +

    Install Dasharo firmware

    +

    The Dasharo firmware can be flashed in following ways, depending on your +situation:

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified/novacustom/fan-profiles/index.html b/unified/novacustom/fan-profiles/index.html new file mode 100644 index 00000000000..af761a91c4d --- /dev/null +++ b/unified/novacustom/fan-profiles/index.html @@ -0,0 +1,5960 @@ + + + + + + + + + + + + + + + + + + Fan profiles - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Fan profiles settings

    +

    There are two fan profiles implemented. The profiles can be selected via the +Power Management Options +menu in Setup Menu.

    +

    Fan profiles are defined as follows:

    +

    Silent fan profile

    +

    Releases newer than v1.4.0 TGL and v1.6.0 ADL

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Temperature [°C]Fan speed [%]
    020
    6525
    7535
    85100
    +

    Releases v1.4.0 TGL and v1.6.0 ADL or older

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Temperature [°C]Fan speed [%]
    025
    6530
    7535
    100100
    +

    Performance fan profile

    +

    Releases newer than v1.4.0 TGL and v1.6.0 ADL

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Temperature [°C]Fan speed [%]
    025
    5535
    7560
    85100
    +

    Releases v1.4.0 TGL and v1.6.0 ADL or older

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Temperature [°C]Fan speed [%]
    025
    5535
    7560
    100100
    +
    +

    Values in-between curve points are interpolated linearly.

    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified/novacustom/firmware-update/index.html b/unified/novacustom/firmware-update/index.html new file mode 100644 index 00000000000..e52bc2a1c2e --- /dev/null +++ b/unified/novacustom/firmware-update/index.html @@ -0,0 +1,5856 @@ + + + + + + + + + + + + + + + + + + Firmware update - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Firmware update

    +

    Introduction

    +

    This document describes the firmware update for NovaCustom laptops running +Dasharo firmware to the latest version available.

    +

    Update using Dasharo Tools Suite

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified/novacustom/fn-lock-hotkey/index.html b/unified/novacustom/fn-lock-hotkey/index.html new file mode 100644 index 00000000000..ed6ab5a5697 --- /dev/null +++ b/unified/novacustom/fn-lock-hotkey/index.html @@ -0,0 +1,5852 @@ + + + + + + + + + + + + + + + + + + Fn lock hotkey - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    NovaCustom Fn lock hotkey

    +

    By default, the Function Keys (F1 - F12) must be used with a +combination of Fn key to change display brightness, keyboard illumination, +etc. The Fn lock capability provides a way of using these actions without the +necessity of using the Fn key.

    +

    Usage

    +

    Enabling

    +

    Press the Fn+Caps Lock keys combination.

    +

    Disabling

    +

    Press the Fn+Caps Lock keys combination again.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified/novacustom/fwupd-usage/index.html b/unified/novacustom/fwupd-usage/index.html new file mode 100644 index 00000000000..99f9dda5131 --- /dev/null +++ b/unified/novacustom/fwupd-usage/index.html @@ -0,0 +1,6058 @@ + + + + + + + + + + + + + + + + + + Firmware update using fwupd - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Updating firmware using fwupd

    +

    This document describes the process of installing firmware updates from LVFS +using fwupd.

    +

    Installing fwupd

    +

    Using binary packages

    +

    Only .deb packages are provided. The procudure was verified on Ubuntu 20.04 +LTS, but is should also apply to other Debian-based dsitributions. If you are +using different distribution, you might need to +build from source.

    +
      +
    1. +

      Download and extract the fwupd archive:

      +
      wget --content-disposition \
      +     https://cloud.3mdeb.com/index.php/s/mZyN4NgR8SngJ4j/download \
      +     https://cloud.3mdeb.com/index.php/s/Z765y233CdJGKy2/download \
      +     https://cloud.3mdeb.com/index.php/s/KkNaL6dbWs2ei3E/download
      +unzip fwupd-novacustom-v1.2.0.zip
      +
      +
    2. +
    3. +

      This is an example how to verify the binaries (in this case fwupd-novacustom-v1.2.0.zip):

      +
      gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc
      +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/oss_master_key/open-source-software/3mdeb-open-source-software-master-key.asc
      +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/customer-keys/novacustom/novacustom-open-source-firmware-release-1.x-key.asc
      +
      +sha256sum -c fwupd-novacustom-v1.2.0.zip.sha256
      +gpg -v --verify fwupd-novacustom-v1.2.0.zip.sha256.sig fwupd-novacustom-v1.2.0.zip.sha256
      +
      +
    4. +
    5. +

      flashrom packages are located inside flashrom-1.2-2-3mdeb.zip:

      +
      unzip flashrom-1.2-2-3mdeb.zip
      +sudo apt install ./flashrom_1.2-2_amd64.deb
      +sudo apt install ./libflashrom1_1.2-2_amd64.deb
      +
      +
    6. +
    7. +

      fwupd packages are located inside fwupd-2.0.0.0-3mdeb.zip:

      +
      unzip fwupd-2.0.0.0-3mdeb.zip
      +sudo apt install ./fwupd_2.0.0_amd64.deb \
      +                   ./fwupd-doc_2.0.0_all.deb \
      +                   ./fwupd-tests_2.0.0_amd64.deb \
      +                   ./gir1.2-fwupd-2.0_2.0.0_amd64.deb \
      +                   ./gir1.2-fwupdplugin-1.0_2.0.0_amd64.deb \
      +                   ./gir1.2-gusb-1.0_0.3.5-1_amd64.deb \
      +                   ./libfwupd2_2.0.0_amd64.deb \
      +                   ./libfwupd-dev_2.0.0_amd64.deb \
      +                   ./libfwupdplugin4_2.0.0_amd64.deb \
      +                   ./libfwupdplugin-dev_2.0.0_amd64.deb \
      +                   ./libgusb2_0.3.5-1_amd64.deb \
      +                   ./libgusb-dev_0.3.5-1_amd64.deb
      +
      +
    8. +
    +

    Building from source

    +
    +

    There is no need to do any of these steps unless you can't use the packages +provided in the previous step +You might need to adjust the package manager commands and package names to +your distribution.

    +
    +

    Flashrom

    +
      +
    1. +

      Install build dependencies:

      +
      sudo apt update
      +sudo apt install -y build-essential pciutils libpci-dev libusb-1.0-0-dev \
      +    cmake meson pkg-config libftdi1-dev debhelper git wget python3-markdown \
      +    gcab
      +
      +
    2. +
    3. +

      Obtain source code:

      +
      git clone https://github.com/Dasharo/flashrom.git -b v1.2.0.1
      +cd flashrom
      +
      +
    4. +
    5. +

      Build and install flashrom:

      +
      meson build
      +ninja -C build
      +sudo ninja -C build install
      +
      +
    6. +
    +

    fwupd

    +
      +
    1. +

      Obtain source code:

      +
      git clone https://github.com/Dasharo/fwupd.git -b v1.7.3.3
      +cd fwupd
      +
      +
    2. +
    3. +

      Install build dependencies:

      +
      ./contrib/setup
      +
      +
    4. +
    5. +

      Build and install fwupd:

      +
      sudo depmod
      +meson build -Ddocs=none -Dplugin_flashrom=true
      +ninja -C build
      +sudo ninja -C build install
      +
      +
    6. +
    +

    Updating firmware from LVFS

    +
      +
    1. +

      Disable Secure Boot. To do this you can follow steps described in + Secure Boot test.

      +
    2. +
    3. +

      Refresh the fwupd database:

      +
      sudo fwupdmgr refresh
      +
      +Updating lvfs
      +Downloading…             [***************************************]
      +Downloading…             [***************************************]
      +Successfully downloaded new metadata: 1 local device supported
      +
      +
    4. +
    5. +

      Use the following command to update firmware with fwupd - example for NV41MZ:

      +

      Note: You may be asked which device to update. If you see a prompt, select +NV4XMB,ME,MZ

      +
      sudo fwupdmgr update
      +
      +Selected device: NV4XMB,ME,MZ
      +╔══════════════════════════════════════════════════════════════════════════════╗
      +║ Update NV4XMB,ME,MZ to 0.5.0?                                                ║
      +╠══════════════════════════════════════════════════════════════════════════════╣
      +║ This release adds the following features:                                    ║
      +║                                                                              ║
      +║  vboot Verified Boot                                                        ║
      +║  TPM Measured Boot                                                          ║
      +║  Custom fan curve                                                           ║
      +║  Microcode for Tiger Lake stepping 0x2                                      ║
      +║                                                                              ║
      +║ This release changes the following features:                                 ║
      +║                                                                              ║
      +║  Disabled unused DPTF device                                                ║
      +║                                                                              ║
      +║ NV4XMB,ME,MZ and all connected devices may not be usable while updating.     ║
      +╚══════════════════════════════════════════════════════════════════════════════╝
      +
      +Perform operation? [Y|n]:
      +Downloading…             [***************************************]
      +Downloading…             [***************************************]
      +Decompressing…           [***************************************]
      +Decompressing…           [***************************************]
      +Authenticating…          [***************************************]
      +Authenticating…          [***************************************]
      +Restarting device…       [***************************************]
      +Writing…                 [***************************************]
      +Decompressing…           [***************************************]
      +Writing…                 [***************************************]
      +Verifying…               [***************************************]
      +Writing…                 [***************************************]
      +Restarting device…       [***************************************]
      +Waiting…                 [***************************************]
      +Successfully installed firmware
      +
      +An update requires the system to shutdown to complete. Shutdown now? [y|N]:
      +
      +
    6. +
    7. +

      Shut down the computer when prompted, or manually later on.

      +
    8. +
    9. Power on the laptop again.
    10. +
    11. +

      Log in and run the following command to verify results:

      +
      sudo fwupdmgr get-results
      +
      +Choose a device:
      +0.  Cancel
      +1.  4bde70ba4e39b28f9eab1628f9dd6e6244c03027 (11th Gen Intel Core™ i7-1165G7 @ 2.80GHz)
      +2.  5792b48846ce271fab11c4a545f7a3df0d36e00a (Display controller)
      +3.  073c01931cb0e9889bbfb2ea4a4c2fc558805fc6 (Display controller)
      +4.  dbee8bd3b1ae0316ad143336155651eedb495a0e (NV4XMB,ME,MZ)
      +5.  71b677ca0f1bc2c5b804fa1d59e52064ce589293 (SSD 980 PRO 1TB)
      +6.  c6a80ac3a22083423992a3cb15018989f37834d6 (TPM)
      +7.  eefcbd318bd31fc1eba6358e628b3f9dceb87206 (USB4 host controller)
      +
      +
    12. +
    13. +

      Select NV4XMB,ME,MZ when prompted, and the results will be displayed:

      +
      NV4XMB,ME,MZ:
      +  Device ID:            dbee8bd3b1ae0316ad143336155651eedb495a0e
      +  Previous version:     0.5.0
      +  Update State:         Success
      +  Last modified:        2022-01-13 11:09
      +  GUID:                 230c8b18-8d9b-53ec-838b-6cfc0383493a
      +  Device Flags:          Internal device
      +                         Updatable
      +                         System requires external power source
      +                         Needs shutdown after installation
      +                         Cryptographic hash verification is available
      +
      +
    14. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified/novacustom/initial-deployment/index.html b/unified/novacustom/initial-deployment/index.html new file mode 100644 index 00000000000..b4065c9e179 --- /dev/null +++ b/unified/novacustom/initial-deployment/index.html @@ -0,0 +1,5999 @@ + + + + + + + + + + + + + + + + + + Initial deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Initial Deployment

    +

    Intro

    +

    This document is a guide for the initial installation of Dasharo on a supported +device. It assumes some knowledge about external flashing and is primarily aimed +at technicians performing initial installation and not for end users of the +devices.

    +

    Installing Dasharo

    +

    Initial Installation

    +
    +
    +
    +

    During the initial installation of Dasharo, you should deploy the supported +Intel ME version (and configuration) on the device. Since vendor firmware +has enabled Intel Boot Guard and BIOS Guard, it is not possible to do this +from within the operating system and external flashing of the whole flash +chip using a programmer like the CH341a is required.

    +
    +

    Publicly released binaries do not contain ME binary. If you need an Intel ME +update for your device, contact us via already established commercial support +channel.

    +
    +

    Preparation

    +

    Install flashrom:

    +
    apt update
    +apt upgrade
    +sudo apt -y install flashrom
    +
    +

    BIOS installation

    +

    Steps for installing Dasharo BIOS:

    +
      +
    1. +

      Remove the bottom cover of the laptop.

      +
      +
      +
      +

      ns5x chips

      +
      +
      +

      nv4x chips

      +
      +
      +
      +
    2. +
    3. +

      Disconnect the primary battery. (1)

      +
    4. +
    5. Disconnect the CMOS battery. (2)
    6. +
    7. +

      Attach a WSON-8 probe to the SPI flash chip. (3)

      +
      +

      For TGL devices use SOIC clip instead of WSON

      +
      +
    8. +
    9. +

      Backup the current firmware, in case you want to be able to restore it + at some point:

      +
      flashrom -p ch341a_spi -r bios_backup.rom
      +
      +
    10. +
    11. +

      Install Dasharo BIOS, replacing [path] with the path to the firmware + image you want to flash, e.g. novacustom_ns5x_adl_full_v1.4.0.rom

      +
      flashrom -p ch341a_spi -w [path]
      +
      +
    12. +
    13. +

      Detach the WSON-8 probe.

      +
    14. +
    15. Connect the primary battery and reconnect the CMOS battery
    16. +
    17. Power on the laptop. The laptop may shut down once after training the memory.
    18. +
    +

    EC firmware installation

    +

    Currently, the latest flashrom release lacks support for flashing ITE +embedded controllers such as the ones present in NovaCustom laptops. Because +of this, we need to build flashrom from source. Run the following commands +on the target laptop:

    +
      +
    1. +

      Install build dependencies:

      +
      apt update
      +apt upgrade
      +apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson
      +
      +
    2. +
    3. +

      Obtain source code:

      +
      git clone https://github.com/dasharo/flashrom.git
      +cd flashrom
      +
      +
    4. +
    5. +

      Build flashrom:

      +
      make
      +sudo make install
      +
      +
    6. +
    7. +

      Make a backup of the EC firmware:

      +
      +

      Remember to store the backup on the separate device in case flashing +fails.

      +
      +
      flashrom -p ite_ec -r ec_backup.rom
      +
      +
    8. +
    9. +

      Install the EC firmware:

      +
      +

      Warning: After running this command, the internal keyboard and power +button will stop responding until the device is power cycled (all +power must be removed, including the internal battery). Be prepared +to disconnect the battery after updating the EC.

      +

      Alternatively, you can boot up the laptop without the battery +connected and power it from an AC adapter. Then, once the EC update +is complete, disconnect the AC adapter to power off the laptop.

      +
      +

      Run the following command, replacing [path] with the path to the EC +firmware you want to flash, e.g. novacustom_ns5x_adl_ec_v1.4.0.rom

      +
      flashrom -p ite_ec -w [path]
      +
      +
    10. +
    +

    Successful installation of Dasharo EC finishes the initial deployment +process.

    +
    +
    +
    +
    +

    Initial deployment

    +

    To ensure a smooth deployment process, it is recommended to use the latest +version of DTS available from the releases +page. Once you have obtained it, you can +then proceed with following the Dasharo zero-touch initial deployment +section +procedure. This will help you set up Dasharo effectively and without manual +intervention.

    +

    If something went wrong or EC installation was not done, the firmware will +print an error string during boot:

    +

    +

    OR

    +

    +

    In such case please follow the EC firmware update instructions for a specific +board variant.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified/novacustom/overview/index.html b/unified/novacustom/overview/index.html new file mode 100644 index 00000000000..2382d935180 --- /dev/null +++ b/unified/novacustom/overview/index.html @@ -0,0 +1,5914 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    +

    Hardware

    +
    +
    +
    +

    The NovaCustom NS5x/7x 12th Gen section is related to the two physical +NovaCustom laptops based on the 12th generation Intel Core processor:

    + +

    +
    +
    +

    The NovaCustom NV4x 12th Gen section is related to the one physical +NovaCustom laptops based on the 12th generation Intel Core processor:

    + +

    +
    +
    +

    The NovaCustom NS5x/7x 11th Gen section is related to the two physical +NovaCustom laptops based on the 11th generation Intel Core processor:

    + +

    +
    +
    +

    The NovaCustom NV4x 11th Gen section is related to the one physical +NovaCustom laptops based on the 11th generation Intel Core processor:

    + +

    +
    +
    +
    +

    For more information on the hardware, please refer to the references in above +links.

    +

    Firmware

    +

    Each firmware release contains of two parts:

    + +

    They both interact with each other tightly, so keeping their compatible versions +in in sync is important. Information on compatibility should be always explained +in the release pages:

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified/novacustom/recovery/index.html b/unified/novacustom/recovery/index.html new file mode 100644 index 00000000000..353f0ac8edf --- /dev/null +++ b/unified/novacustom/recovery/index.html @@ -0,0 +1,6056 @@ + + + + + + + + + + + + + + + + + + Recovery - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Recovery

    +

    Prerequisites

    +

    To proceed with the recovery procedure the backup with the vendor firmware or +vendor EC firmware will be necessary eg. bios_backup.rom, ec_backup.rom.

    +

    The backup file should be generated before making any changes in the device +flash chip according to documentation:

    + +
    +

    Restoring vendor BIOS requires restoring a compatible version of EC firmware. + There is currently no way to do this internally.

    +
    +

    External flashing

    +

    BIOS recovery

    +

    Follow the Initial deployment +section to perform the external flash. When running the flashrom commands use a +backup file you've prepared previously, like bios_backup.rom.

    +

    EC firmware recovery

    +

    The procedure will be slightly different depending on the model of your laptop.

    +
    +
    +
    +

    You will need:

    +
      +
    • an Arduino Mega 2560
    • +
    • a 24-pin FFC cable with a 1.0mm pitch, same-sided (connectors on the same side + on both ends of the cable)
    • +
    • a 24-pin FFC breakout board with a 1.0mm pitch FFC connector and a 2.54mm + pitch pin header
    • +
    • USB-A to USB-B cable to connect the Arduino to the host
    • +
    • USB-C cable for grounding
    • +
    +
    +
    +

    You will need:

    +
      +
    • an Arduino Mega 2560
    • +
    • a 24-pin FFC cable with a 0.5mm pitch, same-sided (connectors on the same side + on both ends of the cable)
    • +
    • a 24-pin FFC breakout board with a 0.5mm pitch FFC connector and a 2.54mm + pitch pin header
    • +
    • USB-A to USB-B cable to connect the Arduino to the host
    • +
    • USB-C cable for grounding
    • +
    +
    +
    +
    +

    The full set for EC firmware recovery is available at our online shop.

    +

    Preparation

    +
      +
    • Clone the EC repository:
    • +
    +
    git clone https://github.com/Dasharo/ec.git
    +cd ec
    +
    +
      +
    • Install dependencies:
    • +
    +
    ./scripts/deps.sh
    +
    +
      +
    • If rustup was installed as part of the previous step, run:
    • +
    +
    source $HOME/.cargo/env
    +
    +
      +
    • +

      Connect the Arduino to the computer using a USB-A to USB-B cable

      +
    • +
    • +

      Build and flash firmware for the Arduino, which will serve as the flasher:

      +
    • +
    +
    make BOARD=arduino/mega2560
    +make BOARD=arduino/mega2560 flash
    +
    +

    Flashing

    +
      +
    • Unscrew the bottom cover from the laptop
    • +
    +
    +
    +
    +

    +
    +
    +

    +
    +
    +
    +
      +
    • Disconnect the battery (1)
    • +
    +
    +

    All power must be removed from the laptop during flashing.

    +
    +

    +
      +
    • Reattach the bottom cover (without screwing it in) and flip the laptop over
    • +
    • Using a prying tool like a credit card, pull up the keyboard from the laptop
    • +
    +
    +

    Start prying at the top of the keyboard. Be extra careful when removing the +keyboard to avoid damaging the keyboard cable, which is extremely fragile

    +
    +
    +
    +
    +

    +
    +
    +

    +
    +
    +
    +
      +
    • Disconnect the keyboard from the laptop
    • +
    +
    +
    +
    +

    +
    +
    +

    +
    +
    +
    +
      +
    • Connect the USB-C cable to the Thunderbolt port on the laptop and to the host + computer. This will provide grounding
    • +
    • Connect the FFC cable to the FFC breakout board
    • +
    +
    +
    +
    +

    +
    +

    Note: In the example above, the FFC connector on the breakout has the pins +on the bottom side of the connector and is located on the same +side as the pins connecting to the Arduino. If your breakout is different, +you may need an FFC cable with connectors on the opposite sides.

    +
    +
    +
    +

    +
    +

    Note: In the example above, the FFC connector on the breakout has the pins +on the upper side of the connector and is located on the side +opposite of the pins connecting to the Arduino. If your breakout +is different, you may need an FFC cable with connectors on the +opposite sides.

    +
    +
    +
    +
    +
      +
    • Insert the breakout into Arduino's digital pin header, pins 22-45, with the + FFC connector facing outwards
    • +
    +

    +
      +
    • Connect the other end of the FFC cable to the keyboard connector on the + laptop, taking care to align pin 1 of the FFC cable to pin 1 (leftmost) pin + of the connector
    • +
    +
    +
    +
    +

    +
    +
    +

    +
    +
    +
    +
      +
    • Connect the Arduino to the host using the USB-A to USB-B cable
    • +
    • Build the flashing utility:
    • +
    +
    cargo build --manifest-path ecflash/Cargo.toml --example isp --release
    +
    +
      +
    • Flash the firmware:
    • +
    +
    sudo ecflash/target/release/examples/isp [path to EC backup]
    +
    +

    The output will contain:

    +
    Buffer size: 128
    +ID: 5570 VER: 2
    +
    +

    If it contains other ID value or the connection times out, reattach the FFC +cable to the laptop and the breakout board. VER value may vary between models.

    +
      +
    • Reassemble the laptop: disconnect the Arduino from the laptop, reattach the + keyboard, disconnect the USB-C cable, reconnect the battery and screw in the + bottom cover
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/unified/novacustom/rgb-keyboard/index.html b/unified/novacustom/rgb-keyboard/index.html new file mode 100644 index 00000000000..1e4bd46b514 --- /dev/null +++ b/unified/novacustom/rgb-keyboard/index.html @@ -0,0 +1,5865 @@ + + + + + + + + + + + + + + + + + + RGB keyboard - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    NovaCustom NS5x/7x RGB keyboard

    +

    The NS5x/7x laptop features an RGB backlight keyboard. Dasharo implements full +driverless backlight control using only the hotkeys on the keyboard. The +keyboard backlight configuration set in the operating system is saved when the +system is shut down and restored just before next system boot.

    +

    Usage

    +

    The backlight can be operated using the hotkeys on the numpad:

    +
      +
    • Fn + / - Next color
    • +
    • Fn + * - Toggle On / Off
    • +
    • Fn + - - Brightness down
    • +
    • Fn + + - Brightness up
    • +
    +

    The backlight has the following color modes:

    +
      +
    • White (default)
    • +
    • Red
    • +
    • Green
    • +
    • Blue
    • +
    • Yellow
    • +
    • Magenta
    • +
    • Cyan
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/value-prop/compatibility/index.html b/value-prop/compatibility/index.html new file mode 100644 index 00000000000..c7429db7792 --- /dev/null +++ b/value-prop/compatibility/index.html @@ -0,0 +1,5803 @@ + + + + + + + + + + + + + + + + + + Compatibility - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Compatibility Module

    +

    From communication bus standards, through industry specifications like ACPI and +ending up with support for Operating Systems, each platform needs set of +compatibility criteria which have to be maintained across life cycle of market +availability and sometimes even after it.

    +

    This section describes what compatibility features Dasharo offer and how it +make sure their availability in every firmware release.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/value-prop/marketing/index.html b/value-prop/marketing/index.html new file mode 100644 index 00000000000..c9702b46b17 --- /dev/null +++ b/value-prop/marketing/index.html @@ -0,0 +1,5889 @@ + + + + + + + + + + + + + + + + + + Marketing - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Marketing Module

    +

    We think every advanced piece of software requires correct communication to all +users who will interact with it. Marketing module helps in organizing and +delivering information required to understand and correctly leverage software +produced by Dasharo Ecosystem.

    +

    Key Embedded Firmware marketing issues

    +

    Differentiation through firmware

    +

    Most hardware vendors do not leverage ability to differentiate through firmware +features, which is way easier then designing new hardware.

    + + +

    Products

    +
      +
    • Embedded Firmware Release
        +
      • Website
      • +
      • Newsletter
      • +
      • Repository
      • +
      +
    • +
    • Community and Customer Support
        +
      • Issues repository maintenance
      • +
      • Documentation repository maintenance
      • +
      +
    • +
    • Conference speaking
    • +
    • Technical Sales Support
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/value-prop/overview/index.html b/value-prop/overview/index.html new file mode 100644 index 00000000000..e304f843e48 --- /dev/null +++ b/value-prop/overview/index.html @@ -0,0 +1,5812 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Value Proposition

    +

    There are multiple reasons why you should choose Dasharo. In this section we +will try to structure and present whole value that Dasharo can bring to your +hardware.

    +
      +
    • Marketing - Dasharo Marketing Module was created to resolve + problems of hardware vendors with communicating + Embedded Firmware value.
    • +
    +

    Finally, we agree with John Hennessy and David Patterson that we enter era of +New Golden Age of domain +specific computing with open architectures and open-source implementations. +What eventually will lead to more +firmware everywhere. +Addressing mentioned areas is just beginning for Dasharo we think following +years would need way more firmware expertise then at any other point in time.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/value-prop/security/index.html b/value-prop/security/index.html new file mode 100644 index 00000000000..46d7980d839 --- /dev/null +++ b/value-prop/security/index.html @@ -0,0 +1,5803 @@ + + + + + + + + + + + + + + + + + + Security - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Security Module

    +

    This module gathers all security features Dasharo Ecosystem can bring to your +platform through software. No matter if this is new hardware at design stage, +prototype waiting for bring up or well-established platform looking for +after-market boost.

    +

    In this section we will explain what features Dasharo provide in area of +security.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/building-manual/index.html b/variants/asus_kgpe_d16/building-manual/index.html new file mode 100644 index 00000000000..be470ddbf7a --- /dev/null +++ b/variants/asus_kgpe_d16/building-manual/index.html @@ -0,0 +1,5905 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Building manual

    +

    Building coreboot

    +

    To build coreboot image, follow the steps below:

    +
      +
    1. +

      Clone the coreboot repository:

      +
      git clone https://github.com/dasharo/coreboot.git -b asus_kgpe-d16/release
      +
      +
    2. +
    3. +

      Get the submodules:

      +
      cd coreboot
      +git submodule update --init --recursive --checkout
      +
      +
    4. +
    5. +

      Start docker container:

      +
      docker run --rm -it -u $UID \
      +   -v $PWD:/home/coreboot/coreboot \
      +   -w /home/coreboot/coreboot \
      +   coreboot/coreboot-sdk:0ad5fbd48d /bin/bash
      +
      +
    6. +
    7. +

      Inside of the container, configure and start the build process:

      +
      (docker)cp configs/config.asus_kgpe_d16_<variant> .config
      +(docker)make olddefconfig
      +(docker)make
      +
      +
    8. +
    +

    This will produce a debug binary placed in build/coreboot.rom for a 2MB flash +chip. In order to build for 8MB or 16MB chip use the configs/config.asus_kgpe_d16_8M +and configs/config.asus_kgpe_d16_16M respectively.

    +

    Dasharo v0.1.0 for KGPE-D16 supports only 8MB target with configs/config.asus_kgpe_d16.

    +

    To flash coreboot refer to Flashing section in the hardware setup page.

    +

    Other variants

    +

    Since the Dasharo v0.3.0 release the firmware comes in two more variatns: with +TPM 1.2 and TPM 2.0 support. Now the possible confis to use are:

    +
      +
    • configs/config.asus_kgpe_d16_vboot_tpm12 - 2MB target with vboot and TPM 1.2
    • +
    • configs/config.asus_kgpe_d16_vboot_tpm2 - 2MB target with vboot and TPM 2.0
    • +
    • configs/config.asus_kgpe_d16_8M_vboot_tpm12 - 8MB target with vboot and TPM 1.2
    • +
    • configs/config.asus_kgpe_d16_8M_vboot_tpm2 - 8MB target with vboot and TPM 2.0
    • +
    • configs/config.asus_kgpe_d16_16M_vboot_tpm12 - 16MB target with vboot and + TPM 1.2
    • +
    • configs/config.asus_kgpe_d16_16M_vboot_tpm2 - 16MB target with vboot and + TPM 2.0
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/fan-control/index.html b/variants/asus_kgpe_d16/fan-control/index.html new file mode 100644 index 00000000000..958bfdb235e --- /dev/null +++ b/variants/asus_kgpe_d16/fan-control/index.html @@ -0,0 +1,6091 @@ + + + + + + + + + + + + + + + + + + Fan Control - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Automatic fan control for ASUS KGPE-D16

    +

    Starting from KGPE-D16 Dasharo release v0.2.0, coreboot implements automatic +fan control. The feature is realized on the Nuvoton W83795 hardware monitor.

    +

    Testing fan control

    +

    In order to check the monitoring values of W83795, one needs to install some +packages:

    +
    apt-get install lm-sensors
    +
    +

    Linux kernel by default should come with w83795 module. Load it with the +following command:

    +
    modprobe w83795
    +
    +

    The dmesg should contain the following message after loading the module:

    +
    i2c i2c-1: Found w83795g rev. B at 0x2f
    +w83795 1-002f: hwmon_device_register() is deprecated.
    +     Please convert the driver to use hwmon_device_register_with_info().
    +
    +

    To check the monitoring values execute:

    +
    sensors
    +
    +

    The output should be similar to the one below:

    +
    k10temp-pci-00cb
    +Adapter: PCI adapter
    +temp1:        +36.5°C  (high = +70.0°C)
    +                       (crit = +106.0°C, hyst = +101.0°C)
    +
    +w83795g-i2c-1-2f
    +Adapter: SMBus PIIX4 adapter at 0b20
    +in0:         910.00 mV (min =  +0.90 V, max =  +1.50 V)
    +in1:           0.00 V  (min =  +0.90 V, max =  +1.50 V)  ALARM
    +in2:           1.53 V  (min =  +1.10 V, max =  +1.61 V)
    +in3:          22.00 mV (min =  +1.10 V, max =  +1.61 V)  ALARM
    +in4:           1.21 V  (min =  +1.14 V, max =  +1.25 V)
    +in5:           0.00 V  (min =  +1.14 V, max =  +1.25 V)  ALARM
    +in6:           1.19 V  (min =  +1.05 V, max =  +1.25 V)
    +in7:           1.82 V  (min =  +1.70 V, max =  +1.90 V)
    +in8:           1.21 V  (min =  +1.14 V, max =  +1.25 V)
    +in9:           1.09 V  (min =  +1.05 V, max =  +1.15 V)
    +in10:          1.60 V  (min =  +1.50 V, max =  +1.63 V)
    +in11:        752.00 mV (min =  +0.00 V, max =  +0.01 V)  ALARM
    ++3.3V:         3.26 V  (min =  +2.96 V, max =  +3.63 V)
    +3VSB:          3.28 V  (min =  +2.96 V, max =  +3.63 V)
    +Vbat:          3.16 V  (min =  +2.70 V, max =  +3.63 V)
    +in15:          1.02 V  (min =  +0.91 V, max =  +1.08 V)
    +in16:          1.55 V  (min =  +1.50 V, max =  +1.62 V)
    +fan1:        1157 RPM  (min =  329 RPM)
    +fan2:           0 RPM  (min =  329 RPM)  ALARM
    +fan3:           0 RPM  (min =  329 RPM)  ALARM
    +fan4:           0 RPM  (min =  329 RPM)  ALARM
    +fan5:           0 RPM  (min =  329 RPM)  ALARM
    +fan6:           0 RPM  (min =  329 RPM)  ALARM
    +fan7:           0 RPM  (min =  329 RPM)  ALARM
    +fan8:           0 RPM  (min =  329 RPM)  ALARM
    +temp1:        +37.2°C  (high = +70.0°C, hyst = +65.0°C)
    +                       (crit = +90.0°C, hyst = +80.0°C)  sensor = thermal diode
    +temp2:        -62.5°C  (high =  +0.0°C, hyst =  +0.0°C)
    +                       (crit =  +0.0°C, hyst =  +0.0°C)  sensor = thermistor
    +temp3:        -62.5°C  (high =  +0.0°C, hyst =  +0.0°C)
    +                       (crit =  +0.0°C, hyst =  +0.0°C)  sensor = thermistor
    +temp7:        +36.8°C  (high = +70.0°C, hyst = +65.0°C)
    +                       (crit = +90.0°C, hyst = +80.0°C)  sensor = AMD AMDSI
    +temp8:         +0.0°C  (high = +70.0°C, hyst = +65.0°C)
    +                       (crit = +90.0°C, hyst = +80.0°C)  sensor = AMD AMDSI
    +intrusion0:  ALARM
    +beep_enable: disabled
    +
    +fam15h_power-pci-00c4
    +Adapter: PCI adapter
    +power1:       49.44 W  (crit = 139.72 W)
    +
    +k10temp-pci-00c3
    +Adapter: PCI adapter
    +temp1:        +36.8°C  (high = +70.0°C)
    +                       (crit = +106.0°C, hyst = +99.0°C)
    +
    +

    The CPU temperature is indicated with k10temp and w83795g temp7 inputs and the +CPU fan speed is indicated by fan1.

    +

    Alternative automatic fan control

    +

    If you are using a coreboot for KGPE-D16 built from 4.11 branch or earlier +there is also a software option to enable automatic fan control without +modifications in coreboot. In order to configure the fan control, one needs to +install the following package:

    +
    apt-get install fancontrol
    +
    +

    Now we need to configure the fancontrol application by generating a +/etc/fancontrol file containing the relation of temperature inputs to fans. +Be sure that w83795 module is loaded (you may also add the module to be loaded +automatically with echo w38795 >> /etc/modules). Execute:

    +
    pwmconfig
    +
    +

    This application will lead you through the process of identifying the relation +of the fans and temperatures. Simply follow the instructions printed on the +console. At the end do not select save and ext, just configure all PWMs, e.g.:

    +
    Select fan output to configure, or other action:
    +1) hwmon0/device/pwm1  3) Just quit       5) Show configuration
    +2) Change INTERVAL     4) Save and quit
    +select (1-n): 1
    +
    +

    Then set up temperature correlation by selecting either k10temp or +hwmon0/device/temp7_input as temperature source for the fan1 (they should +report identical temperature). When finished, select Save and quit. For a +single CPU - single fan configuration it should result in a file like this:

    +
    INTERVAL=10
    +DEVPATH=hwmon0=devices/pci0000:00/0000:00:14.0/i2c-1/1-002f
    +DEVNAME=hwmon0=w83795g
    +FCTEMPS=hwmon0/device/pwm1=hwmon0/device/temp7_input
    +FCFANS= hwmon0/device/pwm1=hwmon0/device/fan1_input
    +MINTEMP=hwmon0/device/pwm1=20
    +MAXTEMP=hwmon0/device/pwm1=80
    +MINSTART=hwmon0/device/pwm1=150
    +MINSTOP=hwmon0/device/pwm1=0
    +
    +
    +

    NOTE: hwmonX may be different depending on the order of loaded modules, if +loaded automatically via etc/modules it may be hwmon0, if loaded using +modprobe it may be hwmon3 or hwmon4.

    +
    +

    Now that the configuration file is ready, time to start the fancontrol service:

    +
    systemctl enable fancontrol
    +systemctl start fancontrol
    +systemctl status fancontrol
    +● fancontrol.service - fan speed regulator
    +     Loaded: loaded (/lib/systemd/system/fancontrol.service; enabled; vendor pr>
    +     Active: active (running) since Wed 2021-12-08 11:23:23 CET; 9min ago
    +       Docs: man:fancontrol(8)
    +             man:pwmconfig(8)
    +   Main PID: 1318 (fancontrol)
    +      Tasks: 2 (limit: 19153)
    +     Memory: 1.3M
    +        CPU: 1.340s
    +     CGroup: /system.slice/fancontrol.service
    +             ├─1318 /bin/bash /usr/sbin/fancontrol
    +             └─2228 sleep 10
    +
    +Dec 08 11:23:24 debian fancontrol[1318]:   Controls hwmon0/device/fan1_input
    +Dec 08 11:23:24 debian fancontrol[1318]:   MINTEMP=20
    +Dec 08 11:23:24 debian fancontrol[1318]:   MAXTEMP=80
    +Dec 08 11:23:24 debian fancontrol[1318]:   MINSTART=150
    +Dec 08 11:23:24 debian fancontrol[1318]:   MINSTOP=0
    +Dec 08 11:23:24 debian fancontrol[1318]:   MINPWM=0
    +Dec 08 11:23:24 debian fancontrol[1318]:   MAXPWM=255
    +Dec 08 11:23:24 debian fancontrol[1318]:   AVERAGE=1
    +Dec 08 11:23:24 debian fancontrol[1318]: Enabling PWM on fans...
    +Dec 08 11:23:24 debian fancontrol[1318]: Starting automatic fan control...
    +
    +

    It should print the service is running. Now check the fan speed with sensors +command from lm-sensors package (install it if you haven't done it yet). For +CPU temperature of 40 Celsius degrees the fan1 speed should be a little bit +lower than 3000 RPM. Note it is advised to stop and disable the fancontrol +service when using Dasharo for KGPE-D16 release v0.2.0 or newer:

    +
    systemctl disable fancontrol
    +systemctl stop fancontrol
    +
    +

    Verifying fan speed adaptation

    +

    To check if the fan speed adapts to the temperature you may install stress-ng:

    +
    apt-get install stress-ng
    +
    +

    With the following command you may cause a 2 minutes stress on the CPUs and +raise its temperature (it should hit about 70 Celsius degrees with that):

    +
    stress-ng --cpu 16 --io 8 --vm 4 --vm-bytes 4G --timeout 120s --metrics
    +
    +

    Simultaneously watch the fan speed with sensors command. Example for +fancontrol service:

    +
    k10temp-pci-00cb
    +Adapter: PCI adapter
    +temp1:        +52.4°C  (high = +70.0°C)
    +
    +w83795g-i2c-1-2f
    +Adapter: SMBus PIIX4 adapter at 0b20
    +in0:           1.09 V  (min =  +0.90 V, max =  +1.50 V)
    +in1:           0.00 V  (min =  +0.90 V, max =  +1.50 V)  ALARM
    +in2:           1.53 V  (min =  +1.10 V, max =  +1.61 V)
    +in3:          22.00 mV (min =  +1.10 V, max =  +1.61 V)  ALARM
    +in4:           1.21 V  (min =  +1.14 V, max =  +1.25 V)
    +in5:           0.00 V  (min =  +1.14 V, max =  +1.25 V)  ALARM
    +in6:           1.20 V  (min =  +1.05 V, max =  +1.25 V)
    +in7:           1.82 V  (min =  +1.70 V, max =  +1.90 V)
    +in8:           1.21 V  (min =  +1.14 V, max =  +1.25 V)
    +in9:           1.09 V  (min =  +1.05 V, max =  +1.15 V)
    +in10:          1.59 V  (min =  +1.50 V, max =  +1.63 V)
    ++3.3V:         3.24 V  (min =  +2.96 V, max =  +3.63 V)
    +3VSB:          3.28 V  (min =  +2.96 V, max =  +3.63 V)
    +Vbat:          3.06 V  (min =  +2.70 V, max =  +3.63 V)
    +in15:          1.01 V  (min =  +0.91 V, max =  +1.08 V)
    +in16:          1.54 V  (min =  +1.50 V, max =  +1.62 V)
    +fan1:        4299 RPM  (min =  329 RPM)
    +fan2:           0 RPM  (min =  329 RPM)  ALARM
    +fan3:           0 RPM  (min =  329 RPM)  ALARM
    +fan4:           0 RPM  (min =  329 RPM)  ALARM
    +fan5:           0 RPM  (min =  329 RPM)  ALARM
    +fan6:           0 RPM  (min =  329 RPM)  ALARM
    +fan7:           0 RPM  (min =  329 RPM)  ALARM
    +fan8:           0 RPM  (min =  329 RPM)  ALARM
    +temp1:        +52.5°C  (high = +70.0°C, hyst = +65.0°C)
    +                       (crit = +85.0°C, hyst = +80.0°C)  sensor = thermal diode
    +temp7:        +52.8°C  (high = +70.0°C, hyst = +65.0°C)
    +                       (crit = +85.0°C, hyst = +80.0°C)  sensor = AMD AMDSI
    +temp8:         +0.0°C  (high = +70.0°C, hyst = +65.0°C)
    +                       (crit = +85.0°C, hyst = +80.0°C)  sensor = AMD AMDSI
    +intrusion0:  ALARM
    +beep_enable: disabled
    +
    +fam15h_power-pci-00c4
    +Adapter: PCI adapter
    +power1:      141.35 W  (crit = 139.72 W)
    +
    +k10temp-pci-00c3
    +Adapter: PCI adapter
    +temp1:        +52.9°C  (high = +70.0°C)
    +
    +

    For the software method with fancontrol service the fan speed adapts pretty +quickly, but when using the automatic fan control from Dasharo release the spin +up/down time is longer. coreboot configures the W83795 in Thermal Cruise mode +which automatically probes the CPU temperature via AMD SB TSI interface. The +target temperature is set to 50 Celsius degrees which means the chip will try +to keep the CPU temperature to be around 50 degrees by adapting the fan speed. +Summing it up, the longer the CPU temperature exceeds 50 degrees the faster the +fan will spin by slowly increasing the RPM. When the temperature is below 50 +degrees for a long period of time the fan rotates with a speed of around 1000 +RPM. The critical temperature is set to 90 Celsius degrees. When this point is +reached the W83795 should spin up to fans to full speed.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/firmware-update/index.html b/variants/asus_kgpe_d16/firmware-update/index.html new file mode 100644 index 00000000000..5b0d31bd396 --- /dev/null +++ b/variants/asus_kgpe_d16/firmware-update/index.html @@ -0,0 +1,5875 @@ + + + + + + + + + + + + + + + + + + Firmware update - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Firmware update

    +

    Following documentation describes the process of Dasharo open-source firmware +update.

    +

    Build flashrom

    +

    Install build dependencies:

    +
    apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson
    +
    +

    Obtain source code:

    +
    git clone https://review.coreboot.org/flashrom.git
    +cd flashrom
    +
    +

    Build flashrom:

    +
    make
    +sudo make install
    +
    +

    Updating Dasharo

    +

    The whole bios region must be updated.

    +
    flashrom -p internal -w [path] --ifd -i bios
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/flash_chip_adapter/3D_model.jpg b/variants/asus_kgpe_d16/flash_chip_adapter/3D_model.jpg new file mode 100644 index 00000000000..a8c206bcc51 Binary files /dev/null and b/variants/asus_kgpe_d16/flash_chip_adapter/3D_model.jpg differ diff --git a/variants/asus_kgpe_d16/flash_chip_adapter/3D_model_2.jpg b/variants/asus_kgpe_d16/flash_chip_adapter/3D_model_2.jpg new file mode 100644 index 00000000000..32074481125 Binary files /dev/null and b/variants/asus_kgpe_d16/flash_chip_adapter/3D_model_2.jpg differ diff --git a/variants/asus_kgpe_d16/flash_chip_adapter/flash_chip_adapter_1.jpg b/variants/asus_kgpe_d16/flash_chip_adapter/flash_chip_adapter_1.jpg new file mode 100644 index 00000000000..6bee4d42a86 Binary files /dev/null and b/variants/asus_kgpe_d16/flash_chip_adapter/flash_chip_adapter_1.jpg differ diff --git a/variants/asus_kgpe_d16/flash_chip_adapter/flash_chip_adapter_2.jpg b/variants/asus_kgpe_d16/flash_chip_adapter/flash_chip_adapter_2.jpg new file mode 100644 index 00000000000..a0d348a7370 Binary files /dev/null and b/variants/asus_kgpe_d16/flash_chip_adapter/flash_chip_adapter_2.jpg differ diff --git a/variants/asus_kgpe_d16/hardware-matrix/index.html b/variants/asus_kgpe_d16/hardware-matrix/index.html new file mode 100644 index 00000000000..c1e32fe7d87 --- /dev/null +++ b/variants/asus_kgpe_d16/hardware-matrix/index.html @@ -0,0 +1,6007 @@ + + + + + + + + + + + + + + + + + + Hardware configuration matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    This document describes the hardware configurations used for validation of the +coreboot port on ASUS KGPE-D16 platforms.

    +

    ASUS KGPE-D16 8MB

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    Board revision1.03G
    CPUAMD Opteron(TM) Processor 6282 SE
    CPU Cooler
    RAMDDR3 16GB Kingston KVR16R11D4/16
    Flash memoryWinbond W25Q64FV 8MB
    NetworkLocal network wired connection
    Attached devices1. Goodram 16GB USB stick
    2. ASUS TPM-L R2.0 module (chip Infineon SLB9665 TT2.0)
    Power Supply700 W ATX type power supply
    Power Control1. Sonoff S20 switch
    2. Goldpin cables (RTE <-> Board connection)
    Remote Testing Environment1. RTE v1.0.0 (firmware v0.5.3) connected via RS232
    2. Goldpin cables + qspimux (RTE <-> flash memory connection)
    TPMInfineon SLB9665 TT2.0
    +
    +

    Standard testing procedure is performed on setup without TPM module.

    +
    +

    ASUS KGPE-D16 16MB

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    Board revision1.03G
    CPUAMD Opteron(TM) Processor 6282 SE
    CPU Cooler
    RAMDDR3 16GB Kingston KVR16R11D4/16
    Flash memoryWinbond W25Q128JV 16MB
    NetworkLocal network wired connection
    Attached devices:1. Goodram 16GB USB stick
    2. ASUS TPM 1.2 Rev 1.02h module (chip Infineon SLB9635 TT 1.2)
    3. Post Debug Card
    Power Supply700 W ATX type power supply
    Power Control:1. Sonoff S20 switch
    2. Goldpin cables (RTE <-> Board connection)
    Remote Testing Environment1. RTE v1.0.0 (firmware v0.5.3) connected via RS232
    2. POMONA Clip + DIP8/SOIC8 adapter (RTE <-> flash memory connection)
    TPMInfineon SLB9635 TT1.2
    +
    +

    Standard testing procedure is performed on setup without TPM module.

    +
    +

    ASUS KGPE-D16 board ports, slots, and connectors description is available in +the manufacturer +documentation +(page 2-7).

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/initial-deployment/index.html b/variants/asus_kgpe_d16/initial-deployment/index.html new file mode 100644 index 00000000000..afd1cb05014 --- /dev/null +++ b/variants/asus_kgpe_d16/initial-deployment/index.html @@ -0,0 +1,5909 @@ + + + + + + + + + + + + + + + + + + Initial deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Initial deployment

    +

    Initial deployment of Dasharo firmware on ASUS KGPE-D16 can be done:

    +
      +
    • using DTS,
    • +
    • manually.
    • +
    +

    Initial deployment using DTS

    +

    To ensure a smooth deployment process, it is recommended to use the latest +version of DTS available from the releases +page. Once you have obtained it, you can +then proceed with following the Dasharo zero-touch initial deployment +section +procedure. This will help you set up Dasharo effectively and without manual +intervention.

    +

    Initial deployment manually

    +

    Initial flashing of Dasharo firmware can be done from Linux using flashrom with +the internal programmer. This document describes the process of building, +installing and running flashrom on Ubuntu 20.04.

    +

    Build flashrom

    +

    Currently, the latest flashrom release lacks support for Comet Lake U internal +flashing. Because of this, we need to build flashrom from source.

    +

    Install build dependencies:

    +
    apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson
    +
    +

    Obtain source code:

    +
    git clone https://review.coreboot.org/flashrom.git
    +cd flashrom
    +
    +

    Build flashrom:

    +
    make
    +sudo make install
    +
    +

    Reading flash contents

    +

    Always prepare a backup of the current firmware image. To read from the flash +and save it to a file (backup.rom), execute the following command:

    +
    flashrom -p internal -r backup.rom
    +
    +

    Flashing Dasharo

    +

    To flash Dasharo on the platform, execute the following command - replace +[path] with the path to the Dasharo image you want to flash, e.g. +asus_kgpe-d16_v0.3.0_2M_vboot_TPM1.2.rom.

    +
    flashrom -p internal -w [path]
    +
    +

    This will flash the full image, including the Intel ME. The operation requires +a hard reset of the platform. To perform a hard reset:

    +
      +
    1. Power off the platform. Note, it may not power off completely due to flashed + ME.
    2. +
    3. Disconnect power supply from the board when OS finishes all tasks after + power off (the screen goes dark or black).
    4. +
    5. The platform should power on normally now. You can connect the battery back + if it was disconnected.
    6. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/overview/index.html b/variants/asus_kgpe_d16/overview/index.html new file mode 100644 index 00000000000..af8500cc860 --- /dev/null +++ b/variants/asus_kgpe_d16/overview/index.html @@ -0,0 +1,5821 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    +
      +
    • Releases - groups information about all releases.
    • +
    • Building manual - describes how to build Dasharo for + ASUS KGPE D-16.
    • +
    • Initial deployment - describes initial Dasharo + deployment methods (i. e. flashing new firmware) for ASUS KGPE D16.
    • +
    • Firmware update - explains supported Dasharo + open-source firmware update methods.
    • +
    • Recovery - gathers information on how to recover the platform + from potential failure.
    • +
    • Hardware configuration matrix - describes the + platform's hardware configuration used during the Dasharo firmware + validation procedure.
    • +
    • Test matrix - describes validation scope used during + Dasharo firmware validation procedure.
    • +
    • Fan Control - describes the method of testing the + automatic fan control mechanism.
    • +
    • Hardware Setup - describes the method of enabling external + flashing for ASUS KGPE-D16.
    • +
    • SPI write protection - describes the method of setting + the write protection for flash chip on ASUS KGPE-D16.
    • +
    • TPM measured boot - describes the measured boot behaviour + on ASUS KGPE D-16.
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/recovery/index.html b/variants/asus_kgpe_d16/recovery/index.html new file mode 100644 index 00000000000..bd7ba28a277 --- /dev/null +++ b/variants/asus_kgpe_d16/recovery/index.html @@ -0,0 +1,5869 @@ + + + + + + + + + + + + + + + + + + Recovery - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Recovery

    +

    Prequisitions

    +

    To proceed with the recovery procedurethe backup with the vendor firmware will +be necessary eg. backup.rom.

    +

    Backup file should be generated before making any changes in device flash +chip according to documentation in +Reading flash contents +section.

    +

    Internal flashing

    +

    If platform is booting properly it's possible to recover vendor firmware using +procedure described in +Flashing Dasharo section, setting path +to file with vendor firmware as [path] argument.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/releases/index.html b/variants/asus_kgpe_d16/releases/index.html new file mode 100644 index 00000000000..ab226f29007 --- /dev/null +++ b/variants/asus_kgpe_d16/releases/index.html @@ -0,0 +1,6062 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Release Notes

    +

    Following Release Notes describe status of Open Source Firmware development for +ASUS KGPE-D16.

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    +

    Subscribe to Release Newsletter

    +

    +

    Feel free to contact us on our Matrix Dasharo space.

    +

    Test results for this platform can be found +here.

    +

    v0.4.0 - 2022-09-12

    +

    Test results for this release can be found +here.

    +

    Changed

    +
      +
    • ACPI cleanup
    • +
    • Added missing PCI bridge initialization
    • +
    +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    asus_kgpe-d16_v0.4.0_16M_vboot_notpm.rom +sha256 +sha256.sig

    +

    asus_kgpe-d16_v0.4.0_16M_vboot_tpm12.rom +sha256 +sha256.sig

    +

    asus_kgpe-d16_v0.4.0_16M_vboot_tpm2.rom +sha256 +sha256.sig

    +

    asus_kgpe-d16_v0.4.0_8M_vboot_notpm.rom +sha256 +sha256.sig

    +

    asus_kgpe-d16_v0.4.0_8M_vboot_tpm12.rom +sha256 +sha256.sig

    +

    asus_kgpe-d16_v0.4.0_8M_vboot_tpm2.rom +sha256 +sha256.sig

    +

    asus_kgpe-d16_v0.4.0_vboot_notpm.rom +sha256 +sha256.sig

    +

    asus_kgpe-d16_v0.4.0_vboot_tpm12.rom +sha256 +sha256.sig

    +

    asus_kgpe-d16_v0.4.0_vboot_tpm2.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v0.3.0 - 2021-12-16

    +

    Added

    +
      +
    • TPM support
    • +
    • vboot support (see how to sign and protect the image here)
    • +
    • build targets for vboot with measured boot using TPM 1.2 and TPM 2.0
    • +
    +

    Fixed

    +
      +
    • cmos.layout being incorrectly mapped from RW CBFS during coreboot tables generation
    • +
    • CC6 storage area being incorrectly included in cbmem top calculations
    • +
    • ACPI DSDT LPC device name which caused TPM to be undetected by OS
    • +
    • SPI controller driver sometimes dropping bytes sent/received through SPI FIFO
    • +
    +

    Binaries

    +
      +
    • 2MB vboot TPM 1.2
    • +
    +

    asus_kgpe-d16_v0.3.0_2M_vboot_TPM1.2.rom +sha256 +sha256.sig

    +
      +
    • 2MB vboot TPM 2.0
    • +
    +

    asus_kgpe-d16_v0.3.0_2M_vboot_TPM2.0.rom +sha256 +sha256.sig

    +
      +
    • 8MB vboot TPM 1.2
    • +
    +

    asus_kgpe-d16_v0.3.0_8M_vboot_TPM1.2.rom +sha256 +sha256.sig

    +
      +
    • 8MB vboot TPM 2.0
    • +
    +

    asus_kgpe-d16_v0.3.0_8M_vboot_TPM2.0.rom +sha256 +sha256.sig

    +
      +
    • 16MB vboot TPM 1.2
    • +
    +

    asus_kgpe-d16_v0.3.0_16M_vboot_TPM1.2.rom +sha256 +sha256.sig

    +
      +
    • 16MB vboot TPM 2.0
    • +
    +

    asus_kgpe-d16_v0.3.0_16M_vboot_TPM2.0.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v0.2.0 - 2021-12-9

    +

    Added

    +
      +
    • coreboot resource allocator v4 support
    • +
    • Nuvoton W83795 HW monitor driver
    • +
    • automatic fan control with W83795
    • +
    • platform and silicon ramstage support
    • +
    • 2MB, 8MB and 16MB SPI flash targets
    • +
    • SeaBIOS, iPXE and nvramcui payloads
    • +
    +

    Binaries

    +
      +
    • 2MB target
    • +
    +

    asus_kgpe-d16_v0.2.0_2M.rom +sha256 +sha256.sig

    +
      +
    • 8MB target
    • +
    +

    asus_kgpe-d16_v0.2.0_8M.rom +sha256 +sha256.sig

    +
      +
    • 16MB target
    • +
    +

    asus_kgpe-d16_v0.2.0_16M.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v0.1.0 - 2021-11-10

    +

    Added

    +
      +
    • C bootblock support
    • +
    • postcar stage and no CAR global migration support
    • +
    • separated chipset and mainboard code
    • +
    • put non-mainboard specific romstage initialization to northirdge
    • +
    • support for relocatable ramstage with caching in CBMEM
    • +
    +

    Binaries

    +

    asus_kgpe-d16_v0.1.0.rom

    +

    asus_kgpe-d16_v0.1.0.rom.sha256

    +

    asus_kgpe-d16_v0.1.0.rom.sha256.sig

    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/setup/index.html b/variants/asus_kgpe_d16/setup/index.html new file mode 100644 index 00000000000..ec9f1146c4e --- /dev/null +++ b/variants/asus_kgpe_d16/setup/index.html @@ -0,0 +1,6221 @@ + + + + + + + + + + + + + + + + + + Hardware setup - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    RTE v.0.5.3 with ASUS KGPE-D16 connection

    +

    +

    Power supply

    +

    Power to the Asus KGPE-D16 is delivered by a common PC power supply. Simply +connect the power supply to ATX compatible connectors on the mainboard +(SSIPWR1, SSI12V1, SSI12V2).

    +

    SPI

    +

    BIOS SPI flash is a socketed DIP-8. There is no simple way to attach to it with +any tools. That is why we have thought about the +qspimux made by Felix Held which can +attach to various SPI modules footprints and sockets. The DIP-8 adapter +is put into the DIP-8 socket on the mainboard, which allows attaching the +qspimux SPI multiplexer. The multiplexer is responsible for switching between +the external SPI lines and the mainboard lines routed to the external SPI flash +chip. The external flash chip is soldered on a SOIC8 adapter, which is +connected to the qspimux. The connection of the +RTE and qspimux is as follows:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    RTE header J7 pinqspimux J101 pin
    1 (VCC)2 (VCC_PROG)
    2 (GND)7 (GND)
    3 (CS)1 (CS_PROG#)
    4 (SCLK)6 (CLK_PROG)
    5 (MISO)8 (IO0_DI_PROG)
    6 (MOSI)3 (IO1_DO_PROG)
    7 (NC)Not connected
    8 (NC)Not connected
    +

    Additionally, one has to tie the IO3_HOLD_PROG (qspimux pin 4) high, so connect +it to the 3.3V permanently. Another additional GPIO is required to control the +routing of SPI lines. The MUX_SEL (qspimux pin 9) decides whether +the programmer is allowed to access the SPI flash or the mainboard. One more +GPIO is used to control state of #WP of the flash chip by connecting GPIO to +IO2_WP_PROG.

    +

    The proposed connections used:

    +
      +
    • RTE GPIO400 to control MUX_SEL
    • +
    • RTE GPIO401 to control IO3_HOLD_PROG
    • +
    • RTE GPIO402 to control IO2_WP_PROG
    • +
    +

    Simple flashing script looks as follows:

    +
    # select flash <-> programmer
    +echo "0" > /sys/class/gpio/gpio400/value
    +# deassert SPI HOLD#
    +echo "1" > /sys/class/gpio/gpio401/value
    +
    +flashrom -w firmware.bin -p linux_spi:dev=/dev/spidev1.0,spispeed=16000
    +
    +# select flash <-> board
    +echo "1" > /sys/class/gpio/gpio400/value
    +
    +

    Controlling state of #WP:

    +
    # configure direction of the pin
    +echo "out" > /sys/class/gpio/gpio402/direction
    +
    +# deassert WP pin to disable hardware protection of status registers
    +echo "1" > /sys/class/gpio/gpio402/value
    +# assert WP pin to enable hardware protection of status registers
    +echo "0"  > /sys/class/gpio/gpio402/value
    +
    + + + + + + + + + + + + + + + + + + + + + +
    RTE header J10 pinqspimux J101 pin
    1 (GPIO400)9 (MUX_SEL)
    2 (GPIO401)4 (IO3_HOLD_PROG)
    3 (GPIO402)5 (IO2_WP_PROG)
    +

    +

    +
    +

    qspimux schematic is available here

    +
    +

    Serial

    +

    Asus KGPE-D16 has a DB9 serial connector for the debug UART. Connect it to the RTE +via RS232 DB9 cable.

    +

    +

    TPM

    +

    Asus KGPE-D16 has an LPC header for TPM or debugging. Since there is no other +option to connect a TPM, we use the header for that purpose.

    +

    IMPORTANT: Use only TPM modules which match their pinout with the board's +header! Using a spider web connection degrades the signal quality to the point +where CPU cannot properly talk to TPM via LPC bus. Tested with +PC Engines TPM module and failed to +succeed this way. Designing and producing proper TPM header and/or reliable +adapter, could solve this problem. The TwPM +project could help here in the future.

    +

    +

    TPM modules that were tested and verified to work in 3mdeb lab with coreboot:

    +
      +
    • ASUS TPM-L R2.0 module (chip Infineon SLB9665 TT 2.0)
    • +
    • ASUS TPM 1.2 Rev 1.02h module (chip Infineon SLB9635 TT 1.2)
    • +
    +

    Power management

    +

    Asus KGPE-D16 provides a front panel pin header (PANEL1):

    +

    + + + + + + + + + + + + + + + + + +
    RTE header J11 pinAsus KGPE-D16
    8 (OC buffer output)PANEL1 pin 11 (PWR)
    9 (OC buffer output)PANEL1 pin 17 (RESET)
    +

    Additionally, connect one of the PANEL1 ground pins to one of the ground pins on +RTE.

    +

    Manunal

    +

    For more details about the KGPE-D16, refer to +the manual.

    +

    Theory of operation

    +

    Flashing

    +

    There are two RTEs connected to two Asus KGPE-D16 boards:

    +
      +
    • 192.168.20.15
    • +
    • 192.168.4.111
    • +
    +

    Both boards are equipped with the qspimux and a replaced flash chip (Winbond +W25Q64FV 8MB). The flash chip is attached to the qspimux with an adapter +available with qspimux. Flashing may be done via the commands shown earlier or +the flash script which is present in the root directory of the RTE:

    +
    ./flash.sh coreboot.rom
    +
    +

    The script will automatically power off the board and update flash chip +contents using flashrom. After the operation is finished the routing of SPI +signals is restored to the platform.

    +

    The flash chip adapter

    +

    In order to provide an easy way to protect the SPI flash chip one may use a +DIP-8 to SOIC-8 adapter with a special long pin header for WP pin jumper. It +allows to use a SOIC-8 packaged flash in the DIP-8 socket and easily place a +jumper to protect the flash. In order to assembly the adapter you will need

    +
      +
    • the target SPI flash chip (we use either Winbond W25Q64FV (8MB) or W25Q128JV +(16MB)),
    • +
    • male pin headers 2.54 mm pitch (6 pins)
    • +
    • male long pin headers 2.54 mm pitch (2 pins) for the WP jumper
    • +
    • SOIC-8 to DIP-8 adapter
    • +
    • soldering station and the solder
    • +
    +

    The build shall look like this:

    +

    Flash +Flash +Flash +Flash

    +

    Such adapters are now available in our online shop for +purchase. For more details how to enable SPI flash protection refer to SPI +Flash protection page.

    +

    Power management

    +

    RTE can control the power +of the board with the RteCtrl command-line application, or with the web GUI +(RteCtrl) available at RTE's IP address +port 8000. Possible commands are:

    +
    ./RteCtrl -pon # power on the platform
    +./RteCtrl -poff # force 5seconds power button power off
    +./RteCtrl -reset # briefly assert platform reset pin to perform reset
    +
    +

    It is also possible to control the ATX power supply by disconnecting it from +the power socket. For this special purpose, Sonoff S20 is used to remotely +control the power socket activity. Sonoff IP to RTE IP mapping:

    +
      +
    • RTE IP 192.168.20.15 - Sonoff IP 192.168.4.125
    • +
    • RTE IP 192.168.4.111 - Sonoff IP 192.168.4.146
    • +
    +

    Sonoffs respond to rest API requests to enable or disable the power socket. +Shell scripts have been added to RTE root directories to ease the control of +power of the KGPE-D16 platform:

    +
    #!/bin/bash
    +
    +SONOFF_IP=192.168.4.125
    +
    +if [[ "$1" == "off" ]]; then
    +    wget -q -O - http://$SONOFF_IP/switch/sonoff_s20_relay/turn_off --method=POST
    +elif [[ "$1" == "on" ]]; then
    +    wget -q -O - http://$SONOFF_IP/switch/sonoff_s20_relay/turn_on --method=POST
    +elif [[ "$1" == "show" ]]; then
    +    wget -q -O - http://$SONOFF_IP/switch/sonoff_s20_relay
    +    echo -e '\n'
    +else
    +    echo -e "\$1 == on|off|show|toggle\nEdit this script to set the sonoff ip."
    +    echo -e 'Current state:'
    +    wget -q -O - http://$SONOFF_IP/switch/sonoff_s20_relay
    +    echo -e '\n'
    +fi
    +
    +

    To turn off the power from the platform ./sonoff.sh off and to turn it on +./sonoff.sh on. Invoking the script without any argument will print the +current state of the switch.

    +

    Serial console access

    +

    A serial port is very useful in debugging and as a remote console of the system +on the platform. The serial port of KGPE-D16 is connected to the RTE's serial +port which can be accessed on RTE with /dev/ttyS1. One may use minicom +directly or take advantage of the ser2net service running on RTE which exposes +the serial port over the network. The serial port can be accessed remotely like +this telnet RTE_IP 13541, e.g.:

    +
    telnet 192.168.20.15 13541
    +
    +

    Demo

    +

    A short demo presenting RTE capabilities with KGPE-D16:

    + + +

    Remote access

    +

    If you are interested in developing coreboot on KGPE-D16 and have some spare +time, there is a possibility to obtain access to the hardware. Drop us an +email to leads@3mdeb.com with a request.

    +

    Newsletter

    +

    If you are interested in this project, you can subscribe to the +Dasharo KGPE-D16 Newsletter. +If you are interested in the Dasharo in general, you are welcome to subscribe +to the Dasharo Newsletter.

    + +

    + +

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/spi-wp/index.html b/variants/asus_kgpe_d16/spi-wp/index.html new file mode 100644 index 00000000000..f0a69ff03ed --- /dev/null +++ b/variants/asus_kgpe_d16/spi-wp/index.html @@ -0,0 +1,6191 @@ + + + + + + + + + + + + + + + + + + SPI write protection - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + + + + + + + + + +

    SPI hardware write protection

    +

    In order to from a Root of Trust in the firmware, e.g. in the immutable piece +of firmware code for Static Root of Trust of Measurement one has to ensure the +protection of this piece of code. One may achieve it by enabling Intel Boot +Guard or AMD Platform Secure Boot. However these technologies may into always be +available. In such case SPI hardware write protection becomes handy.

    +

    Thanks to the patchset implementing write protection and OTP support in +flashrom one can easily set the SPI write protection of the platform from the +operating system user space. This page explain how to build the flashrom with +WP and OTP support and use to to protect the coreboot's bootblock to form SRTM.

    +

    Building flashrom

    +

    In order to build flashrom we will need some packages and librares. For Debian +based distros execute:

    +
    sudo apt-get install git make binutils build-essential ca-certificates \
    +             libpci-dev libftdi-dev libusb-1.0-0-dev
    +
    +

    Now clone the flashrom repository and fetch the patchset:

    +
    git clone https://github.com/flashrom/flashrom
    +cd flashrom
    +git fetch https://review.coreboot.org/flashrom refs/changes/13/59713/7 && \
    +    git checkout FETCH_HEAD
    +
    +

    Build flashrom:

    +
    make
    +
    +

    The freshly built flashrom will be present in root directory of the repository.

    +

    Flashrom write protection CLI

    +

    Invoke the following command to see a list of available options for flashrom:

    +
    ./flashrom --help
    +flashrom v1.2-585-g3542afe on Linux 5.10.0-9-amd64 (x86_64)
    +flashrom is free software, get the source code at https://flashrom.org
    +
    +Usage: ./flashrom [-h|-R|-L|
    +    -p <programmername>[:<parameters>] [-c <chipname>]
    +        (--flash-name|--flash-size|
    +         [-E|-x|(-r|-w|-v) <file>]
    +         [(-l <layoutfile>|--ifd| --fmap|--fmap-file <file>) [-i <region>[:<file>]]...]
    +         [-n] [-N] [-f])]
    +    [-V[V[V]]] [-o <logfile>]
    +
    + -h | --help                        print this help text
    + -R | --version                     print version (release)
    + -r | --read <file>                 read flash and save to <file>
    + -w | --write <file|->              write <file> or the content provided
    +                                    on the standard input to flash
    + -v | --verify <file|->             verify flash against <file>
    +                                    or the content provided on the standard input
    + -E | --erase                       erase flash memory
    + -V | --verbose                     more verbose output
    + -c | --chip <chipname>             probe only for specified flash chip
    + -f | --force                       force specific operations (see man page)
    + -n | --noverify                    don't auto-verify
    + -N | --noverify-all                verify included regions only (cf. -i)
    + -x | --extract                     extract regions to files
    + -l | --layout <layoutfile>         read ROM layout from <layoutfile>
    +      --wp-disable                  disable write protection
    +      --wp-enable                   enable write protection
    +      --wp-list                     list supported write protection ranges
    +      --wp-status                   show write protection status
    +      --wp-range=<start>,<len>      set write protection range (use --wp-range=0,0
    +                                    to unprotect the entire flash)
    +      --wp-region <region>          set write protection region
    +      --otp-status                  print information about OTP regions
    +      --otp-region <otp-region>     OTP region number (base 1) to operate on
    +      --otp-read <file>             read OTP region and save it to <file>
    +      --otp-write <file>            write <file> to OTP region
    +      --otp-erase                   erase OTP region
    +      --otp-lock                    lock OTP region
    +      --flash-name                  read out the detected flash name
    +      --flash-size                  read out the detected flash size
    +      --fmap                        read ROM layout from fmap embedded in ROM
    +      --fmap-file <fmapfile>        read ROM layout from fmap in <fmapfile>
    +      --ifd                         read layout from an Intel Firmware Descriptor
    + -i | --image <region>[:<file>]     only read/write image <region> from layout
    +                                    (optionally with data from <file>)
    + -o | --output <logfile>            log output to <logfile>
    +      --flash-contents <ref-file>   assume flash contents to be <ref-file>
    + -L | --list-supported              print supported devices
    + -p | --programmer <name>[:<param>] specify the programmer device. One of
    +    internal, dummy, nic3com, nicrealtek, gfxnvidia, raiden_debug_spi, drkaiser,
    +    satasii, atavia, it8212, ft2232_spi, serprog, buspirate_spi, dediprog,
    +    developerbox, rayer_spi, pony_spi, nicintel, nicintel_spi, nicintel_eeprom,
    +    ogp_spi, satamv, linux_mtd, linux_spi, usbblaster_spi, pickit2_spi,
    +    ch341a_spi, digilent_spi, stlinkv3_spi.
    +
    +You can specify one of -h, -R, -L, -E, -r, -w, -v or no operation.
    +If no operation is specified, flashrom will only probe for flash chips.
    +
    +

    We will use only a few of those options to set the protection on the coreboot's +bootblock. We protect the bootblock only, since it is the stage responsible for +measurements and verification of next stages.

    +

    Setting flash protection using flashrom

    +

    NOTE: be sure to update the firmware first before proceeding!

    +

    Estimating bootblock size and protection range

    +

    First let's see how much space we need to protect. Take your coreboot.rom file +and use cbfstool to show its contents:

    +
    cd /path/to/coreboot/build
    +./cbfstool coreboot.rom print
    +FMAP REGION: COREBOOT
    +Name                           Offset     Type           Size   Comp
    +cbfs master header             0x0        cbfs header        32 none
    +fallback/romstage              0x80       stage          171040 none
    +fallback/ramstage              0x29d40    stage           98703 LZMA (229532 decompressed)
    +config                         0x41f40    raw               709 none
    +revision                       0x42240    raw               723 none
    +build_info                     0x42540    raw               101 none
    +fallback/dsdt.aml              0x42600    raw              7055 none
    +cmos.default                   0x441c0    cmos_default      256 none
    +cmos_layout.bin                0x44300    cmos_layout      3676 none
    +fallback/postcar               0x451c0    stage           21216 none
    +img/nvramcui                   0x4a500    simple elf      70630 none
    +fallback/payload               0x5b940    simple elf      69936 none
    +payload_config                 0x6cac0    raw              1621 none
    +payload_revision               0x6d140    raw               237 none
    +pci8086,10d3.rom               0x6d280    raw             82944 none
    +etc/sercon-port                0x816c0    raw                 8 none
    +(empty)                        0x81700    null          8128932 none
    +bootblock                      0xffcac0   bootblock       13056 none
    +
    +

    The bootblock is taking slightly more than 12KB of space on the bottom of the +flash. Converting 12KB to hex would be equal to 0x3000 but we must cover a +little bit more than that. Let's see what protection ranges are available for +the chip (running from the tagret machine to be protected):

    +
    ./flashrom -p internal --wp-list
    +...
    +Available write protection ranges:
    +    start=0x00000000 length=0x00000000 (none)
    +    start=0x00000000 length=0x00001000 (lower 1/2048)
    +    start=0x007ff000 length=0x00001000 (upper 1/2048)
    +    start=0x00000000 length=0x00002000 (lower 1/1024)
    +    start=0x007fe000 length=0x00002000 (upper 1/1024)
    +    start=0x00000000 length=0x00004000 (lower 1/512)
    +    start=0x007fc000 length=0x00004000 (upper 1/512)
    +    start=0x00000000 length=0x00008000 (lower 1/256)
    +    start=0x007f8000 length=0x00008000 (upper 1/256)
    +    start=0x00000000 length=0x00020000 (lower 1/64)
    +    start=0x007e0000 length=0x00020000 (upper 1/64)
    +    start=0x00000000 length=0x00040000 (lower 1/32)
    +    start=0x007c0000 length=0x00040000 (upper 1/32)
    +    start=0x00000000 length=0x00080000 (lower 1/16)
    +    start=0x00780000 length=0x00080000 (upper 1/16)
    +    start=0x00000000 length=0x00100000 (lower 1/8)
    +    start=0x00700000 length=0x00100000 (upper 1/8)
    +    start=0x00000000 length=0x00200000 (lower 1/4)
    +    start=0x00600000 length=0x00200000 (upper 1/4)
    +    start=0x00000000 length=0x00400000 (lower 1/2)
    +    start=0x00400000 length=0x00400000 (upper 1/2)
    +    start=0x00000000 length=0x00600000 (lower 3/4)
    +    start=0x00200000 length=0x00600000 (upper 3/4)
    +    start=0x00000000 length=0x00700000 (lower 7/8)
    +    start=0x00100000 length=0x00700000 (upper 7/8)
    +    start=0x00000000 length=0x00780000 (lower 15/16)
    +    start=0x00080000 length=0x00780000 (upper 15/16)
    +    start=0x00000000 length=0x007c0000 (lower 31/32)
    +    start=0x00040000 length=0x007c0000 (upper 31/32)
    +    start=0x00000000 length=0x007e0000 (lower 63/64)
    +    start=0x00020000 length=0x007e0000 (upper 63/64)
    +    start=0x00000000 length=0x007f8000 (lower 255/256)
    +    start=0x00008000 length=0x007f8000 (upper 255/256)
    +    start=0x00000000 length=0x007fc000 (lower 511/512)
    +    start=0x00004000 length=0x007fc000 (upper 511/512)
    +    start=0x00000000 length=0x007fe000 (lower 1023/1024)
    +    start=0x00002000 length=0x007fe000 (upper 1023/1024)
    +    start=0x00000000 length=0x007ff000 (lower 2047/2048)
    +    start=0x00001000 length=0x007ff000 (upper 2047/2048)
    +    start=0x00000000 length=0x00800000 (all)
    +
    +

    The output abvoe comes from Winbond W25Q64FV, a 8MB chip. Bootblock is always +mapped to the bottom of the flash. 1MB is equal to 0x100000 so 8MB would be +0x800000. We need at least 0x4000 (16KB) to be protected starting at the bottom +of the flash. And fortunately we have found our best match: +start=0x007fc000 length=0x00004000 (upper 1/512).

    +

    Clearing SPI write protection

    +

    Now that we have selected the desired range to protect, it is time to check the +current protection status:

    +
    ./flashrom -p internal --wp-status
    +...
    +WP config bits: SRP1=0 SRP0=0 CMP=0 SEC=0 TB=0 BP2=0 BP1=0 BP0=0
    +Protection range: start=0x00000000 length=0x00000000 (none)
    +Protection mode: disabled
    +
    +

    The protection range should be set to zeros and all WP config bits should be +cleared. If you see some bits were not cleared, ensure the WP pin jumper on the +flash is not placed and invoke:

    +
    ./flashrom -p internal --wp-disable
    +./flashrom -p internal --wp-range=0,0
    +
    +

    now that we have a clear state of the flash protection we may proceed with +enabling the right range.

    +

    Setting protection range

    +

    Copy the range base and length and invoke:

    +
    ./flashrom -p internal --wp-range=0x007fc000,0x00004000
    +
    +

    Setting SPI status register protection

    +

    Flashrom should report Sucessfully set the requested protection range.. Now +set the status register protection so the range protection cannot be changed:

    +
    ./flashrom -p internal --wp-enable
    +
    +

    Flashrom should report Sucessfully set the requested mode..

    +

    Verifying SPI write protection

    +

    To check whether the settings are desired invoke:

    +
    ./flashrom -p internal --wp-status
    +...
    +WP config bits: SRP1=0 SRP0=1 CMP=0 SEC=1 TB=0 BP2=0 BP1=1 BP0=1
    +Protection range: start=0x007fc000 length=0x00004000 (upper 1/512)
    +Protection mode: hardware
    +
    +

    If it matches what you have wanted to set it is time to lock the status +register protection bit (SRP0) from being changed. SRP0 protects the CMP, SEC, +TB and BPx bits from being changed. In order to lock the SRP0 bit you have to +place the jumper on the WP pin and tie it to ground (GND). This will assert the +WP pin and prevent any WP config bits from being changed. To verify it invoke:

    +
    ./flashrom -p internal --wp-disable
    +...
    +Writing new WP configuration failed during verification:
    +Expected configuration: SRP1=0 SRP0=0 CMP=0 SEC=1 TB=0 BP2=0 BP1=1 BP0=1
    +Actual configuration:   SRP1=0 SRP0=1 CMP=0 SEC=1 TB=0 BP2=0 BP1=1 BP0=1
    +
    +

    You should get the above result.

    +

    Changing the protection range

    +

    Now if you want to reprogram the protection range, you need to take off the +jumper and invoke:

    +
    ./flashrom -p internal --wp-disable
    +
    +

    Now you should get Sucessfully set the requested mode. now. Check the WP +status:

    +
    WP config bits: SRP1=0 SRP0=0 CMP=0 SEC=1 TB=0 BP2=0 BP1=1 BP0=1
    +Protection range: start=0x007fc000 length=0x00004000 (upper 1/512)
    +Protection mode: disabled
    +
    +

    It must indicate Protection mode: disabled. Now you may reconfigure the +range, e.g.

    +
    ./flashrom -p internal --wp-range=0x007e0000,0x00020000
    +
    +

    And proceed with enabling protection and setting back the jumper.

    +

    Setting flash protection for vboot

    +

    In case when vboot is enabled the protection range must be extended in order to +cover other parts of the firmware. Vboot model assumes there is a read-only +copy of the coreboot and payload called recovery partition. The recovery +partition is supposed to be protected with a SPI write protection. The +read-only region contains the bootblock, verstage (vboot stage used to verify +other firmware components) and vboot keys and all other stages required to boot +the platform in case of emergency. Typically the read-only partition occupies a +space that matches the possible write protected regions of the flash chip. +There are also read-write partitions (up to 2) that contain an updatable copies +of the coreboot and payload. Unlike read-only partitions, read-write partitions +are being verified using the signatures put into the read-write partitions. +vboot checks the signature and decides whether read-write partition is safe to +boot, otherwise it proceeds with execution of recovery firmware. The boot flow +is shown on the diagram below:

    +

    vboot boot flow

    +

    In order to properly protect the firmware, one has to lock whole WP_RO region +define by flashmap in coreboot. To locate the region offset and size one has to +use cbfstool to retrieve layout:

    +
    cd /path/to/coreboot/build
    +./cbfstool coreboot.rom layout -w
    +This image contains the following sections that can be accessed with this tool:
    +
    +'RW_MISC' (read-only, size 524288, offset 0)
    +'UNIFIED_MRC_CACHE' (read-only, size 131072, offset 0)
    +'RECOVERY_MRC_CACHE' (size 65536, offset 0)
    +'RW_MRC_CACHE' (size 65536, offset 65536)
    +'SMMSTORE' (preserve, size 262144, offset 131072)
    +'CONSOLE' (size 131072, offset 393216)
    +'RW_NVRAM' (size 16384, offset 524288)
    +'RW_SECTION_A' (read-only, size 5750784, offset 540672)
    +'VBLOCK_A' (size 8192, offset 540672)
    +'FW_MAIN_A' (CBFS, size 5742528, offset 548864)
    +'RW_FWID_A' (size 64, offset 6291392)
    +'WP_RO' (read-only, size 2097152, offset 6291456)
    +'RO_VPD' (preserve, size 16384, offset 6291456)
    +'RO_SECTION' (read-only, size 2080768, offset 6307840)
    +'FMAP' (read-only, size 2048, offset 6307840)
    +'RO_FRID' (size 64, offset 6309888)
    +'RO_FRID_PAD' (size 1984, offset 6309952)
    +'GBB' (size 16384, offset 6311936)
    +'COREBOOT' (CBFS, size 2060288, offset 6328320)
    +
    +It is at least possible to perform the read action on every section listed above.
    +
    +

    The above example shows the KGPE-D16 8MB target with vboot enabled. The WP_RO +section is at offset of 6291456 bytes from the beginning of the flash and has +size of 2097152 bytes. These numbers are in decimal, so one must convert them +to hex. Either use an online hex converter or use the command in bash like a +pro :)

    +
    printf "0x%x\n" 6291456
    +0x600000
    +printf "0x%x\n" 2097152
    +0x200000
    +
    +

    So our WP range would be 2MB at 6MB offset +start=0x00600000 length=0x00200000 (upper 1/4). But before proceeding with +setting the WP range, one may want to sign the firmware with own vboot keys. +The Dasharo build come by default with Google vboot developer keys, so to take +advantage of vboot, one should sign the binary before flashing and setting the +WP range. Refer to vboot signing. +Unfortunately the utilities support only 2 RW partitions for resiging. +Otherwise a whole image must be rebuilt. After custo mkeys have been used to +sign the ifmrware image and the image has been flashed proceed with enalbing +the protection:

    +
    ./flashrom -p internal --wp-range=0x00600000,0x00200000
    +
    +

    Then proceed with Setting SPI status register protection +and Verifying SPI write protection.

    +

    At this point you should have your coreboot firmware with vboot well protected +and ready to go. Place the jumper in order to prevent any changes to the +configuration.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/test-matrix/index.html b/variants/asus_kgpe_d16/test-matrix/index.html new file mode 100644 index 00000000000..ddecf055b52 --- /dev/null +++ b/variants/asus_kgpe_d16/test-matrix/index.html @@ -0,0 +1,6017 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot base portCBPAll
    2.SMBIOSDMIDMI001.001, DMI002.001, DMI003.001, DMI004.001
    3.coreboot fan controlFANAll
    4.Custom boot menu keyCBKAll
    5.Debian Stable and Ubuntu LTS supportLBTLBT001.001, LBT001.002, LBT002.001, LBT002.002
    6.Network bootPXEPXE007.001
    7.USB detectionUDTAll
    8.USB bootingUBTAll
    9.Platform suspend and resumeSUSPSUSP001.001
    10.Flash write protectionHWPAll
    11.Display ports and LCD supportDSPDSP004.001, DSP004.002
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMTPM001.002
    2.Verified Boot supportVBOVBO006.001, VBO007.001, VBO008.001
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot bring up time measurementCBMEMAll
    2.Fan control measureFNMAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/asus_kgpe_d16/tpm-mboot/index.html b/variants/asus_kgpe_d16/tpm-mboot/index.html new file mode 100644 index 00000000000..7c650c81154 --- /dev/null +++ b/variants/asus_kgpe_d16/tpm-mboot/index.html @@ -0,0 +1,5946 @@ + + + + + + + + + + + + + + + + + + TPM measured boot - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    TPM measured boot

    +

    Since the Dasharo release v0.3.0 for KGPE-D16 TPM and measured boot are enabled +by default. The firmware comes with 2 variants for all 3 flash size targets:

    +
      +
    • vboot and TPM 1.2 measured boot for 2MB, 8MB and 16MB flash
    • +
    • vboot and TPM 2.0 measured boot for 2MB, 8MB and 16MB flash
    • +
    +

    TPM support

    +

    3mdeb office validates the following setups:

    +
      +
    1. KGPE-D16 8MB flash with ASUS TPM-L R2.0 + (Infineon SLB9665 TT2.0).
    2. +
    3. KGPE-D16 16MB flash with ASUS TPM 1.2 Rev 1.02h (Infineon SLB9635 TT1.2).
    4. +
    +

    Both chips are supported by coreboot. For the time being the platforms will be +tested with ASUS modules until OSHW lpnTPM +with open-source TPM firmware is ready.

    +

    Measured boot behaviour

    +

    It is also possible to have builds without vboot:

    +
      +
    • TPM 1.2 measured boot only (no vboot) for 2MB, 8MB and 16MB flash
    • +
    • TPM 2.0 measured boot only (no vboot) for 2MB, 8MB and 16MB flash
    • +
    +

    These targets are for cases where only the bootblock is intended to be locked +to form Static Root of Trust for Measurement. For details how to lock flash +depending on the firmware variant (with or without vboot) refer to +SPI hardware write protection.

    +

    Note the targets without vboot do not need to have any division into read-only +and read-write partitions. Everything can be contained in a single COREBOOT +flashmap region like in a standard coreboot build to have the largest free +space for big payloads like heads.

    +

    The variants without vboot have enabled measured boot with an additional option +to initialize the TPM in bootblock in order to send the measurements directly +to TPM in bootblock and other early stages. Otherwise the TPM measurements are +cached in memory and sent to TPM PCRs late in ramstage during TPM setup. The +downside of this approach is that the memory could be corrupted in the meantime +and the measurements could be faked before they are migrated to the TPM.

    +

    If you check the boot logs either on serial port on via cbmem utility you +should see:

    +
    coreboot-asus_kgpe-d16_v0.2.0-15-g521dec6dff Wed Dec 15 11:43:34 UTC 2021 bootblock starting (log level: 8)...
    +CPU INIT detected 00000000
    +Found TPM SLB9665 TT 2.0 by Infineon
    +tlcl_send_startup: Startup return code is 0
    +TPM: Write digests cached in TCPA log to PCR
    +TPM: Write digest for FMAP: FMAP into PCR 2
    +tlcl_extend: response is 0
    +TPM: Write digest for FMAP: COREBOOT CBFS: bootblock into PCR 2
    +tlcl_extend: response is 0
    +TPM: Write digest for FMAP: COREBOOT CBFS: cmos.default into PCR 3
    +tlcl_extend: response is 0
    +TPM: setup succeeded
    +CBFS: Found 'fallback/romstage' @0x80 size 0x2d688 in mcache @0x0004962c
    +FMAP: area COREBOOT found @ 200 (8388096 bytes)
    +TPM: Extending digest for FMAP: COREBOOT CBFS: fallback/romstage into PCR 2
    +tlcl_extend: response is 0
    +TPM: Digest of FMAP: COREBOOT CBFS: fallback/romstage to PCR 2 measured
    +BS: bootblock times (exec / console): total (unknown) / 62 ms
    +
    +

    When vboot is enabled and the verstage is being located, the bootblock measures +itself and the verstage, but the measurements are sent to the TPM PCRs not in +bootblock, but in verstage:

    +
    coreboot-asus_kgpe-d16_v0.2.0-15-g521dec6dff Wed Dec 15 11:43:34 UTC 2021 bootblock starting (log level: 8)...
    +CPU INIT detected 00000000
    +VBOOT: Loading verstage.
    +CBFS: Found 'fallback/verstage' @0x8c300 size 0xd848 in mcache @0x0004c8fc
    +FMAP: area COREBOOT found @ 609000 (2060288 bytes)
    +TPM: Digest of FMAP: COREBOOT CBFS: fallback/verstage to PCR 2 logged
    +
    +coreboot-asus_kgpe-d16_v0.2.0-15-g521dec6dff Wed Dec 15 11:43:34 UTC 2021 verstage starting (log level: 8)...
    +VBNV: CMOS invalid, restoring from flash
    +FMAP: area RW_NVRAM found @ 80000 (16384 bytes)
    +spi_init: SPI base fec10000
    +Manufacturer: ef
    +SF: Detected ef 4017 with sector size 0x1000, total 0x800000
    +VBNV: Restore from flash failed
    +Found TPM SLB9665 TT 2.0 by Infineon
    +tlcl_send_startup: Startup return code is 0
    +TPM: Write digests cached in TCPA log to PCR
    +TPM: Write digest for FMAP: FMAP into PCR 2
    +tlcl_extend: response is 0
    +TPM: Write digest for FMAP: COREBOOT CBFS: bootblock into PCR 2
    +tlcl_extend: response is 0
    +TPM: Write digest for FMAP: COREBOOT CBFS: cmos.default into PCR 3
    +tlcl_extend: response is 0
    +TPM: Write digest for FMAP: COREBOOT CBFS: fallback/verstage into PCR 2
    +tlcl_extend: response is 0
    +TPM: Write digest for FMAP: COREBOOT CBFS: cmos_layout.bin into PCR 2
    +tlcl_extend: response is 0
    +TPM: setup succeeded
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/clevo_nv41/ec_update/index.html b/variants/clevo_nv41/ec_update/index.html new file mode 100644 index 00000000000..a7c4e62b690 --- /dev/null +++ b/variants/clevo_nv41/ec_update/index.html @@ -0,0 +1,15 @@ + + + + + + Redirecting... + + + + + + +Redirecting... + + diff --git a/variants/dell_optiplex/building-manual/index.html b/variants/dell_optiplex/building-manual/index.html new file mode 100644 index 00000000000..a6bc29d118d --- /dev/null +++ b/variants/dell_optiplex/building-manual/index.html @@ -0,0 +1,5873 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dell OptiPlex 7010/9010 Dasharo - building manual

    +

    Please read the overview page first!

    +

    To build Dasharo compatible with Dell OptiPlex 7010/9010, follow the steps +below:

    +
      +
    1. +

      Clone the coreboot repository:

      +
      git clone https://github.com/dasharo/coreboot.git
      +
      +
      cd coreboot
      +
      +

      Replace vX.Y.Z with valid version:

      +
      git checkout dell_optiplex_9010_vX.Y.Z
      +
      +

      Checkout submodules:

      +
      git submodule update --init --recursive --checkout
      +
      +
    2. +
    3. +

      Start docker container:

      +
        +
      • To build Dasharo (coreboot+SeaBIOS) v0.1.0:
      • +
      +
         docker run --rm -it \
      +      -v $PWD:/home/coreboot/coreboot \
      +      -w /home/coreboot/coreboot \
      +      coreboot/coreboot-sdk:2022-04-04_9a8d0a03db /bin/bash
      +
      +
        +
      • To build Dasharo (coreboot+UEFI) v0.1.0:
      • +
      +
         docker run --rm -it \
      +      -v $PWD:/home/coreboot/coreboot \
      +      -w /home/coreboot/coreboot \
      +      coreboot/coreboot-sdk:2021-09-23_b0d87f753c /bin/bash
      +
      +

      To understand difference between versions please read FAQ.

      +
    4. +
    5. +

      Inside of the container, configure and start the build process:

      +
      make distclean
      +
      +
        +
      • To build Dasharo (coreboot+SeaBIOS) v0.1.0
      • +
      +
         cp configs/config.dell_optiplex_9010 .config
      +
      +
        +
      • To build Dasharo (coreboot+UEFI) v0.1.0
      • +
      +
         cp configs/config.dell_optiplex_9010 .config
      +
      +
        +
      • To build Dasharo (coreboot+SeaBIOS) v0.1.0 debug version (very verbose logging).
      • +
      +
         cp configs/config.dell_optiplex_9010.debug .config
      +
      +
        +
      • To build Dasharo (coreboot+UEFI) v0.1.0 debug version (very verbose logging).
      • +
      +
         cp configs/config.dell_optiplex_9010.uefi.debug .config
      +
      +
      make olddefconfig
      +
      +
      make
      +
      +

      or simply:

      +
      make distclean && cp configs/CONFIG_NAME .config && make olddefconfig && make
      +
      +
    6. +
    +

    This will produce a Dasharo binary placed in build/coreboot.rom, which can be +flashed in following ways, depending on your situation:

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/dell_optiplex/faq/index.html b/variants/dell_optiplex/faq/index.html new file mode 100644 index 00000000000..8ee19583654 --- /dev/null +++ b/variants/dell_optiplex/faq/index.html @@ -0,0 +1,5928 @@ + + + + + + + + + + + + + + + + + + FAQ - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    FAQ

    +

    I see orange LED blinking, but no output, is my board broken?

    +

    It means ME is broken and backup firmware would be required to recover it. +Please follow +additional recovery step +to fix that problem.

    +

    I see white LED, but no output, is my board broken?

    +

    There maybe many reasons of this behavior.

    +

    One may be, it boots fine but there is no visible output. It may mean firmware +stuck at some point or maybe platform booting normally but all output is +disabled.

    +

    Debugging that requires rebuilding with CONFIG_DEFAULT_CONSOLE_LOGLEVEL_8=y. +Instruction for that can be found here.

    +

    Is it safe to work without heatsink?

    +

    It should be safe for debugging and recovery purposes. CPU after ~1min will +reach temperature limits and will shutdown the platform.

    +

    CPU was replaced & warm reset required loop

    +

    If serial console logs contain:

    +
    [NOTE ]  ME: Wrong mode : 15
    +[NOTE ]  ME: HFS error : 15
    +[NOTE ]  ME: FWS2: 0xffffffff
    +[NOTE ]  ME:  Bist in progress: 0x1
    +[NOTE ]  ME:  ICC Status      : 0x3
    +[NOTE ]  ME:  Invoke MEBx     : 0x1
    +[NOTE ]  ME:  CPU replaced    : 0x1
    +[NOTE ]  ME:  MBP ready       : 0x1
    +[NOTE ]  ME:  MFS failure     : 0x1
    +[NOTE ]  ME:  Warm reset req  : 0x1
    +[NOTE ]  ME:  CPU repl valid  : 0x1
    +[NOTE ]  ME:  (Reserved)      : 0x3
    +[NOTE ]  ME:  FW update req   : 0x1
    +[NOTE ]  ME:  (Reserved)      : 0xf
    +[NOTE ]  ME:  Current state   : 0xff
    +[NOTE ]  ME:  Current PM event: 0xf
    +[NOTE ]  ME:  Progress code   : 0xf
    +[NOTE ]  CPU was replaced & warm reset required...
    +[INFO ]  system_reset() called!
    +
    +

    It means ME is broken and backup firmware would be required to recover it. +Please follow +additional recovery step +to fix that problem.

    +

    This may happen accidentally when you flash whole 12MB BIOS binary without +passing parameters about FMAP.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/dell_optiplex/firmware-update/index.html b/variants/dell_optiplex/firmware-update/index.html new file mode 100644 index 00000000000..9d6ea213dd9 --- /dev/null +++ b/variants/dell_optiplex/firmware-update/index.html @@ -0,0 +1,5875 @@ + + + + + + + + + + + + + + + + + + Firmware update - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Firmware update

    +

    Please read the overview page first!

    +

    Following documentation describe process of Dasharo open-source firmware +distribution update.

    +

    OS booting

    +

    For simplicity we recommend using network booted +Dasharo Tools Suite.

    +

    Dasharo (coreboot+SeaBIOS) and Dasharo (coreboot+UEFI) update

    +
      +
    • Make sure a wired network cable to the device's Ethernet port
    • +
    • Perform DTS network boot
        +
      • Dasharo (coreboot+SeaBIOS)
          +
        • While booting enter SeaBIOS menu using Esc
        • +
        • Choose option iPXE (PCI 00:19.0)
        • +
        +
      • +
      • Dasharo (coreboot+UEFI)
          +
        • Press F7 and choose iPXE Network boot
        • +
        +
      • +
      +
    • +
    • In the Dasharo Network Boot Menu, select the Dasharo Tools Suite option
    • +
    • Enter shell using option 9)
    • +
    • Download the Dell OptiPlex 7010/9010 Dasharo from + release section or + build from source.
    • +
    • Flash it using:
    • +
    +
    flashrom -p internal --ifd -i bios -w <dasharo_optiplex_9010_firmware>
    +
    +

    Please note that not using -i bios may lead to +this issue

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/dell_optiplex/hardware-matrix/index.html b/variants/dell_optiplex/hardware-matrix/index.html new file mode 100644 index 00000000000..d8d3cbd5ffb --- /dev/null +++ b/variants/dell_optiplex/hardware-matrix/index.html @@ -0,0 +1,6048 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Please read the overview page first!

    +

    The tables below contain information about current components of the testing +environment for Dell OptiPlex workstations available in 3mdeb testing laboratory.

    +

    OptiPlex 7010

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core iTBD
    CPU Cooler
    GPUN/A
    RAMTBD
    HDDTBD
    SSDTBD
    Flash memoryTBD
    NetworkLocal network wired connection
    Attached devices1. TBD USB stick
    Power SupplyTBD
    Power Control1. Sonoff TBD
    Remote Testing Environment1. RTE TBD
    +

    OptiPlex 9010

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core iTBD
    CPU Cooler
    GPUN/A
    RAMTBD
    HDDTBD
    SSDTBD
    Flash memoryTBD
    NetworkLocal network wired connection
    Attached devices1. TBD USB stick
    Power SupplyTBD
    Power Control1. Sonoff Web Server
    Remote Testing Environment1. RTE v1.0.0 (firmware v0.5.3) connected via RS232
    +

    OptiPlex 9010 full (miczyg)

    +

    This is private setup.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core i7-3770
    Stock Dell CPU Cooler
    GPU1. Integrated Intel HD Graphics
    2. Dell Radeon HD7570 low profile, half height in PCIe x16 slot
    RAMSK-Hynix HMT451U6BFR8A-PB x4
    HDDNone
    SSD1. NVMe: PLEXTOR PX-512M9PeG
    2. SATA SSD: SSDPR-CL100-240
    3. SATA SSD: Micron_1100_MTFD
    Flash memory12MB (8+4) dual SPI flash
    NetworkLocal network wired connection
    Attached devices1. i-tec Adapter PCI-E SATA 2x M.2 Card PCI-E/SATA in PCIe x4 slot
    2. PS/2 mouse: Fujitsu M530 via USB to PS/2 adapter
    3. PS/2 keyboard: Media-Tech MT122K
    4. Display: Samsung SyncMaster 2233
    5. Stock Dell DVD RW
    Power SupplyStock Dell PSU
    Power ControlManual
    Remote Testing EnvironmentRTE v1.0.0 (firmware v0.5.3) connected via RS232
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/dell_optiplex/initial-deployment/index.html b/variants/dell_optiplex/initial-deployment/index.html new file mode 100644 index 00000000000..d99ca2db73b --- /dev/null +++ b/variants/dell_optiplex/initial-deployment/index.html @@ -0,0 +1,6022 @@ + + + + + + + + + + + + + + + + + + Initial deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Initial deployment

    +

    Please read the overview page first!

    +

    Following documentation describe process of replacing original BIOS/UEFI +firmware with Dasharo open-source firmware. Following procedure is supported +for following models

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    VendorModel
    DellOptiPlex 7010 SFF
    DellOptiPlex 7010 DT
    DellOptiPlex 9010 SFF
    DellOptiPlex 9010 MT
    +

    +

    Hardware preparation

    +

    Flash descriptor security override

    +

    To perform any SPI NOR flash operations in the presence of ME, we have to put +it in the flash descriptor security override mode. Please follow the below +steps:

    +
      +
    1. +

      Open the case by lifting the handle on the case.

      +

      +
    2. +
    3. +

      Lift the whole top cover and take it off.

      +

      +
    4. +
    5. +

      Now, it is time to release the disk dock. Lift the handle of the CD/DVD drive + bay.

      +

      +
    6. +
    7. +

      Pull the CD/DVD drive bay to the CPU fan side.

      +

      +
    8. +
    9. +

      Move the blue disk dock handle to the CPU fan side.

      +

      +
    10. +
    11. +

      The screw should be at the giant hole now. Lift the whole dock to + remove it.

      +

      +
    12. +
    13. +

      When the dock is removed, the service mode jumper should be visible.

      +

      +
    14. +
    15. +

      Place the jumper in the place marked by the red rectangle.

      +

      +
    16. +
    17. +

      It should look like this.

      +

      +
    18. +
    19. +

      Power on the machine. You should see a warning that the service jumper is +active. Press F1 to proceed and boot to your Linux system.

      +

      +
    20. +
    +

    Initial deployment

    +

    To ensure a smooth deployment process, it is recommended to use the latest +version of DTS available from the releases +page. Once you have obtained it, you can +then proceed with following the Dasharo zero-touch initial deployment +section +procedure. This will help you set up Dasharo effectively and without manual +intervention.

    +

    Verification

    +
      +
    1. If everything went well (flashrom has verified the flash content),
    2. +
    3. Shut down the machine, move the jumper to the original place
    4. +
    5. Power on the machine.
    6. +
    7. After rebooting, you should see the Dasharo Workstation logo when booting. + When the logo appears, you may press Esc to select the boot device if + you want to reboot from another source.
    8. +
    +

    +

    From that point you can use firmware update methods to +update your firmware.

    +

    Troubleshooting

    +

    If you do not see the logo after a few seconds, something probably went wrong, +or you encountered a bug. If the LED on the power button shines white, that +means the platform booted correctly.

    +

    +

    If the power button LED constantly shines in orange color, that means you have +hit an error. The LED will start blinking soon.

    +

    +If you see the logo and after that system does not starts (black screen), please +take the following steps:

    +
      +
    1. Put a bootable USB stick to the USB port.
    2. +
    3. Restart the computer using the power button.
    4. +
    5. Press the Esc key to enter a boot menu.
    6. +
    7. Choose a USB drive from the list.
    8. +
    9. Re-install the operating system.
    10. +
    +

    Common deployment problems you can find in FAQ.

    +

    Ubuntu installation

    +

    Ubuntu legacy installers have problems with graphical setup mode. When you see +this error:

    +
    graphics initialization failed
    +Error setting up gfxboot
    +boot:_
    +
    +

    You need a workaround to proceed with the installation. To boot the installer, +type live-install and press ENTER. It will boot to Ubuntu Live, and the +installer will launch automatically.

    +

    Version affected: Dasharo Workstation v0.1.

    +

    If you see blinking yellow LED and black screen after reboot: +1. Unplug the power supply cable +2. Wait for the 30s +3. Plug in the power supply again (machine should start automatically)

    +

    Bug reporting

    +

    If you encountered an error or bug, please report it in the Dasharo Issues repo.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/dell_optiplex/overview/index.html b/variants/dell_optiplex/overview/index.html new file mode 100644 index 00000000000..ec989b2ef01 --- /dev/null +++ b/variants/dell_optiplex/overview/index.html @@ -0,0 +1,5893 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    + + +

    + +

    +

    Dell OptiPlex 7010/9010 SFF is small SOHO desktop computer sometimes used as +firewall or NAS. +To learn more about our motivation for the coreboot port and Dasharo compatible +with Dell OptiPlex 7010/9010 SFF please check references section. +If you want to build, initially deploy, update or recover your setup please +check documentation sections on the left.

    +

    Status

    +

    Dasharo compatible with Dell OptiPlex 7010/9010 is a community-driven effort. +We work on this in our free time, since we have no sponsor for this project. To +address the issue we organize virtual hackathon called OptiPlex +Tuesday on Dasharo Matrix almost every Tuesday. If +you are interested in this project, you can consider joining the event or +supporting us in other way.

    +

    The most advanced code is on rel_v0.1.0 +branch and the most advanced +documentation related to rel_v0.1.0 branch is already available from menu on +the left. This code supports only Dasharo (coreboot+SeaBIOS), so legacy boot. +UEFI is also quite ready, but we need to release v0.1.0 properly first.

    +

    References

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/dell_optiplex/recovery/index.html b/variants/dell_optiplex/recovery/index.html new file mode 100644 index 00000000000..f2db0253768 --- /dev/null +++ b/variants/dell_optiplex/recovery/index.html @@ -0,0 +1,6159 @@ + + + + + + + + + + + + + + + + + + Recovery - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Recovery

    +

    Please read the overview page first!

    +
    +

    Following documentation describes the process of recovering hardware from brick +state with RTE and Dasharo +open-source firmware. Following procedure is supported for following models

    +

    + + + + + + + + + + + + + + + + + + + + + +
    VendorModel
    DellOptiPlex 7010 SFF
    DellOptiPlex 7010 DT
    DellOptiPlex 9010 SFF
    +

    +

    Step 1: Prepare hardware

    +
      +
    1. To prepare hardware please follow hardware preparation + procedure.
    2. +
    3. Follow instruction in the video to remove heatsink:
    4. +
    +

    +

    Step 2: Find SPI_1, SPI_2/SPI_3

    +

    + +

    +

    Step 3: Connect SOIC-8 Pomona clip between RTE and target

    +

    Connect SOIC-8 Pomona according to +MX25L3206E datasheet.

    +

    + +

    +

    + Pomona SOIC clip +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    RTE J7Pomona SOIC clip
    CSpin 1 (upside)
    MISOpin 2 (upside)
    GNDpin 4 (upside)
    VCCpin 5 (downside)
    SCLKpin 7 (downside)
    MOSIpin 8 (downside)
    +

    +

    Numbers 1-4 have to be on one side and numbers 5-8 have to be on the other side +of the clip.

    +

    +Clip up +

    +

    +Clip down +

    +

    Clip on the SPI_1 chip. Match pin 1 (CS) of the Pomona clip with the first +pin of SPI_1 chip, marked with a small dot engraved on the chip.

    +

    Clip connected

    +

    Step 4: Connect RTE

    +

    + +

    +
      +
    1. Connect J2 Orange Pi Zero system debug output
    2. +
    3. Power the board and confirm it boots
    4. +
    5. Please note typical convention of USB-UART converter colors is as follows
        +
      • black - GND
      • +
      • red - +5V
      • +
      • green - TX
      • +
      • white - RX
      • +
      +
    6. +
    7. +

      Connect terminal to RTE and read OS version:

      +
      sudo minicom -b 115200 -D /dev/ttyUSB0 -o -C /tmp/minicom.cap
      +
      +
        +
      • -b 115200 sets baudrate
      • +
      • -D /dev/ttyUSB0 points to USB-UART converter device, it can be + different if you already have some devices connected or you use different + operating system
      • +
      • -o skip initialization
      • +
      • -C /tmp/minicom.cap capture serial terminal output, if you will have + problems with exercises please post this file
      • +
      • Login using following credentials:
      • +
      +
      login: root
      +password: meta-rte
      +
      +
    8. +
    +

    Step 5: Prepare recovery binary

    +

    Following procedure assume that you use recovery binary created during backup +process. +Backup has 12MB, so it have to be split

    +
    split -b4M bios_backup_YYYYMMDD.bin
    +
    +

    Step 6: Flash 4MB (BIOS) part

    +
    echo 1 > /sys/class/gpio/gpio405/value
    +
    +
    echo 1 > /sys/class/gpio/gpio406/value
    +
    +
    echo 1 > /sys/class/gpio/gpio404/value
    +
    +

    xac is third file resulting from the previous binary split, so it contains +Dasharo code and data which fits into 4MB and in case of Dell OptiPlex +9010/7010 should be flashed to 4MB SPI.

    +
    flashrom -w xac -p linux_spi:dev=/dev/spidev1.0,spispeed=16000 -c "MX25L3205D/MX25L3208D"
    +
    +

    (Optional) Step 7: Flash 8MB (ME) part

    +

    If a more serious problem occurs, like +broken ME, +it may be necessary to use your +firmware backup +and restore content of 8MB chip.

    +

    Step 7a: Connect SOIC-16 Pomona clip between RTE and target

    +

    Connect SOIC-16 Pomona according to +MX25L6406E datasheet.

    +

    + +

    +

    + Pomona SOIC16 clip +

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    RTE J7Pomona SOIC clip
    VCCpin 2 (upside)
    CSpin 7 (upside)
    MISOpin 8 (upside)
    SCLKpin 16 (downside)
    MOSIpin 15 (downside)
    GNDpin 10 (downside)
    +

    +

    Numbers 1-8 have to be on one side and numbers 9-16 have to be on the other +side of the clip.

    +

    +Clip up +

    +

    +Clip down +

    +

    Clip on the SPI_2/SPI_3 chip. Match pin 1 (HOLD#) of the Pomona clip with +the first pin of SPI_2/SPI_3 chip, marked with a small dot engraved on the +chip.

    +

    Clip connected

    +

    Step 7b: Flash 8MB (ME) part

    +
    echo 1 > /sys/class/gpio/gpio405/value
    +
    +
    echo 1 > /sys/class/gpio/gpio406/value
    +
    +
    echo 1 > /sys/class/gpio/gpio404/value
    +
    +

    Dasharo recovery

    +

    Use following procedure if your 4M flash contain Dasharo open-source firmware.

    +
    cat > dell_optiplex.layout <<EOF
    +00000000:00000fff fd
    +00001000:00004fff gbe
    +00005000:005fffff me
    +00600000:007fffff unused
    +EOF
    +
    +
    flashrom -w your_bios_backup.bin -p linux_spi:dev=/dev/spidev1.0,spispeed=16000 -c "MX25L6406E/MX25L6408E" -i fd -i me --layout dell_optiplex.layout
    +
    +

    Vendor BIOS recovery

    +

    Use following procedure if your 4M flash contain vendor BIOS.

    +
    flashrom -w your_bios_backup_8M.bin -p linux_spi:dev=/dev/spidev1.0,spispeed=16000 -c "MX25L6406E/MX25L6408E"
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/dell_optiplex/releases/index.html b/variants/dell_optiplex/releases/index.html new file mode 100644 index 00000000000..f8ed8278935 --- /dev/null +++ b/variants/dell_optiplex/releases/index.html @@ -0,0 +1,5870 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/dell_optiplex/test-matrix/index.html b/variants/dell_optiplex/test-matrix/index.html new file mode 100644 index 00000000000..135d841cce7 --- /dev/null +++ b/variants/dell_optiplex/test-matrix/index.html @@ -0,0 +1,6012 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.Display ports and LCD supportDSPDSP003.001, DSP003.003, DSP004.001, DSP004.003
    3.USB HID and MSC SupportUSBAll
    4.SMBIOSDMIDMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001
    5.Custom boot logoCLGAll
    6.Audio subsystemAUDAUD001.001, AUD004.001, AUD005.001, AUD006.001
    7.NVMe support¹NVMNVM001.001, NVM001.002
    8.Network bootPXEWithout PXE007.001
    9.Debian Stable and Ubuntu LTS supportLBTLBT003.001, LBT003.002, LBT004.001, LBT004.002
    10.Custom boot menu keyCBKAll
    11.PCI Express ports supportPEXPEX001.001
    12.EC and Super I/O initializationSIOSIO001.001, SIO002.001, SIO002.002, SIO003.001, SIO004.001, SIO004.002
    13.Fan controlFANFAN001.002²
    +

    1) Requires a PCIe x4 to M.2 adapter +2) Fans have to be checked manually. No support for reading the fan speed. + There is also no W83795G HWM on this machine.

    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMTPM001.002
    2.Measured Boot supportMBOAll
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot bring up time measurementCBMEMAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/hardware-compatibility-list/index.html b/variants/hardware-compatibility-list/index.html new file mode 100644 index 00000000000..c4721c2c625 --- /dev/null +++ b/variants/hardware-compatibility-list/index.html @@ -0,0 +1,5793 @@ + + + + + + + + + + + + + + + + + + Hardware Compatibility List - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware Compatibility List

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    VendorModelStatusRoadmapShopDocumentation
    DellOptiPlex 7010 SFFImplementationTBDTBDlink
    DellOptiPlex 7010 DTImplementationTBDTBDlink
    DellOptiPlex 9010 SFFImplementationTBDTBDlink
    +

    Possible status:

    +
      +
    • Planning - platform support is planned either through internal, community + or commercial sponsorship.
    • +
    • Implementation - under active development to provide baseline support.
    • +
    • Testing and Integration - under validation to sign-off on baseline + quality criteria.
    • +
    • Maintenance - under active maintenance release cycle according to + schedule presented in Roadmap.
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/building-manual/index.html b/variants/msi_z690/building-manual/index.html new file mode 100644 index 00000000000..e4e06376eaa --- /dev/null +++ b/variants/msi_z690/building-manual/index.html @@ -0,0 +1,5915 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Building manual

    +

    Intro

    +

    This documents describes the procedure for compiling Dasharo firmware +compatible with MSI PRO Z690-A WIFI DDR4.

    +

    Requirements

    + +
    sudo apt install git unzip wget
    +
    +
      +
    • UEFIExtract installed
        +
      • this tool is used in the build.sh script to extract CPU microcode from + the original MSI firmware
      • +
      +
    • +
    +
    sudo apt install wget
    +wget https://github.com/LongSoft/UEFITool/releases/download/A59/UEFIExtract_NE_A59_linux_x86_64.zip
    +unzip UEFIExtract_NE_A59_linux_x86_64.zip
    +sudo cp ./UEFIExtract /usr/local/bin
    +
    +

    Procedure

    +

    Obtain Dasharo source code for MSI PRO Z690-A WIFI DDR4:

    +
    +

    Replace the REVISION with one of the:

    +
      +
    • msi_ms7d25/release for the latest released version
    • +
    • msi_ms7d25_vVERSION (e.g. msi_ms7d25_v0.1.0) for the given release
    • +
    +
    +
    git clone https://github.com/Dasharo/coreboot.git -b REVISION
    +
    +

    Navigate to the source code directory and start the build process:

    +
    cd coreboot
    +./build.sh ddr4
    +
    +

    The resulting Dasharo firmware image will be placed at build/coreboot.rom.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/community-test-results/index.html b/variants/msi_z690/community-test-results/index.html new file mode 100644 index 00000000000..ae4dedc9a52 --- /dev/null +++ b/variants/msi_z690/community-test-results/index.html @@ -0,0 +1,5927 @@ + + + + + + + + + + + + + + + + + + Community Test Results - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Community test results

    +

    About

    +

    The following document contains information about additional tests which were +carried out on the MSI Z690-A platform with Dasharo firmware by community +members.

    +

    The following list is created based on the information from the +community - people which are currently using the platform with Dasharo +firmware.

    +

    This document contains three main sections: +- Contributing in which we are describing preferred of reporting the results. +- Testing method in which we are describing our preferred testing method. +- Hardware Compatible List in which in a labelled manner we show all + tests carried out by the community.

    +

    Contributing

    +

    Feel free to perform different tests and report your results via +email or submit a Pull Request to +Dasharo documentation repository or by using +Dasharo issues repository.

    +

    Testing method

    +

    Platform testing might be carried out on the basis of +Dasharo Test Specification.

    +

    If you prefer another mechanism for checking any functionality or check any +mechanism that we did not include in the documentation - describe it in the +test report issue.

    +

    Community test results

    + + + + + + + + + + + + + + + + + +
    No.DescriptionLink to descriptionNotes
    1.
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/development/index.html b/variants/msi_z690/development/index.html new file mode 100644 index 00000000000..b9c690a5123 --- /dev/null +++ b/variants/msi_z690/development/index.html @@ -0,0 +1,6004 @@ + + + + + + + + + + + + + + + + + + Development - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo compatible with MSI PRO Z690-A - development

    +

    Intro

    +

    This document gather various notes and documentation useful for development of +Dasharo compatible with the MSI PRO Z690-A platform.

    +

    Hardware connection

    +

    Requirements

    + +

    Serial debug

    +
      +
    • Attach the jumpers in J16 header to enable header J18 according to the + table below:
    • +
    + + + + + + + + + + + + + +
    Jumper position (TX)Jumper position (RX)
    EXT + COMEXT + COM
    +
      +
    • Connect signals from the J18 header to serial receiver:
    • +
    + + + + + + + + + + + + + + + + + +
    RTEMsi Z690
    J18 pin 1 (GND)JBD1 pin 1 (pin closer to JBAT1)
    J18 pin 2 (RX)JBD1 pin 2 (pin further from JBAT1)
    +
    +

    Pins on JBD1 are not described in the documentation. They have been +discovered experimentally. Pay attention to the connections.

    +
    +

    Please also note that this is uni-directional communication. We can gether logs +from booting, but we cannot provide input to the platform at the same time.

    +

    JBD1

    +

    SPI

    +
      +
    • For external flashing, connect RTE with motherboard according to the table + below:
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    RTE SPI headerMSI Z690-A
    J7 pin 1 (Vcc)JTPM1 pin 1 (SPI Power)
    J7 pin 2 (GND)JTPM1 pin 7 (GND)
    J7 pin 3 (CS)JTPM1 pin 5 (RESERVED / BIOS SPI CS pin)
    J7 pin 4 (SCLK)JTPM1 pin 6 (SPI Clock)
    J7 pin 5 (MISO)JTPM1 pin 3 (MISO)
    J7 pin 6 (MOSI)JTPM1 pin 4 (MOSI)
    +
    +

    JTPM1 is a 2mm pitch header, you will need 2mm to 2.54mm female-female dupont +wires to connect to RTE.

    +
    +

    The JTPM1 pin5 is actually BIOS SPI CS pin (marked as reserved in the board +manual).

    +

    JTPM1

    +
      +
    • Example connection:
    • +
    +

    RTE

    +

    All connections

    +

    Power control

    +

    Power buttons control

    +
      +
    • +

      Connect 12V/4A power supply to RTE J13 connector to power on RTE

      +
    • +
    • +

      Connect power control pins from mainboard to RTE according to the table below:

      +
    • +
    +
    +

    JFP1 is located in the corner of the mainbaord, near SATA interface ports

    +
    + + + + + + + + + + + + + + + + + + + + + +
    RTEMsi Z690
    J11 pin 9JFP1 pin 6 (PWR_ON)
    J11 pin 8JFP1 pin 7 (RST)
    J15 pin 1 (GND)JFP1 pin 5 (GND)
    +

    Power supply control

    +

    Connect SeaSonic FOCUS Plus Platinum power supply unit to the mains via +Sonoff S20 Smart Plug. To power control via RTE, Sonoff smart plug

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/faq/index.html b/variants/msi_z690/faq/index.html new file mode 100644 index 00000000000..d91458bb0d2 --- /dev/null +++ b/variants/msi_z690/faq/index.html @@ -0,0 +1,6171 @@ + + + + + + + + + + + + + + + + + + FAQ - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    FAQ

    +

    Why MSI Z690-A (WIFI) (DDR4) was chosen for Dasharo ?

    +

    Please read this extensive analysis contributed to Intel +Reddit.

    +

    Why do you use the nomenclature MSI Z690-A (WIFI) (DDR4)?

    +

    This nomenclature is the result of the naming used by the producer. +MSI PRO Z690-A is the nomenclature used for naming the platform with +DDR5 memory slots. If the platform is also equipped with the WiFi module, its +naming nomenclature will additionally include the phrase WIFI. If instead of +DDR5 memory slots, the platform is equipped with DDR4 memory slots, its naming +nomenclature will additionally include the phrase DDR4.

    +

    Will this work on my MSI PRO Z690-A (model with DDR5 support)?

    +

    Yes, during test procedures the Dasharo firmware work has been confirmed for +the DDR5 platform without WIFI.

    +

    Dasharo working correctness has not been tested on MSI PRO Z690-A WIFI. +However, given its similarity to the other boards, there should be no problems +using Dasharo on it as well.

    +

    Will this work on my MSI PRO Z690-A DDR4?

    +

    Yes, during test procedures the Dasharo firmware work has been confirmed for +the DDR4 WIFI platform. In turn, Dasharo working correctness on +MSI PRO Z690-A DDR4 has been confirmed by the community.

    +

    Can I safely try this on my board?

    +

    If you are afraid of bricking the board and have no means of recovering from +failed installation, we do not recommend trying it out until +at least the v1.0.0 is released. Recovery process is not suitable for +inexperienced users right now. We will be trying to make it easier, and if that +happens, we may change our recommendation here.

    +

    Can I destroy my hardware by installing this firmware?

    +

    We give no warranty, although it is highly unlikely, provided that you use the +supported board model and follow the Initial +Deployment. In the worst scenario, you might "brick" the +board, rendering it unbootable. It can be fixed by following the recovery +procedure. In case of concerns, we invite you to buy the equipment +directly in our online +store with a +subscription service, under which we perform the Dasharo installation with the +latest release, and offer full support through invite-only Matrix channel.

    +

    How can I know if the board is "bricked"?

    +

    In such a case, you would get stuck with black screen on the display. There will +be no beeping sounds from the buzzer as well. The only way to get some +information on what's going on in that state is to use the Serial +header to read out error information.

    +

    What can be the reason of board "bricking"?

    +

    The most common reason would be the fact that you DDR memory modules are not +initialized properly.

    +

    The other reason might be improper or interrupted installation. Please make sure +to follow the Initial Deployment Manual correctly.

    +

    How can I "unbrick" my board?

    +

    Please follow the recovery procedure.

    +

    Which CPUs are supported?

    +

    We can say the "supported" one is the one that have been tested during +Validation Procedure or have been tested by the community.

    +

    The list of all supported CPUs is available in the CPU HCL +documentation.

    +

    In practice, any Alder Lake-S Processor should work.

    +

    12900KS is rather unknown at the moment, because it was released later and may +require more recent microcode.

    +

    Which memory modules are supported?

    +

    We can say the "supported" one is the one that have been tested during +Validation Procedure or have been tested by the community.

    +

    The list of all supported memory modules is available in the +Memory HCL documentation.

    +

    What is the memory profile?

    +

    Currently, Dasharo firmware picks the highest standard SPD Profile, no support +for XMP ones. This means that on the Kingston modules it is actually working at +2400 MHz, but it is expected to work all the way to 3200 MHz.

    +

    Why my GPU doesn't work on MSI PRO Z690-A (DDR4) (WIFI)?

    +

    Due to the fact, that there's no possibility to insert all available GPU drivers +into the firmware, the solution in the form of the Option ROM is in use. +Option ROMs are the drivers flashed in the GPUs non-volatile memory. These +types of drivers can be divided into Legacy Option ROMs and EFI Option ROMs.

    +

    Legacy Option ROMs are only supported on legacy BIOS, such as SeaBIOS. Legacy +BIOS checks the availability of Option ROM and if its signature matches, it +executes its entry point. This option ROM initializes the graphics. The only way +to support Option ROM in UEFI is through CSM, which we do not have +implemented.

    +

    EFI Option ROMs are nothing more than EFI drivers which have the same form as +the UEFI files (PE format). UEFI firmware scans the Option ROM space of the +graphics card and if it finds a potential EFI Option ROM with PE signature, it +executes the file. This option ROM initializes the graphics.

    +

    Considering the above, the firmware might have a problem with initializing older +graphics cards - UEFI standard appeared about 15 years ago.

    +

    The problem might also be caused by an enabled Secure boot - because there is +no certainty that EFI Option ROM is signed correctly.

    +

    Which GPUs are supported?

    +

    We can say the "supported" one is the one that have been tested during +Validation Procedure or have been tested by the community.

    +

    The list of all supported memory modules is available in the +GPU HCL documentation.

    +

    What does the obligatory Dasharo Subscripion includes?

    +

    The Dasharo Bronze Subscription includes:

    +
      +
    • The latest Dasharo release installed by Dasharo Team
    • +
    • Dasharo Updates – number of updates depends on the number of Dasharo + Subscriptions sold and the availability of other funding (e.g., NLNet, + corporate sponsors, community + donations)
    • +
    • Priority support for Dasharo Subscribers through invite-only Matrix channel
    • +
    • Influence on Dasharo features roadmap – you can have a real impact on Dasharo + development by direct access with the developers or premium voting on github. + You will gain the access to the dedicated channels on the matrix communicator. + If you wish to share your Github nickname with us, the votes cast for the + features that you would like to have implemented in the future will be treated + with priority, i.e. they will have a higher priority than the votes of + non-subscribers.
    • +
    • By buying this product, you support open-source firmware and Dasharo + distribution.
    • +
    +

    What means in warranty conditions "No signs of customer interference..."?

    +

    Full question: +"In the Disclaimer, you wrote that one of the warranty +conditions is: "No signs of customer interference with the platform or +firmware." How would a user modify firmware without losing the warranty? Being +open source to be easy to modify, then saying "don't touch this" seems +contradictory. How would you add an exception?"

    +

    Playing with firmware parameters can result in damaging the mainboard. Such +action excludes the acceptance of the return. You can improve the Dasharo by +contributing, so we can pass Dasharo Certification Program and release it in the +next version.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/firmware-update/index.html b/variants/msi_z690/firmware-update/index.html new file mode 100644 index 00000000000..96a15e61029 --- /dev/null +++ b/variants/msi_z690/firmware-update/index.html @@ -0,0 +1,5965 @@ + + + + + + + + + + + + + + + + + + Firmware update - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Firmware update

    +

    The following documentation describes the process of Dasharo open-source +firmware update. The update process may be different, depending on which +firmware version is currently installed on your device. The currently installed +firmware version can be checked with the following command in a Linux +environment:

    +
    sudo dmidecode -t bios | grep Version
    +
    +

    Alternatively, it can be checked in the BIOS Setup Menu.

    +

    Prerequisites

    +

    Before proceeding, ensure that the firmware protections are disabled in +Dasharo Security Options. +Both BIOS boot medium lock and Enable SMM BIOS write protection should be +unchecked. UEFI Secure Boot +must be disabled as well (uncheck Attempt Secure Boot if +Current Secure Boot State does not say Disabled). To apply changes you will +need to reboot.

    +

    Please use one of the following environments to perform Dasharo update:

    + +

    We recommend using the DTS.

    +

    Dasharo Tools Suite

    +

    The DTS allows performing automatic firmware update process, which is the +recommended method. To update your firmware, follow below steps.

    +
      +
    1. Boot DTS using + iPXE on + your platform.
    2. +
    3. Follow firmware + update + procedure described in DTS documentation.
    4. +
    +

    Linux distribution of your choice

    +

    Linux distributions may not yet have the support for the newest chipsets in +flashrom installed via package manager so building the flashrom from source may +be inevitable. You may check if your flashrom supports the Z690 chipset by doing +a dry run without firmware binary:

    +
    sudo flashrom -p internal
    +
    +

    Example output of undetected chipset:

    +
    flashrom v1.2 on Linux 5.19.0-32-generic (x86_64)
    +flashrom is free software, get the source code at https://flashrom.org
    +
    +Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
    +Cannot open file stream for /dev/mtd0
    +No DMI table found.
    +WARNING: No chipset found. Flash detection will most likely fail.
    +========================================================================
    +You may be running flashrom on an unknown laptop. We could not
    +detect this for sure because your vendor has not set up the SMBIOS
    +tables correctly. Some internal buses have been disabled for
    +safety reasons. You can enforce using all buses by adding
    +  -p internal:laptop=this_is_not_a_laptop
    +to the command line, but please read the following warning if you
    +are not sure.
    +
    +Laptops, notebooks and netbooks are difficult to support and we
    +recommend to use the vendor flashing utility. The embedded controller
    +(EC) in these machines often interacts badly with flashing.
    +See the manpage and https://flashrom.org/Laptops for details.
    +
    +If flash is shared with the EC, erase is guaranteed to brick your laptop
    +and write may brick your laptop.
    +Read and probe may irritate your EC and cause fan failure, backlight
    +failure and sudden poweroff.
    +You have been warned.
    +========================================================================
    +No EEPROM/flash device found.
    +Note: flashrom can never write if the flash chip isn't found automatically.
    +
    +

    It means you cannot proceed with this flashrom version and you have to remove +it using your package manager. Then follow the procedure for building the right +flashrom is described in Build flashrom section in the +Initial deployment documentation +(note the procedure describes Ubuntu case only, your package manager and +package names to install may be slightly different). We recommend to use +Dasharo Tools Suite.

    +

    Example of good output:

    +
    flashrom v1.2-1031-g6b2061b on Linux 5.19.0-32-generic (x86_64)
    +flashrom is free software, get the source code at https://flashrom.org
    +
    +Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
    +No DMI table found.
    +Found chipset "Intel Z690".
    +Enabling flash write... SPI Configuration is locked down.
    +FREG0: Flash Descriptor region (0x00000000-0x00000fff) is read-write.
    +FREG1: BIOS region (0x01000000-0x01ffffff) is read-write.
    +FREG2: Management Engine region (0x00001000-0x003d8fff) is read-write.
    +Enabling hardware sequencing because some important opcode is locked.
    +OK.
    +Found Programmer flash chip "Opaque flash chip" (32768 kB, Programmer-specific) on internal.
    +No operations were specified.
    +
    +

    That means you are good to go.

    +

    Migrating SMBIOS unique data (optional)

    +

    Before flashing you may migrate your serial number and UUID as +described in Initial deployment. +Applicable to Dasharo v1.1.0 and later.

    +

    Version v1.1.0 or newer

    +
    +

    Version v1.1.0 had to change the flashmap layout and requires usage of the +procedure below when migrating from v1.0.0 or +older.

    +
    +

    Only the RW_SECTION_A and RW_SECTION_B partitions of the flash needs to be +updated. Flash it using the following command:

    +
    flashrom -p internal -w [path] --fmap -i RW_SECTION_A -i RW_SECTION_B
    +
    +
    +

    To flash newer firmware the command described in the section below +might be also used. But remember, in that case, all Dasharo UEFI settings +will be lost. Also, the memory training procedure will have to be carried out +again.

    +
    +

    Version older than v1.1.0

    +

    In this case, the whole bios region must be updated.

    +
    flashrom -p internal -w [path] --ifd -i bios
    +
    +

    Troubleshooting

    +

    Possible errors are described in the +Generic deployment problems with flashrom

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/gpu-hcl/index.html b/variants/msi_z690/gpu-hcl/index.html new file mode 100644 index 00000000000..eacf5ab4a57 --- /dev/null +++ b/variants/msi_z690/gpu-hcl/index.html @@ -0,0 +1,5877 @@ + + + + + + + + + + + + + + + + + + GPU HCL - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    GPU HCL

    +

    Contributing

    +

    Feel free to test different graphics cards and report your results via +email or submit a Pull Request to +Dasharo documentation repository or by using +Dasharo issues repository.

    +

    If you already have reported your results and you change some hardware +configuration we would appreciate an additional HCL report.

    +

    HCL list

    +

    GPU Hardware Compatibility List presents the GPUs tested and verified +to work with Dasharo by community. The following list does not include GPU +which is tested and verfied in 3mdeb laboratory - this information might be +found in Hardware Matrix documentation.

    +

    Legend:

    +
      +
    • GPU name: the full name of GPU including vendor and model name.
    • +
    • Memory size: total amount of GPU memory declared by vendor.
    • +
    • Memory type: GPU's type of memory.
    • +
    • Bandwidth: GPU's bandwidth.
    • +
    • PCI-E Architecture: declared by producer generation of PCI-E architecture.
    • +
    • Multi-Graphics Technology: information about support for Multi-Graphics + Technology.
    • +
    +

    Information about GPU might be read from GPU package or documentation.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GPU nameMemory sizeMemory typeBandwidthPCI-E GenMulti-Graphics TechnologyResults
    Nvidia GeForce GTX 10603072 MBGDDR5192GB/sGen31Qubes HCL reports
    MSI Radeon RX 6950 XT16 GBGDDR6576GB/sGen41
    EVGA NVidia RTX 20808 GBGDDR6448GB/sGen31
    PNY NVidia RTX A500024 GBGDDR6768GB/sGen41
    Nvidia GeForce GTX 1080TI11264 MBGDDR5Xx16Gen31Qubes HCL reports
    MSI Radeon RX 6500 XT MECH 2X 4G OC4 GBGDDR6x4 (x16 connector)Gen41Works only on Dasharo v1.1.0 or newer
    MSI GeForce RTX 3060 GAMING Z TRIO LHR12 GBGDDR6x16Gen41miczyg setup
    MSI GeForce RTX 4090 GAMING X TRIO24GBGDDR6Xx16Gen41reported via email/matrix
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/hardware-matrix/index.html b/variants/msi_z690/hardware-matrix/index.html new file mode 100644 index 00000000000..92f5c07a685 --- /dev/null +++ b/variants/msi_z690/hardware-matrix/index.html @@ -0,0 +1,6134 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configuration used for validation of the +coreboot port on the MSI PRO Z690-A workstation. For additional information, +please check the FAQ section.

    +

    MSI PRO Z690-A WiFi DDR4, SN: 07D2511_LA1E012608

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core i5-12600K 3.7
    Noctua NH-U12S CPU Cooler
    RAMSlot 1: Kingston KF436C17BBK4/32
    Slot 2: Kingston KF436C17BBK4/32
    Slot 3: Kingston KF436C17BBK4/32
    Slot 4: Kingston KF436C17BBK4/32
    Flash memoryMacronix MX25U25673G
    SSDIntel 670p 512 GB M26472-201 NVME
    USB pendrives1. SanDisk Ultra Flair USB 3.0 16 GB
    2. Kingston DataTraveler 3.1Gen1 16 GB
    SD cardsSanDisk Ultra microSD HC I 16 GB
    Attached devices1. Logitech, Inc. Keyboard K120
    2. Dell Mouse MS116p
    3. 1-port USB Type-C
    NetworkLocal network wired connection
    Power SupplySeaSonic FOCUS Plus Platinum
    Power ControlSonoff S20 EU type E
    Remote Testing EnvironmentRTE v1.1.0
    KVMPiKVM based on Raspberry Pi 4
    +

    MSI PRO Z690-A WiFi DDR4, SN: 07D2511 LA1E346864

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core i5-12600K 3.7
    Noctua NH-U12S CPU Cooler
    RAMSlot 1: Kingston KF436C17BBK4/32
    Slot 2: Kingston KF436C17BBK4/32
    Slot 3: Kingston KF436C17BBK4/32
    Slot 4: Kingston KF436C17BBK4/32
    Flash memoryMacronix MX25U25673G
    SSDIntel 670p 512 GB M26472-201 NVME
    USB pendrives1. SanDisk Ultra Flair USB 3.0 16 GB
    2. Kingston DataTraveler 3.1Gen1 16 GB
    SD cardsSanDisk Ultra microSD HC I 16 GB
    Attached devices1. Logitech, Inc. Keyboard K120
    2. Dell Mouse MS116p
    3. 1-port USB Type-C
    NetworkLocal network wired connection
    Power SupplySeaSonic FOCUS Plus Platinum
    Power ControlSonoff S20 EU type E
    Remote Testing EnvironmentRTE v1.1.0
    +

    MSI PRO Z690-A DDR5, SN: 07D2511_LA1E360456

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core i5-12600K 3.7
    Noctua NH-U12S CPU Cooler
    RAMSlot 1: CRUCIAL CT8G48C40U5
    Slot 2: CRUCIAL CT8G48C40U5
    Slot 3: CRUCIAL CT8G48C40U5
    Slot 4: CRUCIAL CT8G48C40U5
    Flash memoryMacronix MX25U25635F
    SSDIntel 670p 512 GB M26472-201 NVME
    USB pendrivesSanDisk Ultra Flair USB 3.0 16 GB
    Attached devices1. Logitech, Inc. Keyboard K120
    2. Dell Mouse MS116p
    NetworkLocal network wired connection
    Power SupplySeaSonic Focus PX-750
    Power ControlSonoff S20 EU type E
    Remote Testing EnvironmentRTE v1.1.0
    KVMPiKVM based on Raspberry Pi 4
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/hcl/index.html b/variants/msi_z690/hcl/index.html new file mode 100644 index 00000000000..6ed53207d60 --- /dev/null +++ b/variants/msi_z690/hcl/index.html @@ -0,0 +1,6389 @@ + + + + + + + + + + + + + + + + + + Hardware Compatibility - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware Compatibility Lists

    +

    Following compatibility list is compiled thanks to community contribution and +Dasharo Team work. Please note there are other good sources of information +about compatibility like:

    + +

    Feel free to refer to above sources or contact +community, if you can't find your +hardware.

    +
    +
    +
    +

    CPU Hardware Compatibility List presents the CPUs tested and verified +to work with Dasharo by community. The following list does not include CPU +which is tested and verfied in 3mdeb laboratory - this information might be +found in Hardware Matrix documentation.

    +

    Legend:

    +
      +
    • CPU Model: CPU Model name.
    • +
    • Dasharo version: Dasharo version on which report was created.
        +
      • - if version was not reported
      • +
      +
    • +
    • Source: +
    • +
    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CPU ModelDasharo versionSource
    12th Gen Intel(R) Core(TM) i5-12400F-Github PR
    12th Gen Intel(R) Core(TM) i5-12400Fv1.1.0Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i5-12500Tv1.1.0Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i5-12500Tv1.1.0Dasharo HCL report
    12th Gen Intel(R) Core(TM) i5-12600v1.1.0Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i5-12600v1.1.0Dasharo HCL report
    12th Gen Intel(R) Core(TM) i5-12600Kv1.0.0Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i5-12600Kv1.0.0Dasharo HCL report
    12th Gen Intel(R) Core(TM) i5-12600Kv1.1.0Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i5-12600Kv1.1.0Dasharo HCL report
    12th Gen Intel(R) Core(TM) i5-12600Kv1.1.1Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i5-12600Kv1.1.1-rc4Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i7-12700Kv1.0.0Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i7-12700Kv1.0.0Dasharo HCL report
    12th Gen Intel(R) Core(TM) i7-12700Kv1.0.0Qubes HCL reports
    12th Gen Intel(R) Core(TM) i7-12700Kv1.1.0Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i7-12700Kv1.1.1Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i9-12900Kv0.4.0Qubes HCL reports
    12th Gen Intel(R) Core(TM) i9-12900Kv1.1.0Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i9-12900Kv1.1.1Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i9-12900KSv1.1.1Dasharo HCL Report
    12th Gen Intel(R) Core(TM) i9-12900Tv1.1.0Dasharo HCL Report
    +

    +
    +
    +

    Memory hardware Compatibility List presents the DIMM modules tested and verified +to work with Dasharo in 3mdeb laboratory.

    +

    Memory Modules are tested in 1, 2 and 4 modules configurations. These follow +the DIMM population procedures as stated in the Board Manual: 1 module in +DIMMA2 Slot (Single Channel), 2 by adding another module in DIMMB2 (Dual +Channel), and 4 by populating all 4 slots. Testing is defined as passing +firmware POST and booting an OS, since what is being tested is that the Intel +FSP (Firmware Support Package) component is initializing the Memory Modules. We +don't stress test them for stability. Each SPD Profile is tested, so each +Memory Module can have from 1 to 4 entries. You may also check out +Intel memory validation results +page and see the results for DDR4 UDIMM testing. Maximum ratings for Alder Lake +S CPUs is also available in the CPU datasheet.

    +

    Legend:

    +
      +
    • Configuration 1/2/4 - means given memory module was tested in 1, 2 and 4 + DIMMs populated configuration, ✔ means successfully tested, ✖ + means platform did not boot with Dasharo, e.g. ✔/✔/✔ + means all configurations work, - means not tested
    • +
    • Size: DIMM capacity in MB
    • +
    • SPD profile: can be one of JEDEC(Standard) / XMP Profile #1 / XMP Profile #2. + Profile data:
        +
      • Type/speed: for example DDR4-2400 means DDR4 module clocked at max 2400MHz +for given profile
      • +
      • Timings: for example CL17-17-17 means CAS Latency 17, tRCD 17, tRP 17 +(numbers expressed in clock cycles) for given memory profile
      • +
      • Voltage: memory voltage in Volts for given memory profile
      • +
      +
    • +
    +
    +

    NOTE: some XMP profiles may have lower speeds than other ones, but also have +smaller CAS latency. Also the memory frequency configured in the memory +controller and reported by DMI/SMBIOS may be slightly lower than advertised +in the module specifications. This can vary based on the board design, CPU +and many other factors.

    +
    +

    HCL list - MSI PRO Z690-A DDR4

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ManufacturerPart NumberSizeSpeedConfiguration 1/2/4Dasharo versionSource
    CorsairCMK32GX4M2E3200C1616384 MB2133 MT/s (PC4-17000)✔/-/-v1.1.1Dasharo HCL report
    CorsairCMK32GX4M2E3200C1616384 MB2133 MT/s (PC4-17000)-/-/✔v1.1.0Dasharo HCL report
    CorsairCMK64GX4M2E3200C1632768 MB2133 MT/s (PC4-17000)✔/-/-v1.1.1Dasharo HCL report
    Crucial TechnologyBL16G32C16U4B.16FE16384 MB2666 MT/s (PC4-21300)✔/-/-v1.1.0Dasharo HCL report
    Crucial TechnologyBL16G32C16U4B.16FE16384 MB2666 MT/s (PC4-21300)✔/-/-v1.1.1Dasharo HCL report
    Crucial TechnologyCT8G4DFS8266.C8FJ8192 MB2666 MT/s (PC4-21300)✔/-/-v1.1.0Dasharo HCL report
    KingstonKF3200C16D4/16GX16384 MB2400 MT/s (PC4-19200)✔/-/-v1.1.1Dasharo HCL report
    KingstonKF3200C16D4/16GX16384 MB2400 MT/s (PC4-19200)-/-/✔v1.1.1Dasharo HCL report
    KingstonKF3200C16D4/32GX32768 MB2400 MT/s (PC4-19200)-/-/✔v1.1.0Dasharo HCL report
    KingstonKF3200C16D4/32GX32768 MB2400 MT/s (PC4-19200)-/-/✔v1.1.1Dasharo HCL report
    KingstonKF3600C17D4/8GX8192 MB2400 MT/s (PC4-19200)✔/-/-v1.0.0Dasharo HCL report
    KingstonKF3600C17D4/8GX8192 MB2400 MT/s (PC4-19200)-/-/✔v1.0.0Dasharo HCL report
    KingstonKF3600C17D4/8GX8192 MB2400 MT/s (PC4-19200)-/-/✔v1.1.0Dasharo HCL report
    KingstonKF3600C17D4/8GX8192 MB2400 MT/s (PC4-19200)-/-/✔v1.1.1Dasharo HCL report
    KingstonKF3600C17D4/8GX8192 MB2400 MT/s (PC4-19200)-/-/✔v1.1.1-rc4Dasharo HCL report
    Patriot Memory4400 C19 Series8192 MB2133 MT/s (PC4-17000)✔/-/-v1.0.0Dasharo HCL report
    Thermaltake Technology Co LtdRG26D408GX2-3600C18A8192 MB2666 MT/s (PC4-21300)✔/-/-v1.1.0Dasharo HCL report
    +

    +

    HCL list - MSI PRO Z690-A DDR5

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DIMM vendorPart NumberSizeSPD profileConfiguration 1/2/4
    KingstonKF556C40BB/88GB5600MT/s 40-40-40 1.25V✔/✔/✔
    CrucialCT8G48C40U5.M4A1/88GB4800MT/s 40-39-39 1.1V✔/✔/✔
    ADATAAD5U48008G-S8GB4800MT/s 40-40-40 1.1V✔/✔/✔
    +
    +
    +

    NOTE: Since we cannot extend following list based on automatic Dasharo +HCL reports parsing until this +issue would be +addressed we decided to not update GPU HCL ourselves. We will merge PRs to +GPU HCL, if following criteria would be addressed:

    +
      +
    • Card has to be installed on main metal 16x slot, and there shouldn't be + any other GPU except Intel integrated one if non-F CPU.
    • +
    • Confirmation than Dasharo splash screen and Firmware menus were working.
    • +
    • Actual GPU chip (PCI Vendor ID / Device ID).
    • +
    • Video Card model (Subsystem Vendor ID / Device ID).
    • +
    • Option ROM version.
    • +
    • Secure Boot status (Enabled/Disabled, in case than there are Option ROM + signing issues. This also means than the VBIOS should NOT be modded, factory + original versions only)
    • +
    +

    GPU Hardware Compatibility List presents the GPUs tested and verified +to work with Dasharo by community. The following list does not include GPU +which is tested and verfied in 3mdeb laboratory - this information might be +found in Hardware Matrix documentation.

    +

    Legend:

    +
      +
    • GPU name: the full name of GPU including vendor and model name.
    • +
    • Memory size: total amount of GPU memory declared by vendor.
    • +
    • Memory type: GPU's type of memory.
    • +
    • Bandwidth: GPU's bandwidth.
    • +
    • PCI-E Architecture: declared by producer generation of PCI-E architecture.
    • +
    • Multi-Graphics Technology: information about support for Multi-Graphics + Technology.
    • +
    +

    Information about GPU might be read from GPU package or documentation.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    GPU nameMemory sizeMemory typeBandwidthPCI-E GenMulti-Graphics TechnologyResults
    Nvidia GeForce GTX 10603072 MBGDDR5192GB/sGen31Qubes HCL reports
    MSI Radeon RX 6950 XT16 GBGDDR6576GB/sGen41
    EVGA NVidia RTX 20808 GBGDDR6448GB/sGen31
    PNY NVidia RTX A500024 GBGDDR6768GB/sGen41
    Nvidia GeForce GTX 1080TI11264 MBGDDR5Xx16Gen31Qubes HCL reports
    MSI Radeon RX 6500 XT MECH 2X 4G OC4 GBGDDR6x4 (x16 connector)Gen41Works only on Dasharo v1.1.0 or newer
    MSI GeForce RTX 3060 GAMING Z TRIO LHR12 GBGDDR6x16Gen41
    +
    +
    +
    +

    For details how to maintain this documentation please consult Dasharo HCL +Maintainer documentation.

    +

    Contributing

    + +
    CPU model:
    +Dasharo version:
    +
    + +
    decode-dimms > decode-dimms.log 2> decode-dimms.err.log
    +
    +

    In email please include Dasharo version.

    +
    Dasharo version:
    +
    +

    If you already have reported your results and you change some hardware +configuration we would appreciate an update.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/images/msi_z690_all_connections.jpeg b/variants/msi_z690/images/msi_z690_all_connections.jpeg new file mode 100644 index 00000000000..0b88694dd61 Binary files /dev/null and b/variants/msi_z690/images/msi_z690_all_connections.jpeg differ diff --git a/variants/msi_z690/images/msi_z690_connected_rte.jpg b/variants/msi_z690/images/msi_z690_connected_rte.jpg new file mode 100644 index 00000000000..d3eeb0f40ba Binary files /dev/null and b/variants/msi_z690/images/msi_z690_connected_rte.jpg differ diff --git a/variants/msi_z690/images/msi_z690_jtpm1.jpeg b/variants/msi_z690/images/msi_z690_jtpm1.jpeg new file mode 100644 index 00000000000..6bb01e3af25 Binary files /dev/null and b/variants/msi_z690/images/msi_z690_jtpm1.jpeg differ diff --git a/variants/msi_z690/images/msi_z690_serial_panel.jpg b/variants/msi_z690/images/msi_z690_serial_panel.jpg new file mode 100644 index 00000000000..593b7210101 Binary files /dev/null and b/variants/msi_z690/images/msi_z690_serial_panel.jpg differ diff --git a/variants/msi_z690/initial-deployment/index.html b/variants/msi_z690/initial-deployment/index.html new file mode 100644 index 00000000000..40b23ba74d1 --- /dev/null +++ b/variants/msi_z690/initial-deployment/index.html @@ -0,0 +1,6006 @@ + + + + + + + + + + + + + + + + + + Initial deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Initial Deployment

    +

    Initial deployment of Dasharo firmware on MSI PRO Z690-A can be done:

    +
      +
    • using DTS,
    • +
    • manually.
    • +
    +

    Initial deployment using DTS

    +

    To ensure a smooth deployment process, it is recommended to use the latest +version of DTS available from the releases +page. Once you have obtained it, you can +then proceed with following the Dasharo zero-touch initial deployment +section +procedure. This will help you set up Dasharo effectively and without manual +intervention.

    +

    Initial deployment manually

    +

    Flashing coreboot can be done from Linux using flashrom with the internal +programmer. This document describes the process of building, installing and +running flashrom on Ubuntu 22.04.

    +

    Build flashrom

    +

    Currently, the latest flashrom release lacks support for Alder Lake S internal +flashing. Because of this, we need to build flashrom from +3mdeb fork. +The procedure is based on +Ubuntu 22.04 desktop amd64 ISO +burned on the USB stick. Ubuntu 22.04 or newer if preferred, as it contains the +network drivers for Ethernet and WiFi. Older versions of Ubuntu would require +a USB to Ethernet adapter or equivalent to get a network connection and install +required software packages.

    +

    Boot the Ubuntu live image and select the Try Ubuntu option. Open a terminal +and proceed with the commands below.

    +

    Install build dependencies:

    +
    sudo apt-get update
    +sudo apt-get install git build-essential pkg-config libpci-dev udev
    +
    +

    Obtain source code:

    +
    git clone https://github.com/Dasharo/flashrom.git -b dasharo-release
    +cd flashrom
    +
    +

    Build and install flashrom:

    +
    sudo make install
    +
    +

    Flashing

    +

    All flash operations require UEFI Secure Boot to be disabled. You may download +the binary using scp (need to install openssh-server package) or wget +command. The binaries can be found on the release page.

    +

    Reading flash contents

    +

    Always prepare a backup of the current firmware image. To read the original +firmware from the flash and save it to a file (dump.rom), execute the +following command:

    +
    sudo flashrom -p internal -r dump.rom
    +
    +

    IMPORTANT! You will need a second USB storage to keep the dumped firmware +backup or alternatively upload it to some cloud or network drive (Ubuntu live +has a Firefox browser installed). Ubuntu live image is volatile and has no +persistent storage. All changes made in the live image will be lost after +reboot.

    +

    Migrating SMBIOS unique data

    +

    To migrate the SMBIOS system UUID and board serial number follow the Linux +instructions below before attempting to flash the binary. The procedure is +supported on Dasharo version v1.0.0 and later and requires cbfstool built from +coreboot tree. Follow the Building Manual using the v1.0.0 +version or newer and then:

    +
    echo -n `sudo dmidecode -s system-uuid` > system_uuid.txt
    +echo -n `sudo dmidecode -s baseboard-serial-number` > serial_number.txt
    +# assuming in coreboot root directory
    +./build/cbfstool build/coreboot.rom expand -r FW_MAIN_A
    +./build/cbfstool build/coreboot.rom expand -r FW_MAIN_B
    +./build/cbfstool build/coreboot.rom add \
    +    -f serial_number.txt -n serial_number -t raw -r FW_MAIN_A
    +./build/cbfstool build/coreboot.rom add \
    +    -f serial_number.txt -n serial_number -t raw -r FW_MAIN_B
    +./build/cbfstool build/coreboot.rom add \
    +    -f serial_number.txt -n serial_number -t raw -r COREBOOT
    +./build/cbfstool build/coreboot.rom add \
    +    -f system_uuid.txt -n system_uuid -t raw -r FW_MAIN_A
    +./build/cbfstool build/coreboot.rom add \
    +    -f system_uuid.txt -n system_uuid -t raw -r FW_MAIN_B
    +./build/cbfstool build/coreboot.rom add \
    +    -f system_uuid.txt -n system_uuid -t raw -r COREBOOT
    +./build/cbfstool build/coreboot.rom truncate -r FW_MAIN_A
    +./build/cbfstool build/coreboot.rom truncate -r FW_MAIN_B
    +
    +

    One may use msi_ms7d25_v1.0.0.rom (or newer) binary directly and simply build +the cbfstool only from coreboot repository:

    +
    git clone https://github.com/Dasharo/coreboot -b msi_ms7d25/release
    +cd coreboot
    +make -C util/cbfstool
    +echo -n `sudo dmidecode -s system-uuid` > system_uuid.txt
    +echo -n `sudo dmidecode -s baseboard-serial-number` > serial_number.txt
    +# assuming in coreboot root directory
    +./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom expand -r FW_MAIN_A
    +./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom expand -r FW_MAIN_B
    +./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \
    +    -f serial_number.txt -n serial_number -t raw -r FW_MAIN_A
    +./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \
    +    -f serial_number.txt -n serial_number -t raw -r FW_MAIN_B
    +./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \
    +    -f serial_number.txt -n serial_number -t raw -r COREBOOT
    +./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \
    +    -f system_uuid.txt -n system_uuid -t raw -r FW_MAIN_A
    +./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \
    +    -f system_uuid.txt -n system_uuid -t raw -r FW_MAIN_B
    +./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom add \
    +    -f system_uuid.txt -n system_uuid -t raw -r COREBOOT
    +./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom truncate -r FW_MAIN_A
    +./util/cbfstool/cbfstool /path/to/msi_ms7d25_v1.0.0.rom truncate -r FW_MAIN_B
    +
    +

    Note you will need to resign the binary after adding the SMBIOS data. Please +check Vboot documentation how to +resign the data. It is the machine owner's responsibility to generate and use +own keys during updates.

    +

    Flashing Dasharo

    +

    WARNING: If you use an external/discrete GPU and migrate to Dasharo, be +sure to unplug the dGPU first (when the machine is powered off before proceeding +with flashing), as Dasharo firmware does not support all GPU cards properly yet +(as of version v1.0.0). There is a high risk for the graphical output to break +in the firmware when dGPU is connected. Effectively it leaves the only option to +boot in blind into a previously installed OS (if the platform does not brick and +if an OS is present on a disk). The first boot may take up to 2 minutes to +fully train the memory, so be patient and wait for the Dasharo logo to appear, +subsequent boots will take only seconds. MSI EZ debug leds are not supported by +Dasharo and you may notice a red led to be lit. If the platform boots with an +integrated GPU, you may try to plug the external GPU back and boot again.

    +

    To flash Dasharo on the platform, execute the following command:

    +
    +

    Replace the VERSION in firmware file name with the version you want to +flash. For example: msi_ms7d25_v1.1.0_ddr4.rom.

    +
    +
    sudo flashrom -p internal -w msi_ms7d25_vVERSION{_ddr4,_ddr5}.rom --ifd -i bios
    +
    +

    IMPORTANT! After the command succeeds, invoke sudo reboot or click the +reboot/restart in the GUI to reboot the board. Press ENTER when prompted on +the screen to remove the installation media (if Ubuntu live is used). DO NOT +POWEROFF THE BOARD as SMI handlers of original MSI firmware may overwrite flash +contents and cause a brick.

    +

    After migration from MSI firmware to Dasharo and reboot, the firmware will fail +the memory training. After reboot wait approximately 30 seconds and then power +the board off by holding the power button pushed for 5 seconds. Dasharo v1.1.0 +or newer will signal the memory training failure with PC speaker beeps and +blinking SATA LED. When it happens use the power button to power the board off +(no need to wait 30 seconds in such case). Power on the board back. Now the +memory training should not fail and after approximately 1 minute (can be nearly +2 minutes for DDR5 memory), you should get a Dasharo splash screen on the +monitor. Subsequent boots will take only a few seconds.

    +

    Flashing back vendor firmware

    +
    sudo flashrom -p internal -w dump.rom --ifd -i bios
    +
    +

    NOTE: Dasharo version v0.1.0 will not have a network connection. Use a different +USB storage or a USB to Ethernet/USB WiFi adapter to move the binary to the live +system.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/memory-hcl/index.html b/variants/msi_z690/memory-hcl/index.html new file mode 100644 index 00000000000..c7168497471 --- /dev/null +++ b/variants/msi_z690/memory-hcl/index.html @@ -0,0 +1,5981 @@ + + + + + + + + + + + + + + + + + + Memory HCL - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + + + +
    +
    + + + + + + + + + +

    Memory HCL

    +

    Contributing

    +

    Feel free to test different modules and report your results via +email or submit a Pull Request to +Dasharo documentation repository.

    +

    Be sure to include information about the memory:

    +
      +
    1. If using Linux use sudo dmidecode -t memory.
    2. +
    3. If using Windows attach screenshots from CPU-Z for example.
    4. +
    5. +

      Part Number of the Memory Modules:

      +
        +
      • If you have physical access to the modules, the Part Number is printed on + a sticker. You may send a photo where the sticker is legible if you can't + identify it.
      • +
      • The Part Number is also usually available as data on the SPD and + retrievable via Software (see point 2 below), but sometimes it is + possible than it doesn't match the Part Number on the sticker, or that it + wasn't programmed onto the SPD at all.
      • +
      +
    6. +
    7. +

      Dump of SPD Profiles:

      +
        +
      • If using Linux use sudo dmidecode -t memory. Additionally you may + provide SPD data binaries (example for Ubuntu for all 4 DIMMs):
      • +
      +
      sudo apt-get install i2c-tools
      +decode-dimms > dimms.log
      +cat /sys/bus/i2c/drivers/ee1004/0-0050/eeprom > dimm0_spd.bin
      +cat /sys/bus/i2c/drivers/ee1004/0-0051/eeprom > dimm1_spd.bin
      +cat /sys/bus/i2c/drivers/ee1004/0-0052/eeprom > dimm2_spd.bin
      +cat /sys/bus/i2c/drivers/ee1004/0-0053/eeprom > dimm3_spd.bin
      +
      +
        +
      • If using Windows attach screenshots from CPU-Z SPD Tab. If multiple + modules are installed, make sure to open multiple CPU-Z instances and + have each one cover a different Slot via the Memory Slot Selection drop + down list.
      • +
      +
    8. +
    +

    DDR4 DIMMs include a SPD ROM which can have up to 4 SPD Profiles. Each SPD +Profile contains data for a combination of Speed (MHz), Timings and Voltage +that the module is factory rated to run at. These SPD Profiles can be +considered either JEDEC standard or XMP (Overclocking). Currently, Dasharo only +loads the JEDEC standard profile and ignores the XMP ones.

    +
    +

    Currently memory profile is not selectable via BIOS setup. This feature is +planned for future releases.

    +
    +

    HCL list

    +

    The Memory Hardware Compatibility List presents the DIMM modules tested and verified +to work with Dasharo in 3mdeb laboratory.

    +

    Memory Modules are tested in 1, 2 and 4 modules configurations. These follow +the DIMM population procedures as stated in the Board Manual: 1 module in +DIMMA2 Slot (Single Channel), 2 by adding another module in DIMMB2 (Dual +Channel), and 4 by populating all 4 slots. Testing is defined as passing +firmware POST and booting an OS, since what is being tested is that the Intel +FSP (Firmware Support Package) component is initializing the Memory Modules. We +don't stress test them for stability. Each SPD Profile is tested, so each +Memory Module can have from 1 to 4 entries. You may also check out +Intel memory validation results +page and see the results for DDR4 UDIMM testing. Maximum ratings for Alder Lake +S CPUs is also available in the CPU datasheet.

    +

    Legend:

    +
      +
    • Configuration 1/2/4 - means given memory module was tested in 1, 2 and 4 + DIMMs populated configuration, ✔ means successfully tested, ✖ + means platform did not boot with Dasharo, e.g. ✔/✔/✔ + means all configurations work, - means not tested
    • +
    • Size: DIMM capacity in GB
    • +
    • SPD profile: can be one of JEDEC(Standard) / XMP Profile #1 / XMP Profile #2. + Profile data:
        +
      • Type/speed: for example DDR4-2400 means DDR4 module clocked at max 2400MHz +for given profile
      • +
      • Timings: for example CL17-17-17 means CAS Latency 17, tRCD 17, tRP 17 +(numbers expressed in clock cycles) for given memory profile
      • +
      • Voltage: memory voltage in Volts for given memory profile
      • +
      +
    • +
    +
    +

    NOTE: some XMP profiles may have lower speeds than other ones, but also have +smaller CAS latency. Also the memory frequency configured in the memory +controller and reported by DMI/SMBIOS may be slightly lower than advertised +in the module specifications. This can vary based on the board design, CPU +and many other factors.

    +
    +

    HCL list - MSI PRO Z690-A DDR4

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DIMM vendorPart NumberSizeSPD profileConfiguration 1/2/4
    KingstonKF436C17BBK4/328GBJEDEC: DDR4-2400 CL17-17-17 1.2V✔/✔/✔
    KingstonKF436C17BBK4/328GBXMP profile #1: DDR4-3600 CL17-21-21 1.35V-/-/✔
    KingstonKF436C17BBK4/328GBXMP profile #2: DDR4-3000 CL15-17-17 1.35V-/-/✔
    CorsairCMK16GX4M2B3200C168GBXMP 2.0: DDR4-3200 PC4-25600 CL16-18-18-36 1.35 V-/-/✔
    KingstonKF432C16BB1/1616GBJEDEC: DDR4-2400 CL17-17-17 1.2V-/✔¹/✔
    PNY8GBF1X08QFHH38-135-K-HXR8GBJEDEC: DDR4-2133 CL15-15-15 1.2V-/✔¹/✔
    KingstonKF436C18BBK2/6432GBJEDEC: DDR4-2400 CL17-17-17-39 1.2V✔/✔/-
    KingstonKHX2666C16/16G16GBJEDEC: DDR4-2133 CL16-18-18-39 1.2V✔/✔/✔
    OLOyMD4U323216DJDA32GBJEDEC: DDR4-2133 CL15-15-15-36 1.2V✔/✔/✔
    KingstonKF3600C16D4/16GX16GBJEDEC: DDR4-2400 CL17-17-17-39 1.2V✔/✔/✔
    +

    1) Tested in 2x2 mixed configuration

    +

    HCL list - MSI PRO Z690-A DDR5

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DIMM vendorPart NumberSizeSPD profileConfiguration 1/2/4
    KingstonKF556C40BB/88GB5600MT/s 40-40-40 1.25V✔/✔/✔
    CrucialCT8G48C40U5.M4A1/88GB4800MT/s 40-39-39 1.1V✔/✔/✔
    ADATAAD5U48008G-S8GB4800MT/s 40-40-40 1.1V✔/✔/✔
    + + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/openness_analysis/index.html b/variants/msi_z690/openness_analysis/index.html new file mode 100644 index 00000000000..3546a6f974b --- /dev/null +++ b/variants/msi_z690/openness_analysis/index.html @@ -0,0 +1,6322 @@ + + + + + + + + + + + + + + + + + + Openness score - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo Openness Score

    +

    This document aims to compare the openness of Dasharo firmware and AMI BIOS for +MSI PRO Z690-A DDR4 WiFI.

    +

    There is an +ongoing discussion +about the methodology of the openness metric.

    +

    BIOS versions used in the analysis

    + +

    MSI original BIOS from AMI

    +

    In the case of the AMI BIOS, the entire image should be considered proprietary. +There are several parts of the image that have a well-known structure or make +use of a public standard. However, to decode these structures, one needs to +employ reverse-engineering tools and techniques to know what structures are +present. For simplicity we treat UEFI variables as BIOS data. All empty padding +regions between FFS and all volume free spaces are treated as unused space.

    +

    Dasharo BIOS

    +

    CBFS regions

    +

    The below table shows only a single FMAP region COREBOOT. There are also two RW +vboot partitions containing copies of the same components from COREBOOT region +(except the verstage, bootblock and cbfs master header). Note that there are +other regions to store non-volatile data like MRC cache, UEFI variables or +vboot state backup.

    +

    Region COREBOOT:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FileSize (bytes)Is it open-source?
    cbfs master header32
    fallback/romstage95152
    cpu_microcode_blob.bin944144
    intel_fit80
    fallback/ramstage127231(LZMA)
    config1378
    revision842
    build_info142
    fallback/dsdt.aml9973
    vbt.bin1254 (LZMA)
    (empty)2596N/A
    fspm.bin720896
    fsps.bin290481 (LZ4)
    fallback/postcar37504
    fallback/payload1813047 (LZMA)✔ (with exceptions)
    fallback/verstage77008
    (empty)1055076N/A
    bootblock31808
    +

    The payload used is Tianocore EDK2 UEFIPayload. In order to support network +boot over i225 Ethernet, an i225 EFI driver is included in the payload. The +driver is 154064 bytes in size uncompressed (63445 LZMA compressed). The 63445 +bytes will be added to closed source pool and removed from the payload size in +the calculations.

    +

    Note that UEFIPayload has support for Option ROM loading, for example to +support external graphics card output during POST. It is an additional +closed-source code which depends on the hardware configuration and is not +included in the calculations.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeTotal size (bytes)Percent
    COREBOOT region5208644N/A
    empty1057672N/A
    code size (open + closed)4150972N/A
    open-source213200651.36%
    closed-source201896648.64%
    +

    Region FW_MAIN_A/FW_MAIN_B:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FileSize (bytes)Is it open-source?
    fallback/romstage95152
    cpu_microcode_blob.bin944144
    fallback/ramstage127231(LZMA)
    config1378
    revision842
    build_info142
    fallback/dsdt.aml9973
    (empty)100N/A
    fspm.bin720896
    fsps.bin290481 (LZ4)
    vbt.bin1254 (LZMA)
    fallback/postcar37504
    fallback/payload1813047 (LZMA)✔ (with exceptions)
    (empty)1306724N/A
    +

    The FW_MAIN_A/FW_MAIN_B regions have been expanded first with CBFStool to show +whole empty space for given region.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeTotal size (bytes)Percent
    FW_MAIN_A/B region5340928N/A
    empty1306824N/A
    code size (open + closed)4042044N/A
    open-source202307850.05%
    closed-source201896649.95%
    +

    COREBOOT has slightly higher open-source code percentage due to verstage and +bootblock not being present in FW_MAIN_A/B regions. Summary for all 3 regions:

    +

    Whole flash image

    +

    To get the overall BIOS region and full image percentage of open source code we +ignore unused space or FMAP regions which do not have CBFS and are merely data +generated during build process or boot process. The BIOS region percentage is +calculated as follows:

    +

    (COREBOOT region open-source size + FW_MAIN_A/B open-source size * 2) * 100 +divided by (COREBOOT region code size + FW_MAIN_A/B code size * 2).

    +

    Full image code only percentage is calculated as follows:

    +

    (COREBOOT region open-source size + FW_MAIN_A/B open-source size * 2) * 100 +divided by +(ME + descriptor + COREBOOT region code size + FW_MAIN_A/B code size * 2).

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    RegionSize (bytes)Open-source percent (bytes)
    descriptor0x10000%
    ME0x3D90000%
    unused hole0xC26000N/A
    BIOS0x100000050.5%
    Summary0x200000038%
    +

    Comparison of pure code open-source vs closed-source.

    +

    +

    +

    This was rather expected result.

    +

    AMI BIOS region statistics:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeTotal size (bytes)Percent
    BIOS data (UEFI var)524288N/A
    empty7638472N/A
    code size (open + closed)8614456N/A
    open-source00%
    closed-source8614456100%
    +

    Full BIOS region openness compared to AMI BIOS with data and free space:

    +

    +

    +

    That mean

    +

    Full image openness code only compared to AMI BIOS:

    +

    +

    +

    Few conclusions from the above charts:

    +
      +
    • Dasharo needs more space for BIOS data, it is mainly dictated by the usage of + vboot which needs a significant amount of space for VBLOCKs, GBB and other + stuff
    • +
    • BIOS data is rather comparable between the firmware distributions, although + it must be noted that vboot also generates BIOS data as explained above
    • +
    • Dasharo has much less free space than AMI, however it must be noted that + Dasharo contains 3! copies of functional firmware, but AMI only a single + copy. Without vboot, BIOS region free space would reach over 70%!
    • +
    • While BIOS region's Dasharo Openness Score is 50%, when compared with Intel + ME and descriptor, the overall Dasharo Openness Score is 38%
    • +
    • ME share is different because the size of BIOS code is different on both + distributions
    • +
    +

    Summary

    + + + + + + + + + + + + + + + + + +
    ImageOpen-source percent (bytes)
    AMI BIOS0%
    Dasharo38%
    +

    Dasharo code takes approximately 4MB of space for a single region + some space +for data which is less than 1MB. This reduces the single copy of firmware from +8MB to roughly 4MB compared to AMI BIOS. This is roughly 50% reduction of +TCB! More over, given the 50% share in size of open-source code, Dasharo +liberates BIOS in 75%!

    +

    +

    +

    Few conclusions:

    +
      +
    • Although the reduction of TCB is 50% it cannot be seen on the charts due to + 3 copies of the firmware in Dasharo image. It also effectively increases the + percentage of BIOS code both open and closed source in the full image.
    • +
    • More significant differences would be seen with vboot disabled, there would + be more free space and even less BIOS code both open and closed
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/overview/index.html b/variants/msi_z690/overview/index.html new file mode 100644 index 00000000000..36948453963 --- /dev/null +++ b/variants/msi_z690/overview/index.html @@ -0,0 +1,5932 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    + + +
      +
    • Releases - groups information about all releases.
    • +
    • Building manual - describes how to build Dasharo for + the MSI PRO Z690-A.
    • +
    • Initial deployment - describes initial Dasharo + deployment methods (i. e. flashing new firmware) for the MSI PRO Z690-A.
    • +
    • Firmware update - explains supported Dasharo + open-source firmware update methods.
    • +
    • Recovery - gathers information on how to recover the platform + from potential failure.
    • +
    • Hardware configuration matrix - describes the + platform's hardware configuration used during the Dasharo firmware + validation procedure.
    • +
    • Test matrix - describes the validation scope used during the + Dasharo firmware validation procedure.
    • +
    • Development - describes information for Dasharo developers.
    • +
    • Memory Compatibility - describes compatible memory modules + tested by the community.
    • +
    • CPU Compatibility - describes compatible processors tested by + the community.
    • +
    • GPU Compatibility - describes compatible graphics cards tested + by the community.
    • +
    • Community test results - describes the test + results performed by the community.
    • +
    • FAQ - answers for frequently asked questions.
    • +
    +

    Useful documents

    + +

    Press releases

    + +

    Buy the MSI PRO Z690-A DDR4 with Dasharo firmware

    +

    The Full PC Build with MSI PRO Z690-A DDR4 motherboard with Dasharo firmware is +available at the official 3mdeb +store.

    +

    You can also buy the product by mailing us at: +shopping@3mdeb.com.

    +

    Device assembly and presale validation will be carried out in accordance with +the following +procedure.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/recovery/index.html b/variants/msi_z690/recovery/index.html new file mode 100644 index 00000000000..2b26dcae51e --- /dev/null +++ b/variants/msi_z690/recovery/index.html @@ -0,0 +1,6045 @@ + + + + + + + + + + + + + + + + + + Recovery - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Recovery

    +

    Intro

    +

    This project is in early development phase. On certain +hardware configurations, the Dasharo firmware may not boot correctly (i.e. +we will have "bricked" the platform). In such a case, the recovery procedure can +reinstall the original firmware from the board manufacturer.

    +

    There are two documented recovery methods: using a CH341A programming kit +or an RTE.

    +

    External flashing with programmer

    +

    RTE

    +

    In this case, using external programmer is necessary. We are using +RTE +here.

    +
      +
    • +

      Connect programmer to the flash chip as shown in the + Hardware connection / SPI section of + the Development documentation.

      +
    • +
    • +

      Download official BIOS from vendor's website (this is the newest version, you + may choose an older one too or in the best case use your firmware backup):

      +
    • +
    +
    wget https://download.msi.com/bos_exe/mb/7D25v13.zip
    +unzip 7D25v13.zip
    +
    +
      +
    • Flash via external programmer:
    • +
    +
    +

    The command line will be different, depending on the programmer you use

    +
    +
    flashrom -p linux_spi:dev=/dev/spidev1.0,spispeed=16000 -w 7D25v13/E7D25IMS.130
    +
    +
      +
    • First boot after the recovery process is significantly longer
    • +
    +

    CH341A

    +

    Prerequisites

    +

    The full set is now available at our online shop.

    +
      +
    1. +

      CH341A kit with 1.8V level-shifter. Can be bought on e.g. Amazon

      +

      +
    2. +
    3. +

      WSON8 probe. Can be bought from China on Aliexpress or eBay.

      +

      +
    4. +
    5. +

      USB2.0 Female-Male extension cord 0.5m or longer (optional)

      +

      +
    6. +
    7. +

      Machine with Linux and flashrom.

      +
    8. +
    +

    Connection

    +

    First start with assembling the CH341A and the 1.8V adapter. Pay attention to +which holes you attach the adapter. You should use the holes marked as 25XX +(closer to the USB plug):

    +

    +

    Place the 1.8V adapter in the holes and lock it with the lever. Be sure that +the arrow on the adapter is facing the black lever (opposite side of USB plug):

    +

    +

    Now take the breakout board with pin headers:

    +

    +

    and plug it into the other 1.8V adapter, be sure that numbers 1-4 on the breakout +match the numbers 1 and 4 on the adapter:

    +

    +

    Numbers should be visible on the upper side after assembling:

    +

    +

    Next, take the WSON8 probe and locate the white dot on the needles side (it +will indicate the first reference pin, although you may use any other corner pin):

    +

    +

    Check which wire is connecting to this pin (the connection should be 1 to 1). +In my case it is white wire and it will be used as reference to connect the +wires to the breakout board:

    +

    +

    The wires should follow the same order of colors as on the probe (keep them +straight, and do not cross). Repeat with the other 4 wires on the other side of the +probe:

    +

    +

    Now the connection is ready. Time to locate the flash chip of the board.

    +

    Flashing

    +

    Connect the CH341A USB plug to the host machine which will be doing the +flashing process (optionally use the USB extension cord for convenience). +Locate the flash chip on the MSI PRO Z690-A DDR4 board:

    +

    +

    Locate the first pin on the flash chip (marked with a circle on the flash chip +package and indicated by number 1 printed on the board - red circle):

    +

    +

    Attach the WSON8 probe matching the first pin of the probe (white wire) and +first pin of the flash chip:

    +

    +

    Now on the Linux machine check if the flash is detected using a sample command

    +
    sudo flashrom -p ch341a_spi -r firmware.bin
    +
    +

    You should see something like this:

    +
    flashrom v1.2-567-gf4eb405 on Linux 5.19.9-200.fc36.x86_64 (x86_64)
    +flashrom is free software, get the source code at https://flashrom.org
    +
    +Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
    +Found Winbond flash chip "W25Q256.W" (32768 kB, SPI) on ch341a_spi.
    +Reading flash... done.
    +
    +

    You don't need to wait for the command completion and interrupt it with Ctrl+C +shortcut, it just serves as a confirmation of good connection. If you decide to +interrupt it, reset the CH341A programmer by unpluging and repluging it to USB +port. Now stabilize your hand holding the WSON8 probe on the flash chip and +invoke the real flashing command (e.g. if your original/working firmware backup +is saved as firmware_backup.bin):

    +
    sudo flashrom -p ch341a_spi -w firmware_backup.bin
    +
    +

    Note that USB programmers are pretty slow, the whole operation make take +several minutes (can be 10-15 minutes in worst case). At the end of operation +you should see:

    +
    flashrom v1.2-567-gf4eb405 on Linux 5.19.9-200.fc36.x86_64 (x86_64)
    +flashrom is free software, get the source code at https://flashrom.org
    +
    +Using clock_gettime for delay loops (clk_id: 1, resolution: 1ns).
    +Found Winbond flash chip "W25Q256.W" (32768 kB, SPI) on ch341a_spi.
    +Reading old flash chip contents... done.
    +Erasing and writing flash chip... Erase/write done.
    +Verifying flash... VERIFIED.
    +
    +

    MSI Flash BIOS Button

    +

    The MSI Flash BIOS Button +would give us easy-to-use recovery method. We have tried that one to switch +from Dasharo firmware to the original one, but it did not work, unfortunately. +The details of how this process exactly works are unknown due to the closed +nature of it's implementation. We can research this topic more in the future, +so maybe it can be utilized later for deployment and/or recovery of the +platform.

    +

    SMBIOS unique data recovery

    +

    Serial number format and recovery

    +

    SMBIOS specification +sections 7.2 and 7.3 defines two spaces for serial number: the system serial +number and baseboard serial number. The original MSI PRO Z690-A firmware +provides only the baseboard serial number.

    +

    In case you have lost your serial number in the process of flashing Dasharo or +newer MSI firmware, there is a way to retrieve it. The board has a QR code +printed on the mainboard between the chipset heatsink and dPGU PCIe slot:

    +

    +

    If you read the QR code with your smartphone you will get the full serial +number. The serial number has the format 07D25xx_LyzEaaaaaa where:

    +
      +
    • 07D25 - is the board model, i.e. MS-7D25 for this particular board
    • +
    • xx is the mainboard revision which should match the revision imprinted + between the M2_1 slot and dGPU slot. E.g. xx=11 means VER:1.1
    • +
    • yz is the manufacturing date in hex, i.e. y is the month, z is the + year, for example A1 means October 2021, 12 means January + 2022
    • +
    • aaaaaa is the unique 6-digit number which is imprinted under the serial + number QR code
    • +
    +

    System UUID format and recovery

    +

    SMBIOS specification +section 7.2 defines a field for unique system identification with a special +number called UUID (Universally Unique IDentifier). UUID is specified by +RFC 4122. MSI firmware +provides the system UUID in the SMBIOS system information structure.

    +

    The problem with UUID is that it cannot be recovered if the backup binary or +SMBIOS logs are lost. You can backup the SMBIOS information with our +Dasharo Tools Suite bootable stick. +The dmidecode.log will have all the necessary information. Things we know +about MSI system UUID:

    +
      +
    • UUID format is as follows: 33221100-5544-7766-8899-AABBCCDDEEFF, the hex + numbers represent the order of bytes in memory for the little-endian format + as required by SMBIOS
    • +
    • MSI UUIDs do not conform to any of the RFC 4122 UUID variants/versions (the + bits responsible for UUID version and variant identification are not constant + across multiple boards)
    • +
    • the last octet group AABBCCDDEEFF is equal to the MAC address of the + on-board Intel i225 Ethernet, so be sure to NOT share the UUID with + anybody as it contains system sensitive information
    • +
    • the first four groups are either random numbers or some cryptographically + acquired value from e.g. combination of some board data, unfortunately it is + not known by us
    • +
    +

    The MAC address is printed on a sticker placed on the 2x2 SATA connector:

    +

    +

    SMBIOS data migration

    +

    For Dasharo simply follow the Initial Deployment how +to migrate the data.

    +

    For MSI firmware you will probably need an AMI DMI/SMBIOS editor to save those +values back if you do not have a backup binary.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/releases/index.html b/variants/msi_z690/releases/index.html new file mode 100644 index 00000000000..0eceab0f864 --- /dev/null +++ b/variants/msi_z690/releases/index.html @@ -0,0 +1,6272 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Release Notes

    +

    Following Release Notes describe status of Open Source Firmware development for +MSI PRO Z690-A (WIFI) DDR4 and MSI PRO Z690-A (WIFI).

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    +Subscribe to Dasharo compatible with MSI PRO Z690-A Newsletter +

    +

    Test results for this platform can be found +here.

    +

    v1.1.1 - 2023-02-23

    +

    Test results for this release can be found +here.

    +

    To get more details about the changes one may read the +Dasharo v1.1.1 release blog post

    +

    Added

    + +

    Changed

    + +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    msi_ms7d25_v1.1.1_ddr4.rom +sha256 +sha256.sig

    +

    msi_ms7d25_v1.1.1_ddr5.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.1.0 - 2022-11-22

    +

    Added

    + +

    Changed

    +
      +
    • Added new ACPI Platform driver that installs coreboot exposed ACPI tables and + all allows native EDK2 ACPI table protocol to install new tables, e.g. + Firmware Performance Data Table, BGRT (Boot Logo) of VFCT (AMD GPU ACPI + table)
    • +
    • Secure Boot is now disabled by default with all keys erased
    • +
    • iPXE is now built from source using coreboot-sdk and + included externally into UEFI Payload
    • +
    • Dasharo setup menu full screen mode support
    • +
    • Disabled PCIe ASPM and Clock PM for better PCIe device compatibility
    • +
    • Disabled GPIO programming by FSP, coreboot handles the GPIO completely. This + additionally fixes a bug in FSP which did not enable SATA DEVSLP properly.
    • +
    • Changed Super I/O pin for PECI mode to reflect vendor firmware setting
    • +
    • Switched from IOT FSP to public ADL Client FSP
    • +
    • Switched to include microcode from public Intel microcode repository
    • +
    • Disabled PCIe hotplug
    • +
    • Network boot disabled by default, now configurable via menu option
    • +
    +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    msi_ms7d25_v1.1.0_ddr4.rom +sha256 +sha256.sig

    +

    msi_ms7d25_v1.1.0_ddr5.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    Commands snippet:

    +
    gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-1.x-compatible-with-msi-ms-7d25-signing-key.asc
    +gpg --list-sigs "3mdeb Master Key" "3mdeb Dasharo Master Key" "Dasharo release 1.x compatible with MSI MS-7D25 signing key"
    +# DDR4
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr4.rom
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr4.rom.sha256
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr4.rom.sha256.sig
    +sha256sum -c msi_ms7d25_v1.1.0_ddr4.rom.sha256
    +gpg --verify msi_ms7d25_v1.1.0_ddr4.rom.sha256.sig msi_ms7d25_v1.1.0_ddr4.rom.sha256
    +# DDR5
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr5.rom
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr5.rom.sha256
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.1.0/msi_ms7d25_v1.1.0_ddr5.rom.sha256.sig
    +sha256sum -c msi_ms7d25_v1.1.0_ddr5.rom.sha256
    +gpg --verify msi_ms7d25_v1.1.0_ddr5.rom.sha256.sig msi_ms7d25_v1.1.0_ddr5.rom.sha256
    +
    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.0 - 2022-05-27

    +

    Added

    +
      +
    • Serial number and UUID in CBFS support
    • +
    • TPM Physical Presence Interface support
    • +
    +

    Changed

    + +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    MSI PRO Z690-A WIFI DDR4 v1.0.0 +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    Commands snippet:

    +
    gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-1.x-compatible-with-msi-ms-7d25-signing-key.asc
    +gpg --list-sigs "3mdeb Master Key" "3mdeb Dasharo Master Key" "Dasharo release 1.x compatible with MSI MS-7D25 signing key"
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.0.0/msi_ms7d25_v1.0.0.rom
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.0.0/msi_ms7d25_v1.0.0.rom.sha256
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v1.0.0/msi_ms7d25_v1.0.0.rom.sha256.sig
    +sha256sum -c msi_ms7d25_v1.0.0.rom.sha256
    +gpg --verify msi_ms7d25_v1.0.0.rom.sha256.sig msi_ms7d25_v1.0.0.rom.sha256
    +
    +

    SBOM (Software Bill of Materials)

    + +

    v0.4.0 - 2022-05-13

    +

    Added

    + +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    MSI PRO Z690-A WIFI DDR4 v0.4.0 +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    Commands snippet:

    +
    gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-0.x-compatible-with-msi-ms-7d25-signing-key.asc
    +gpg --list-sigs "3mdeb Master Key" "3mdeb Dasharo Master Key" "Dasharo release 0.x compatible with MSI MS-7D25 signing key"
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.4.0/msi_ms7d25_v0.4.0.rom
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.4.0/msi_ms7d25_v0.4.0.rom.sha256
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.4.0/msi_ms7d25_v0.4.0.rom.sha256.sig
    +sha256sum -c msi_ms7d25_v0.4.0.rom.sha256
    +gpg --verify msi_ms7d25_v0.4.0.rom.sha256.sig msi_ms7d25_v0.4.0.rom.sha256
    +
    +

    SBOM (Software Bill of Materials)

    + +

    v0.3.0 - 2022-05-05

    +

    Added

    + +

    Known issues

    + +

    Binaries

    +

    MSI PRO Z690-A WIFI DDR4 v0.3.0 +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    Commands snippet:

    +
    gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-0.x-compatible-with-msi-ms-7d25-signing-key.asc
    +gpg --list-sigs "3mdeb Master Key" "3mdeb Dasharo Master Key" "Dasharo release 0.x compatible with MSI MS-7D25 signing key"
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.3.0/msi_ms7d25_v0.3.0.rom
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.3.0/msi_ms7d25_v0.3.0.rom.sha256
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.3.0/msi_ms7d25_v0.3.0.rom.sha256.sig
    +sha256sum -c msi_ms7d25_v0.3.0.rom.sha256
    +gpg --verify msi_ms7d25_v0.3.0.rom.sha256.sig msi_ms7d25_v0.3.0.rom.sha256
    +
    +

    SBOM (Software Bill of Materials)

    + +

    v0.2.0 - 2022-04-22

    +

    Added

    + +

    Known issues

    + +

    Binaries

    +

    MSI PRO Z690-A WIFI DDR4 v0.2.0 +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    Commands snippet:

    +
    gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-0.x-compatible-with-msi-ms-7d25-signing-key.asc
    +gpg --list-sigs "3mdeb Master Key" "3mdeb Dasharo Master Key" "Dasharo release 0.x compatible with MSI MS-7D25 signing key"
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.2.0/msi_ms7d25_v0.2.0.rom
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.2.0/msi_ms7d25_v0.2.0.rom.sha256
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/v0.2.0/msi_ms7d25_v0.2.0.rom.sha256.sig
    +sha256sum -c msi_ms7d25_v0.2.0.rom.sha256
    +gpg --verify msi_ms7d25_v0.2.0.rom.sha256.sig msi_ms7d25_v0.2.0.rom.sha256
    +
    +

    SBOM (Software Bill of Materials)

    + +

    v0.1.0 - 2022-04-13

    +

    Added

    + +

    Known issues

    + +

    Binaries

    +

    MSI PRO Z690-A WIFI DDR4 v0.1.0 +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    Commands snippet:

    +
    gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/msi_ms7d25/dasharo-release-0.x-compatible-with-msi-ms-7d25-signing-key.asc
    +gpg --list-sigs "3mdeb Master Key" "3mdeb Dasharo Master Key" "Dasharo release 0.x compatible with MSI MS-7D25 signing key"
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/msi_ms7d25_v0.1.0.rom
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/msi_ms7d25_v0.1.0.rom.sha256
    +wget https://3mdeb.com/open-source-firmware/Dasharo/msi_ms7d25/msi_ms7d25_v0.1.0.rom.sha256.sig
    +sha256sum -c msi_ms7d25_v0.1.0.rom.sha256
    +gpg --verify msi_ms7d25_v0.1.0.rom.sha256.sig msi_ms7d25_v0.1.0.rom.sha256
    +
    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z690/test-matrix/index.html b/variants/msi_z690/test-matrix/index.html new file mode 100644 index 00000000000..8ad7ef4b9c3 --- /dev/null +++ b/variants/msi_z690/test-matrix/index.html @@ -0,0 +1,6132 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Note, that the below-described test scope is used during Dasharo +Certification Procedure for both tested platforms: +MSI PRO Z690-A WiFi DDR4 and MSI PRO Z690-A DDR5.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.UEFI ShellUSHAll
    4.Display ports and LCD supportDSPDSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003
    5.USB HID and MSC SupportUSBAll
    6.SMBIOSDMIDMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001, DMI008.001
    7.Custom boot logoCLGAll
    8.M.2 WiFi/BluetoothWLEAll
    9.Audio subsystemAUDAUD001.001, AUD001.002, AUD004.001, AUD004.002 AUD005.001, AUD005.002 AUD006.001, AUD006.002
    10.NVMe supportNVMAll
    11.Network bootPXEWithout PXE007.001
    12.Debian Stable and Ubuntu LTS supportLBTLBT003.001, LBT003.002, LBT004.001, LBT004.002
    13.Windows bootingWBTAll
    14.SD card supportSDCAll
    15.Custom Boot KeysCBKAll
    16.Dasharo Tools SuiteDTSDTS001.001, DTS002.001, DTS003.001, DTS004.001, DTS005.001, DTS006.001
    17.CPU statusCPUAll
    18.Platform suspend and resumeSUSPWithout SUSP004.001
    19.Super I/O initialization - QubesOSPPSAll
    20.Device power control operationsDPCAll
    21.Display resolution - QubesOSDSRAll
    22.SATA hot-plug detectionSHTAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001 and TPM002.001
    2.Verified Boot supportVBOWithout VBO006.001, VBO007.001
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOAll
    5.ME disable/neuter supportMNEAll
    6.BIOS lock supportBLSAll
    7.SMM BIOS write protectionSMMAll
    8.Early boot DMA protectionEDPAll
    9.UEFI Setup passwordPSWAll
    10.Network stack enable/disableNBAAll
    11.USB stack enable/disableUSSAll
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot bring up time measurementCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z790/hardware-matrix/index.html b/variants/msi_z790/hardware-matrix/index.html new file mode 100644 index 00000000000..f300827c36f --- /dev/null +++ b/variants/msi_z790/hardware-matrix/index.html @@ -0,0 +1,5948 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configuration used for validation of the +coreboot port on the MSI PRO Z790-P workstation. For additional information, +please check the FAQ section.

    +

    MSI PRO Z790-P, SN: 601-7E06-030B2210001398

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core i5-13600K 3.5 GHz
    CPU coolerNoctua NH-U12S CPU Cooler
    RAMSlot 1: Kingston KF556C40BB-8
    Slot 1: Kingston KF556C40BB-8
    Slot 1: Kingston KF556C40BB-8
    Slot 1: Kingston KF556C40BB-8
    Flash memoryMacronix MX25U25635F
    SSDIntel 670p 512 GB M26472-201 NVME
    USB pendrives1. Adata C008 USB 2.0 16 GB
    2. Kingston DataTraveler USB 3.2 16 GB
    SD cardsSanDisk Ultra microSD HC I 16 GB
    Attached devices1. Logitech, Inc. Keyboard K120
    2. Dell Mouse MS116p
    3. 1-port USB Type-C
    NetworkLocal network wired connection
    Power SupplySeaSonic FOCUS Plus Platinum
    Power ControlSonoff S20 EU type E
    Remote Testing EnvironmentRTE v1.1.0
    KVMPiKVM based on Raspberry Pi 4
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/msi_z790/test-matrix/index.html b/variants/msi_z790/test-matrix/index.html new file mode 100644 index 00000000000..f2586204950 --- /dev/null +++ b/variants/msi_z790/test-matrix/index.html @@ -0,0 +1,6131 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Note, that the below-described test scope is used during Dasharo +Certification Procedure for MSI PRO Z790-P platform.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.UEFI ShellUSHAll
    4.Display ports and LCD supportDSPDSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003
    5.USB HID and MSC SupportUSBAll
    6.SMBIOSDMIDMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001, DMI008.001
    7.Custom boot logoCLGAll
    8.M.2 WiFi/BluetoothWLEAll
    9.Audio subsystemAUDAUD001.001, AUD001.002, AUD004.001, AUD004.002 AUD005.001, AUD005.002 AUD006.001, AUD006.002
    10.NVMe supportNVMAll
    11.Network bootPXEWithout PXE007.001
    12.Debian Stable and Ubuntu LTS supportLBTLBT003.001, LBT003.002, LBT004.001, LBT004.002
    13.Windows bootingWBTAll
    14.SD card supportSDCAll
    15.Custom Boot KeysCBKAll
    16.Dasharo Tools SuiteDTSDTS001.001, DTS002.001, DTS003.001, DTS004.001, DTS005.001, DTS006.001
    17.CPU statusCPUAll
    18.Platform suspend and resumeSUSPWithout SUSP004.001
    19.Super I/O initialization - QubesOSPPSAll
    20.Device power control operationsDPCAll
    21.Display resolution - QubesOSDSRAll
    22.SATA hot-plug detectionSHTAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001 and TPM002.001
    2.Verified Boot supportVBOWithout VBO006.001, VBO007.001
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOAll
    5.ME disable/neuter supportMNEAll
    6.BIOS lock supportBLSAll
    7.SMM BIOS write protectionSMMAll
    8.Early boot DMA protectionEDPAll
    9.UEFI Setup passwordPSWAll
    10.Network stack enable/disableNBAAll
    11.USB stack enable/disableUSSAll
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot bring up time measurementCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_ns5x_adl/hardware-matrix/index.html b/variants/novacustom_ns5x_adl/hardware-matrix/index.html new file mode 100644 index 00000000000..2c70a90428e --- /dev/null +++ b/variants/novacustom_ns5x_adl/hardware-matrix/index.html @@ -0,0 +1,6148 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configurations used for validation of the +coreboot port on the NovaCustom NS5x/7x laptops.

    +

    Ports specification

    +

    Right side view

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Description
    1.Speaker
    2.2-In-1 Audio Jack (Headphone / Microphone)
    3.MicroSD Card Reader
    4.USB 2.0 Port
    5.LED Indicator
    6.Power Button
    7.RJ-45 LAN Jack
    8.Security Lock Slot
    +

    Left side view

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Description
    1.DC-In Jack
    2.HDMI-Out Port
    3.USB 3.2 Gen 2 Type-A Port
    4.USB 3.2 Gen 2 Type-C Port
    5.Thunderbolt 4 Port with Power Delivery (DC-IN)
    6.Speaker
    +

    The graphics used are from pages 17-18 of the +official service manual +for the NS51/70 platforms.

    +

    NS5xPU

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i5-1240P
    Internal Cooling
    RAMSlot 1: KVR32S22S8/8
    Slot 2: KVR32S22S8/8
    SSDSamsung SSD 990 PRO 1 TB
    Flash memoryGigaDevice 25B1256EYIG 32 MB
    USB pendrivesSanDisk Ultra USB 3.0 32 GB
    USB KeyboardLogitech, Inc. Keyboard K120
    Wireless cardIntel Wi-Fi 6 AX201
    DisplayDisplay 1: HDMI 1920x1080p
    NetworkLocal network wired connection
    Internal devices1. 1920x1080 14 inch screen
    2. Internal keyboard with LED backlight
    3. Touchpad
    4. Camera
    5. Audio subsystem
    Attached devicesThunderbolt 4 Port: Wavlink 100W PD Pro docking station
    USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable
    Power SupplyChicony 19V, 4.74A, 90 W
    +

    NS7xPU

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i7-1260P
    Internal Cooling
    RAMSlot 1: KVR32S22S8/8
    Slot 2: KVR32S22S8/8
    SSDSamsung SSD 980 PRO 250 GB
    Flash memoryGigaDevice 25B1256EYIG 32 MB
    USB pendrivesSanDisk Ultra USB 3.0 32 GB
    USB KeyboardLogitech, Inc. Keyboard K120
    Wireless cardIntel Wi-Fi 6 AX201
    DisplayDisplay 1: HDMI 1920x1080p
    NetworkLocal network wired connection
    Internal devices1. 1920x1080 14 inch screen
    2. Internal keyboard with LED backlight
    3. Touchpad
    4. Camera
    5. Audio subsystem
    Attached devicesThunderbolt 4 Port: Wavlink 100W PD Pro docking station
    USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable
    Power SupplyChicony 19V, 4.74A, 90 W
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_ns5x_adl/post_install/index.html b/variants/novacustom_ns5x_adl/post_install/index.html new file mode 100644 index 00000000000..228be24e722 --- /dev/null +++ b/variants/novacustom_ns5x_adl/post_install/index.html @@ -0,0 +1,5963 @@ + + + + + + + + + + + + + + + + + + Post-installation setup - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Post-installation setup

    +

    This document contains extra steps to perform after installing Dasharo in order +to enable full functionality.

    +

    Touchpad hotkey enablement (Linux)

    +

    The touchpad hotkey needs extra setup to function correctly under Linux. To +enable the touchpad hotkey to work under Linux, follow the steps below:

    +
      +
    1. +

      Create a file /etc/udev/hwdb.d/60-keyboard.hwdb with the following contents:

      +
      evdev:atkbd:dmi:bvn*:bvr*:svnNotebook:pnNS5x_NS7xPU:*
      +        KEYBOARD_KEY_f7=191
      +        KEYBOARD_KEY_f8=191
      +
      +
    2. +
    3. +

      Execute the following commands:

      +
      sudo systemd-hwdb update
      +sudo udevadm trigger
      +
      +
    4. +
    +

    After executing these steps, it should be possible to enable and disable the +touchpad using the touchpad hotkey (Fn+F1) on the keyboard when using GNOME.

    +

    Touchpad multi-touch support (NS7x / 17-inch model, Linux)

    +

    On NS7x an additional fix is necessary to enable multi-touch on Linux. Create +a file /etc/modprobe.d/blacklist-psmouse.conf with the following contents:

    +
    blacklist psmouse
    +
    +

    and then run the following commands:

    +
    sudo depmod -a
    +sudo update-initramfs -u
    +
    +

    Now reboot your computer to apply the changes.

    +

    Installing updates and drivers (Windows 11)

    +

    Several features on Windows 11 (i. e. suspending the device) may not work or +work unexpectedly without installing all of the updates and drivers.

    +

    To install all of them, log into system, connect the device to the mains +and Internet, then follow the steps below:

    +
      +
    1. Press the Windows button on the keypad.
    2. +
    3. Type Windows Update Settings in the search and press Enter.
    4. +
    5. Select the Check for updates bar to start installing available updates and + drivers. During this process previously selected bar might be changed to + Restart now or Retry, so click them if something hasn't been installed + yet, something has gone wrong or restart is just required. The entire + process may take up to 30 minutes.
    6. +
    7. Select the Advanced options option in the Windows Update Settings window.
    8. +
    9. Locate the Optional updates option and click on it.
    10. +
    11. Select all displayed updates and drivers.
    12. +
    13. Select the Download & Install bar to start installing additional updates + and drivers. During this process previously selected bar might be changed + to Restart now or Retry, so click them if something hasn't been + installed yet, something has gone wrong or restart is just required. + The entire process may take up to 30 minutes.
    14. +
    15. Repeat all steps until all updates have been installed.
    16. +
    +

    Suspend fix for SATA disks (Windows and Linux)

    +

    Only affects laptops with M.2 SATA disks experiencing sleep issues (the power +LED not blinking while the laptop is suspended).

    +

    Windows and certain Linux distros such as Ubuntu do not enable the necessary +power saving tweaks to enable sleep mode while a SATA disk is installed. To +apply the fix, run the following scripts

    +

    Windows

    +
      +
    • Download the script: link
    • +
    • Double click on the script to install the tweak
    • +
    +

    Linux

    +
      +
    • Download the script: link
    • +
    • +

      Execute as root:

      +
      chmod +x install_dipm_service.sh
      +sudo ./install_dipm_service.sh
      +
      +
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_ns5x_adl/releases/index.html b/variants/novacustom_ns5x_adl/releases/index.html new file mode 100644 index 00000000000..f85857a5734 --- /dev/null +++ b/variants/novacustom_ns5x_adl/releases/index.html @@ -0,0 +1,5972 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    NovaCustom NS5x/NS7x ADL (12th Gen) Dasharo Release Notes

    +

    Following Release Notes describe status of open-source firmware development for +NovaCustom NS5x/NS7x ADL (12th Gen)

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    Subscribe to NovaCustom NS5x/NS7x ADL (12th Gen) Dasharo Release Newsletter

    +

    v1.6.0 - 2023-04-07

    +

    Test results for this release can be found +here.

    +

    Added

    + +

    Changed

    + +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    novacustom_ns5x_adl_ec_v1.6.0.rom +sha256 +sha256.sig

    +

    novacustom_ns5x_adl_v1.6.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.5.0 - Non-public engineering release

    +

    v1.4.0 - 2022-11-06

    +

    Test results for this release can be found +here.

    +

    Added

    + +

    Known issues

    + +

    Binaries

    +

    novacustom_ns5x_adl_ec_v1.4.0.rom +sha256 +sha256.sig

    +

    novacustom_ns5x_adl_v1.4.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_ns5x_adl/test-matrix/index.html b/variants/novacustom_ns5x_adl/test-matrix/index.html new file mode 100644 index 00000000000..2d44c4d3f97 --- /dev/null +++ b/variants/novacustom_ns5x_adl/test-matrix/index.html @@ -0,0 +1,6220 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests to which the DUT is +subjected before the release of the new binary.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.Display ports and LCD supportDSPDSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002
    4.Embedded Controller and Super I/O initializationECRWithout ECR010.001, ECR010.002, ECR25.001, ECR26.001, ECR27.001, ECR28.001
    5.NVMe supportNVMAll
    6.Custom logoCLGAll
    7.Custom boot keysCBKAll
    8.USB HID and MSC SupportUSBAll
    9.Debian Stable and Ubuntu LTS supportLBTLBT004.001, LBT004.002
    10.UEFI ShellUSHAll
    11.Windows bootingWBTWBT001.001
    12.Audio subsystemAUDAll
    13.USB-C supportUTCAll
    14.Network bootPXEWithout PXE007.001
    15.M.2 WiFi/BluetoothWLEAll
    16.SD card supportSDCAll
    17.USB Camera verificationCAMAll
    18.Fan speed measureFANFAN001.001
    19.SMBIOSDMIWithout DMI001.001
    20.Firmware update using fwupdFFWAll
    21.Dasharo Tools SuiteDTSDTS006.001, DTS007.001
    22.CPU statusCPUAll
    23.Embedded controller flashingECFAll
    24.Logo customization functionalityLCMLCM001.001
    25.Firmware locally building and flashingFLBAll
    26.Custom Boot OrderCBOCBO001.002
    27.QubesOS supportQBSAll
    28.Fedora supportFEDAll
    29.Platform suspend and resumeSUSPWithout SUSP004.001 and SUSP006.001
    30.BIOS menu function keysBMFAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001 and TPM002.001
    2.Verified Boot supportVBOWithout VBO006.001 and VBO007.001
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOWithout SBO006.001, SBO007.001 and SBO008.001
    5.ME disable/neuter supportMNEWithout MNE006.001
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot boot measureCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFAll
    4.Custom fan curveCFCAll
    5.Platform stabilitySTBAll
    +

    Module: Dasharo stability

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.USB Type-A devices detectionSUDAll
    2.M.2 Wi-fiSMWAll
    3.NVMe detectionSNVAll
    4.NET interface after coldboot/warmboot/reboot/suspendNETAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_ns5x_tgl/hardware-matrix/index.html b/variants/novacustom_ns5x_tgl/hardware-matrix/index.html new file mode 100644 index 00000000000..ec57ccc30dd --- /dev/null +++ b/variants/novacustom_ns5x_tgl/hardware-matrix/index.html @@ -0,0 +1,6152 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configurations used for validation of the +coreboot port on the NovaCustom NS51/NS70 laptops.

    +

    Ports specification

    +

    Right side view

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Description
    1.Speaker
    2.2-In-1 Audio Jack (Headphone / Microphone)
    3.MicroSD Card Reader
    4.USB 2.0 Port
    5.LED Indicator
    6.Power Button
    7.RJ-45 LAN Jack
    8.Security Lock Slot
    +

    Left side view

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Description
    1.DC-In Jack
    2.HDMI-Out Port
    3.USB 3.2 Gen 2 Type-A Port
    4.USB 3.2 Gen 2 Type-C Port
    5.Thunderbolt 4 Port with Power Delivery (DC-IN)
    6.Speaker
    +

    The graphics used are from pages 17-18 of the +official service manual +for the NS51/70 platforms.

    +

    NS51

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i5-1135G7
    Internal Cooling
    RAMSlot 1: KVR32S22D8/16
    Slot 2: KVR32S22D8/16
    SSD1. Samsung SSD 980 PRO 250 GB
    2. Samsung SSD 980 PRO 500 GB
    Flash memoryWinbond 25Q128JVSQ 2118 16 MB
    USB pendrivesSanDisk Ultra USB 3.0 32 GB
    USB KeyboardLogitech, Inc. Keyboard K120
    Wireless cardIntel Wi-Fi 6 AX201
    DisplayDisplay 1: HDMI 1920x1080p
    NetworkLocal network wired connection
    Internal devices1. 1920x1080 14 inch screen
    2. Internal keyboard with LED backlight
    3. Touchpad
    4. Camera
    5. Audio subsystem
    Attached devicesThunderbolt 4 Port: Wavlink 100W PD Pro docking station
    USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable
    Power SupplyChicony 19V, 3.42A, 65 W
    +

    NS70

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i5-1135G7
    Internal Cooling
    RAMSlot 1: KVR32S22S8/8
    Slot 2: KVR32S22S8/8
    SSDSamsung SSD 980 1 TB
    Flash memoryGigaDevice 25B127DSIG 16 MB
    USB pendrivesSanDisk Ultra USB 3.0 32 GB
    USB KeyboardLogitech, Inc. Keyboard K120
    Wireless cardIntel Wi-Fi 6 AX201
    DisplayDisplay 1: HDMI 1920x1080p
    NetworkLocal network wired connection
    Internal devices1. 1920x1080 14 inch screen
    2. Internal keyboard with LED backlight
    3. Touchpad
    4. Camera
    5. Audio subsystem
    Attached devicesThunderbolt 4 Port: Wavlink 100W PD Pro docking station
    USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable
    Power SupplyChicony 19V, 3.42A, 65 W
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_ns5x_tgl/releases/index.html b/variants/novacustom_ns5x_tgl/releases/index.html new file mode 100644 index 00000000000..1549b2144a6 --- /dev/null +++ b/variants/novacustom_ns5x_tgl/releases/index.html @@ -0,0 +1,6074 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    NovaCustom NS5x/NS7x TGL (11th Gen) Dasharo Release Notes

    +

    Following Release Notes describe the status of Open Source Firmware development +for NovaCustom NS5x/7x.

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    Subscribe to NovaCustom NS5x/7x Dasharo Release Newsletter

    +

    Test results for this platform can be found +here.

    +

    v1.4.0 - 2023-03-02

    +

    Added

    + +

    Changed

    + +

    Known issues

    + +

    Binaries

    +

    novacustom_ns5x_tgl_ec_v1.4.0.rom +sha256 +sha256.sig

    +

    novacustom_ns5x_tgl_v1.4.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.3.0 - 2022-09-01

    +

    EC firmware transition

    +

    Please note, that version 1.3.0 of Dasharo BIOS firmware works correctly +only with the Dasharo EC firmware. This is the first release when this +open-source EC firmware is used, so additional steps need to be taken when +upgrading.

    +

    Please refer to the Firmware update +section for more details on upgrading your firmware.

    +

    Added

    + +

    Changed

    + +

    Fixed

    + +

    Binaries

    +

    novacustom_ns5x_v1.3.0.rom +sha256 +sha256.sig +novacustom_ns5x_v1.3.0_ec.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.2.0 - 2022-05-26

    +

    Added

    +
      +
    • Persistent RGB keyboard settings
    • +
    • Increased power limits to CPU defaults (28W PL1 / 35W PL2)
    • +
    +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    novacustom_ns5x_v1.2.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.1.0 - 2022-04-22

    +

    Added

    + +

    Changed

    + +

    Known issues

    + +

    Binaries

    +

    novacustom_ns5x_v1.1.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.0 - 2022-03-23

    +

    Added

    +
      +
    • Support for NovaCustom NS5x
    • +
    • Support for EC firmware 1.07.07
    • +
    • UEFI Boot Support
    • +
    • Configurable boot order
    • +
    • Configurable boot options
    • +
    • UEFI Secure Boot support
    • +
    • NovaCustom boot logo
    • +
    +

    Known issues

    + +

    Binaries

    +

    novacustom_ns5x_v1.0.0.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_ns5x_tgl/test-matrix/index.html b/variants/novacustom_ns5x_tgl/test-matrix/index.html new file mode 100644 index 00000000000..55dda874cff --- /dev/null +++ b/variants/novacustom_ns5x_tgl/test-matrix/index.html @@ -0,0 +1,6226 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests to which the DUT is +subjected before the release of the new binary.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.Display ports and LCD supportDSPDSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002
    4.Embedded Controller and Super I/O initializationECRWithout ECR010.001, ECR010.002, ECR25.001, ECR26.001, ECR27.001, ECR28.001
    5.NVMe supportNVMAll
    6.Custom logoCLGAll
    7.Custom boot menu keyCBKAll
    8.USB HID and MSC SupportUSBAll
    9.Debian Stable and Ubuntu LTS supportLBTLBT004.001, LBT004.002
    10.UEFI ShellUSHAll
    11.Windows bootingWBTWBT001.001
    12.Audio subsystemAUDAll
    13.USB-C supportUTCAll
    14.Network bootPXEWithout PXE007.001
    15.M.2 WiFi/BluetoothWLEAll
    16.SD card supportSDCAll
    17.USB Camera verificationCAMAll
    18.Fan speed measureFANFAN001.001
    19.SMBIOSDMIWithout DMI001.001
    20.Firmware update using fwupdFFWAll
    21.Dasharo Tools SuiteDTSDTS006.001, DTS007.001
    22.CPU statusCPUAll
    23.Embedded controller flashingECFAll
    24.Logo customization functionalityLCMLCM001.001
    25.Firmware locally building and flashingFLBAll
    26.Custom Boot OrderCBOCBO001.002
    27.QubesOS supportQBSAll
    28.Fedora supportFEDAll
    29.Platform suspend and resumeSUSPSUSP001.001, SUSP002.001, SUSP003.001
    30.Sign of lifeSOLAll
    31.BIOS menu function keysBMFAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001 and TPM002.001
    2.Verified Boot supportVBOWithout VBO006.001 and VBO007.001
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOWithout SBO006.001, SBO007.001 and SBO008.001
    5.ME disable/neuter supportMNEWithout MNE006.001
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot boot measureCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFAll
    4.Custom fan curveCFCAll
    5.Platform stabilitySTBAll
    +

    Module: Dasharo stability

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.USB Type-A devices detectionSUDAll
    2.M.2 Wi-fiSMWAll
    3.NVMe detectionSNVAll
    4.NET interface after coldboot/warmboot/reboot/suspendNETAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_nv4x_adl/hardware-matrix/index.html b/variants/novacustom_nv4x_adl/hardware-matrix/index.html new file mode 100644 index 00000000000..ad5b7df4913 --- /dev/null +++ b/variants/novacustom_nv4x_adl/hardware-matrix/index.html @@ -0,0 +1,6047 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configurations used for validation of the +coreboot port on the NovaCustom NV4X laptop.

    +

    Ports specification

    +

    Right side view

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Description
    1.Speaker
    2.2-In-1 Audio Jack (Headphone / Microphone)
    3.USB 3.2 Gen 2 Type-C Port
    4.USB 3.2 Gen 2 Type-A Port
    5.HDMI-Out Port
    6.Power Button
    7.DC-In Jack
    8.Led Indicator
    +

    Left side view

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Description
    1.Security Lock Slot
    2.RJ-45 LAN Jack
    3.USB 3.2 Gen 2 Type-A Port
    4.SD Card Reader
    5.Thunderbolt 4 Port with Power Delivery (DC-IN)
    6.Speaker
    +

    The graphics used are from pages 17-18 of the +official service manual +for the NV41 platforms.

    +

    NV41PZ

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i5-1240P
    Internal Cooling
    RAMSlot 1: KVR32S22S8/8
    Slot 2: KVR32S22S8/8
    SSDSamsung SSD 980 PRO 250 GB
    Flash memoryMacronix MX25L25673GZ4I-08G
    USB pendrivesSanDisk Ultra USB 3.0 32 GB
    USB KeyboardLogitech, Inc. Keyboard K120
    Wireless cardIntel Wi-Fi 6 AX201
    DisplayDisplay 1: HDMI 1920x1080p
    NetworkLocal network wired connection
    Internal devices1. 1920x1080 14 inch screen
    2. Internal keyboard with LED backlight
    3. Touchpad
    4. Camera
    5. Audio subsystem
    Attached devicesThunderbolt 4 Port: Wavlink 100W PD Pro docking station
    USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable
    Power SupplyChicony 19V, 4.74A, 90 W
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_nv4x_adl/releases/index.html b/variants/novacustom_nv4x_adl/releases/index.html new file mode 100644 index 00000000000..248d6a45f7a --- /dev/null +++ b/variants/novacustom_nv4x_adl/releases/index.html @@ -0,0 +1,5978 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    NovaCustom NV4x ADL (12th Gen) Dasharo Release Notes

    +

    Following Release Notes describe status of open-source firmware development for +NovaCustom NV4x ADL (12th Gen)

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    +

    Subscribe to NovaCustom NV4x ADL (12th Gen) Dasharo Release Newsletter

    +

    +

    Test results for this platform can be found +here.

    +

    v1.6.0 - 2023-04-19

    +

    Added

    + +

    Changed

    + +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    novacustom_nv4x_adl_ec_v1.6.0.rom +sha256 +sha256.sig

    +

    novacustom_nv4x_adl_v1.6.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.5.0 - Non-public engineering release

    +

    v1.4.0 - 2022-12-13

    +

    Added

    + +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    novacustom_nv4x_adl_ec_v1.4.0.rom +sha256 +sha256.sig

    +

    novacustom_nv4x_adl_v1.4.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_nv4x_adl/test-matrix/index.html b/variants/novacustom_nv4x_adl/test-matrix/index.html new file mode 100644 index 00000000000..cec1aec346b --- /dev/null +++ b/variants/novacustom_nv4x_adl/test-matrix/index.html @@ -0,0 +1,6220 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.Display ports and LCD supportDSPDSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002
    4.Embedded Controller and Super I/O initializationECRWithout ECR021.xxx - ECR024.xxx, ECR25.001, ECR26.001, ECR27.001, ECR28.001
    5.NVMe supportNVMAll
    6.Custom logoCLGAll
    7.Custom boot keysCBKAll
    8.USB HID and MSC SupportUSBAll
    9.Debian Stable and Ubuntu LTS supportLBTLBT004.001, LBT004.002
    10.UEFI ShellUSHAll
    11.Windows bootingWBTWBT001.001
    12.Audio subsystemAUDAll
    13.USB-C supportUTCAll
    14.Network bootPXEWithout PXE007.001
    15.M.2 WiFi/BluetoothWLEAll
    16.SD card supportSDCAll
    17.USB Camera verificationCAMAll
    18.Fan speed measureFANFAN001.001
    19.SMBIOSDMIWithout DMI001.001
    20.Firmware update using fwupdFFWAll
    21.Dasharo Tools SuiteDTSDTS006.001, DTS007.001
    22.CPU statusCPUAll
    23.Embedded controller flashingECFAll
    24.Logo customization functionalityLCMLCM001.001
    25.Firmware locally building and flashingFLBAll
    26.Custom Boot OrderCBOCBO001.002
    27.QubesOS supportQBSAll
    28.Fedora supportFEDAll
    29.Platform suspend and resumeSUSPWithout SUSP004.001
    30.BIOS menu function keysBMFAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001 and TPM002.001
    2.Verified Boot supportVBOWithout VBO006.001 and VBO007.001
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOWithout SBO006.001, SBO007.001 and SBO008.001
    5.ME disable/neuter supportMNEWithout MNE006.001
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot boot measureCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFAll
    4.Custom fan curveCFCAll
    5.Platform stabilitySTBAll
    +

    Module: Dasharo stability

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.USB Type-A devices detectionSUDAll
    2.M.2 Wi-fiSMWAll
    3.NVMe detectionSNVAll
    4.NET interface after coldboot/warmboot/reboot/suspendNETAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_nv4x_tgl/compatibility-check-results-ubuntu/index.html b/variants/novacustom_nv4x_tgl/compatibility-check-results-ubuntu/index.html new file mode 100644 index 00000000000..fb3ed9a4953 --- /dev/null +++ b/variants/novacustom_nv4x_tgl/compatibility-check-results-ubuntu/index.html @@ -0,0 +1,6406 @@ + + + + + + + + + + + + + + + + + + Checbox results - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Checkbox logs comparison

    +

    Introduction

    +

    Checkbox is a flexible test automation software. It’s the main tool used in +Ubuntu Certification program.

    +

    You can use this software without any modification to check if your system is +behaving correctly or you can develop your own set of tests to check your +needs.

    +

    Checkbox optionally generates test reports in different formats +(JSON, HTML, etc.) that can be used to easily share the results of +a test session.

    +

    Checkbox comparison - vendor firmware vs Dasharo

    +

    Testing assumptions

    +
      +
    1. Tests have been conducted on the same OS version (Ubuntu 22.04 LTS).
    2. +
    3. Tests have been conducted on the same device, firstly with vendor firmware +and secondly with Dasharo firmware (version 1.2.1).
    4. +
    +

    Test results

    +
      +
    1. Test results - vendor firmware:
        +
      • PASSED: 74,
      • +
      • FAILED: 80,
      • +
      • NOT SUPPORTED: 25.
      • +
      +
    2. +
    3. Test results - Dasharo firmware:
        +
      • PASSED: 74,
      • +
      • FAILED: 80,
      • +
      • NOT SUPPORTED: 25.
      • +
      +
    4. +
    +

    Fails comparison

    +

    The following table collects information about all errors detected by the +certification program. In the second column test case name is described and in +the third and fourth columns, the information about bug appearance on +vendor/Dasharo firmware is shown.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Test case nameDasharo firmwareVendor firmware
    1graphics/1_driver_version_TigerLake-LP_GT2__Iris_Xe_Graphics_YESYES
    2graphics/1_driver_version_TigerLake-LP_GT2__Iris_Xe_Graphics_YESYES
    3bluetooth4/beacon_eddystone_url_hci0YESYES
    4mediacard/storage-preinserted-disk/by-uuid/0868-01F6YESYES
    5mediacard/storage-preinserted-disk/by-uuid/2adea2a3-f163-4d14-b6f3-b8d628611e23YESYES
    6mediacard/storage-preinserted-disk/by-uuid/2d67f8a9-7f79-4419-b1d3-e096ca010512YESYES
    7mediacard/storage-preinserted-disk/by-uuid/3bb6b676-1c4d-4ffb-8ede-e68f513fcdf1YESYES
    8wireless/wireless_connection_open_ac_nm_wlp55s0YESYES
    9wireless/wireless_connection_open_ax_nm_wlp55s0YESYES
    10wireless/wireless_connection_open_bg_nm_wlp55s0YESYES
    11wireless/wireless_connection_open_n_nm_wlp55s0YESYES
    12wireless/wireless_connection_wpa_ac_nm_wlp55s0YESYES
    13wireless/wireless_connection_wpa_ax_nm_wlp55s0YESYES
    14wireless/wireless_connection_wpa_bg_nm_wlp55s0YESYES
    15wireless/wireless_connection_wpa_n_nm_wlp55s0YESYES
    16tpm2.0_4.1.1/tpm2_importYESYES
    17tpm2.0_4.1.1/tpm2_clockrateadjustYESYES
    18tpm2.0_4.1.1/tpm2_loadexternalYESYES
    19tpm2.0_4.1.1/tpm2_rsadecryptYESYES
    20tpm2.0_4.1.1/tpm2_activecredentialYESYES
    21tpm2.0_4.1.1/tpm2_attestationYESYES
    22tpm2.0_4.1.1/tpm2_certifyYESYES
    23tpm2.0_4.1.1/tpm2_certifycreationYESYES
    24tpm2.0_4.1.1/tpm2_changeauthYESYES
    25tpm2.0_4.1.1/tpm2_checkquoteYESYES
    26tpm2.0_4.1.1/tpm2_clearYESYES
    27tpm2.0_4.1.1/tpm2_createYESYES
    28tpm2.0_4.1.1/tpm2_createakYESYES
    29tpm2.0_4.1.1/tpm2_createekYESYES
    30tpm2.0_4.1.1/tpm2_createpolicyYESYES
    31tpm2.0_4.1.1/tpm2_createprimaryYESYES
    32tpm2.0_4.1.1/tpm2_dictionarylockoutYESYES
    33tpm2.0_4.1.1/tpm2_duplicateYESYES
    34tpm2.0_4.1.1/tpm2_evictcontrolYESYES
    35tpm2.0_4.1.1/tpm2_flushcontextYESYES
    36tpm2.0_4.1.1/tpm2_getcapYESYES
    37tpm2.0_4.1.1/tpm2_getekcertificateYESYES
    38tpm2.0_4.1.1/tpm2_getrandomYESYES
    39tpm2.0_4.1.1/tpm2_gettestresultYESYES
    40tpm2.0_4.1.1/tpm2_gettimeYESYES
    41tpm2.0_4.1.1/tpm2_hashYESYES
    42tpm2.0_4.1.1/tpm2_hmacYESYES
    43tpm2.0_4.1.1/tpm2_import_tpmYESYES
    44tpm2.0_4.1.1/tpm2_incrementalselftestYESYES
    45tpm2.0_4.1.1/tpm2_loadYESYES
    46tpm2.0_4.1.1/tpm2_makecredentialYESYES
    47tpm2.0_4.1.1/tpm2_nvYESYES
    48tpm2.0_4.1.1/tpm2_nvcertifyYESYES
    49tpm2.0_4.1.1/tpm2_nvincYESYES
    50tpm2.0_4.1.1/tpm2_output_formatsYESYES
    51tpm2.0_4.1.1/tpm2_pcreventYESYES
    52tpm2.0_4.1.1/tpm2_pcrextendYESYES
    53tpm2.0_4.1.1/tpm2_pcrlistYESYES
    54tpm2.0_4.1.1/tpm2_pcrresetYESYES
    55tpm2.0_4.1.1/tpm2_printYESYES
    56tpm2.0_4.1.1/tpm2_quoteYESYES
    57tpm2.0_4.1.1/tpm2_readclockYESYES
    58tpm2.0_4.1.1/tpm2_readpublicYESYES
    59tpm2.0_4.1.1/tpm2_rsaencryptYESYES
    60tpm2.0_4.1.1/tpm2_selftestYESYES
    61tpm2.0_4.1.1/tpm2_sendYESYES
    62tpm2.0_4.1.1/tpm2_setclockYESYES
    63tpm2.0_4.1.1/tpm2_setprimarypolicyYESYES
    64tpm2.0_4.1.1/tpm2_signYESYES
    65tpm2.0_4.1.1/tpm2_startupYESYES
    66tpm2.0_4.1.1/tpm2_stirrandomYESYES
    67tpm2.0_4.1.1/tpm2_testparmsYESYES
    68tpm2.0_4.1.1/tpm2_unsealYESYES
    69tpm2.0_4.1.1/tpm2_verifysignatureYESYES
    70audio/detect_sinks_sourcesYESYES
    71suspend/1_driver_version_after_suspend_TigerLake-LP_GT2__Iris_Xe_Graphics__autoYESYES
    72suspend/2_driver_version_after_suspend_TU117M_autoYESYES
    73suspend/audio_before_suspendYESYES
    74suspend/bluetooth_obex_send_after_suspend_autoYESYES
    75suspend/bluetooth_obex_send_before_suspendYESYES
    76usb/storage-preinserted-disk/by-uuid/0868-01F6YESYES
    77usb/storage-preinserted-disk/by-uuid/2adea2a3-f163-4d14-b6f3-b8d628611e23YESYES
    78usb/storage-preinserted-disk/by-uuid/2d67f8a9-7f79-4419-b1d3-e096ca010512YESYES
    79usb/storage-preinserted-disk/by-uuid/3bb6b676-1c4d-4ffb-8ede-e68f513fcdf1YESYES
    80usb/storage-preinserted-disk/by-uuid/452E-652FYESYES
    +

    Logs from tests

    +

    Logs are available under this +link.

    +

    Summary

    +

    Test results are the same for vendor and dasharo firmware, with no differences.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_nv4x_tgl/hardware-matrix/index.html b/variants/novacustom_nv4x_tgl/hardware-matrix/index.html new file mode 100644 index 00000000000..34a36a64b7b --- /dev/null +++ b/variants/novacustom_nv4x_tgl/hardware-matrix/index.html @@ -0,0 +1,6152 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configurations used for validation of the +coreboot port on the NovaCustom NV4X laptop.

    +

    Ports specification

    +

    Right side view

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Description
    1.Speaker
    2.2-In-1 Audio Jack (Headphone / Microphone)
    3.USB 3.2 Gen 2 Type-C Port
    4.USB 3.2 Gen 2 Type-A Port
    5.HDMI-Out Port
    6.Power Button
    7.DC-In Jack
    8.Led Indicator
    +

    Left side view

    +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Description
    1.Security Lock Slot
    2.RJ-45 LAN Jack
    3.USB 3.2 Gen 2 Type-A Port
    4.SD Card Reader
    5.Thunderbolt 4 Port with Power Delivery (DC-IN)
    6.Speaker
    +

    The graphics used are from pages 17-18 of the +official service manual +for the NV41 platforms.

    +

    NV41MZ

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i7-1165G7
    Internal Cooling
    RAMSlot 1: KVR29S21S6/8
    Slot 2: KVR29S21S6/8
    SSDSamsung 980 PRO NVMe 500 GB
    Flash memoryGigaDevice 25B127DSIG 16 MB
    USB pendrivesSanDisk Ultra USB 3.0 32 GB
    USB KeyboardLogitech, Inc. Keyboard K120
    Wireless cardIntel Wi-Fi 6 AX201
    DisplayDisplay 1: HDMI 1920x1080p
    NetworkLocal network wired connection
    Internal devices1. 1920x1080 14 inch screen
    2. Internal keyboard with LED backlight
    3. Touchpad
    4. Camera
    5. Audio subsystem
    Attached devicesThunderbolt 4 Port: Wavlink 100W PD Pro docking station
    USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable
    Power SupplyChicony 19V, 3.42A, 65 W
    +

    NV41MB

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i7-1165G7
    Internal Cooling
    GPUNVIDIA GeForce GTX1650 4 GB
    RAMSlot 1: KVR29S21D8/32
    Slot 2: KVR29S21D8/32
    SSDSamsung 980 PRO NVMe 250 GB
    Flash memoryGigaDevice 25B127DSIG 16 MB
    USB pendrivesSanDisk Ultra USB 3.0 32 GB
    USB KeyboardLogitech, Inc. Keyboard K120
    Wireless cardIntel Wi-Fi 6 AX201
    DisplayDisplay 1: HDMI 1920x1080p
    NetworkLocal network wired connection
    Internal devices1. 1920x1080 14 inch screen
    2. Internal keyboard with LED backlight
    3. Touchpad
    4. Camera
    5. Audio subsystem
    Attached devicesThunderbolt 4 Port: Wavlink 100W PD Pro docking station
    USB Type-C Port: Adapter USB-C-RJ45 with connected Ethernet cable
    Power SupplyChicony 19V, 4.74A, 90 W
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_nv4x_tgl/lvfs_report/index.html b/variants/novacustom_nv4x_tgl/lvfs_report/index.html new file mode 100644 index 00000000000..4e74f9e36cf --- /dev/null +++ b/variants/novacustom_nv4x_tgl/lvfs_report/index.html @@ -0,0 +1,5945 @@ + + + + + + + + + + + + + + + + + + LVFS report - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    NovaCustom fwupd/LVFS support service

    +

    Introduction

    +

    This document contains the report of the discovery of the most appropriate +fwupd/LVFS firmware update method, including potential risks and roadblocks.

    +

    Device specification

    +

    NovaCustom NV4x system firmware

    +
      +
    • Intel i7-1165G7 (Tiger Lake ULV platform)
    • +
    • Samsung 980PRO NVMe SSD
    • +
    • 2x SO-DIMM DDR4 system memory
    • +
    • Optional NVIDIA discrete graphics
    • +
    • Dasharo coreboot-based firmware
    • +
    • Firmware stored on a SPI flash chip, flashable internally via flashrom
    • +
    +

    Update protocol

    +
      +
    • The device is flashable internally via flashrom
    • +
    • No special unlocks necessary for flashing the required BIOS flash portions + (only requirement is that UEFI Secure Boot is disabled while updating)
    • +
    +

    Feasibility analysis

    +
      +
    • Tiger Lake-U is supported in flashrom
        +
      • Present since this commit, + not yet released to stable as of 14.01.2022
      • +
      +
    • +
    • flashrom is supported in fwupd
        +
      • flashrom plugin is enabled by default in many common desktop Linux + distributions, including Ubuntu (starting with 21.10) and Arch Linux
      • +
      • enabling a device in the flashrom plugin is a matter of adding + device-specific entries to the plugin quirk list
      • +
      +
    • +
    • Potential risk: vboot support in fwupd
        +
      • flashrom supports flashing vboot rw slots, which are coreboot images + located within the BIOS partition of the flash
      • +
      • however, fwupd only implements flashing the entire BIOS region of the SPI + flash, which includes other firmware components such as vboot keys, + vboot recovery partition and user settings
      • +
      • the device currently has vboot partially implemented - the BIOS flash + is not protected and the binaries are signed with (public) developer keys
      • +
      • this means we can currently update the BIOS using the traditional fwupd + update path
      • +
      • once we decide to change the vboot keys and lock down the rest of the, + flash, proper vboot support will need to be implemented in fwupd
      • +
      • until then, it will not be possible to enable vboot fully
      • +
      +
    • +
    +

    Further steps: Vboot support

    +
      +
    • In case full vboot support in fwupd is desired, the following are currently + missing and need to be implemented:
        +
      • Support reading and processing VBNV (Vboot non-volatile store) data in + fwupd:
          +
        • this store contains information about the current vboot state, + e.g. currently booted slot (A/B/Recovery), recovery reason, firmware + signature verification status. This information is stored in CMOS, but + the exact offset varies by device - so a method for determining the offset + is also required.
        • +
        • For Google Chromebooks, this offset is exposed in a Chromebook-specific + ACPI device which we cannot use in non-Chromebook device. An alternative + interface or possibly a quirk in fwupd's flashrom plugin will need to be + added (though this approach is not preferred by fwupd maintainers).
        • +
        +
      • +
      • Support for flashing fmap regions in fwupd's flashrom plugin:
          +
        • currently, + fwupd only attempts to read flash layout from the Intel Flash Descriptor + located in the flash. This only allows fwupd to flash the entire BIOS + region, while vboot requires only a portion of the BIOS partition to be + updated at a given time, with some of the BIOS partition being read-only. + This means that with vboot fully enabled, updating will fail by attempting + to write to a read-only portion of the flash.
        • +
        • Vboot partitions (slots) are a subset of the bios partition and are defined + in FMAP (flashmap). Support for it will need to be implemented in fwupd + (possible by utilizing libflashrom). + Additionally, some user settings like boot order and setup options are + stored in a separate FMAP region, so implementing FMAP support in fwupd + will allow us to preserve them across firmware updates.
        • +
        +
      • +
      • Vboot A/B slot support
          +
        • In Google Chromebooks, the firmware updater + only updates one slot at a time and if it succeeds (the device reboots + into it successfully and works stably), then it will also update the other + slot to the same (now confirmed good) firmware. fwupd does not currently + support anything like this, so support for it will also need to be + implemented.
        • +
        +
      • +
      • Prior work: +
      • +
      +
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_nv4x_tgl/openness_analysis/index.html b/variants/novacustom_nv4x_tgl/openness_analysis/index.html new file mode 100644 index 00000000000..b19ded8c926 --- /dev/null +++ b/variants/novacustom_nv4x_tgl/openness_analysis/index.html @@ -0,0 +1,6098 @@ + + + + + + + + + + + + + + + + + + Openness score - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Intro

    +

    This document aims to compare the openness of Dasharo Firmware and Insyde BIOS.

    +

    There is an +ongoing discussion +about the methodology of the openness metric.

    +

    BIOS versions used in the analysis

    + +

    Insyde BIOS

    +

    In the case of the Insyde bios, the entire image should be considered +proprietary. There are several parts of the image that have a well-known +structure or make use of a public standard. However, to decode these structures, +one needs to employ reverse-engineering tools and techniques to know what +structures are present.

    +

    Dasharo BIOS

    +

    CBFS

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    imagesize (bytes)Is it open-source?
    cbfs master header20hYes
    fallback/romstage14770hYes
    cpu_microcode_blob.bin31C00hNo
    intel_fit50hYes
    fallback/ramstage1E626hYes
    config579hYes
    revision351hYes
    build_info5DhYes
    fallback/dsdt.aml6233hYes
    vbt.bin51ChYes
    (empty)1E4hN/A
    fspm.bin9F000hNo
    cmos_layout.bin22ChYes
    (empty)D24hN/A
    fsps.bin43676hNo
    fallback/postcar8F24hYes
    fallback/payload1771C5hYes
    fallback/verstage12C80hYes
    (empty)10E5E4hN/A
    bootblock74C0hYes
    Summary3F7A33hIn 62.9%
    +

    Open and closed source images are in the table below.

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    typesummarised sizePercent
    open-source1D42D1h62.9%
    closed-source114276h37.1%
    empty (not included)10F4ECh
    +

    Whole flash image

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    regionsizeopen-source percent (bytes)
    descriptor1000h0%
    ME4FF000h0%
    BIOSB00000h62.9%
    Summary1000000h43.2%
    +

    Summary

    + + + + + + + + + + + + + + + + + +
    imageopen-source percent (bytes)
    Insyde0%
    Dasharo43.2%
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_nv4x_tgl/releases/index.html b/variants/novacustom_nv4x_tgl/releases/index.html new file mode 100644 index 00000000000..aff6b644c65 --- /dev/null +++ b/variants/novacustom_nv4x_tgl/releases/index.html @@ -0,0 +1,6434 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    NovaCustom NV4X Dasharo Release Notes

    +

    Following Release Notes describe status of Open Source Firmware development for +NovaCustom NV4X

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    Subscribe to NovaCustom NV4X Dasharo Release Newsletter

    +

    Test results for this platform can be found +here.

    +

    v1.4.0 - 2023-02-24

    +

    Test results for this release can be found +here.

    +

    Added

    + +

    Changed

    + +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    novacustom_nv4x_tgl_ec_v1.4.0.rom +sha256 +sha256.sig

    +

    novacustom_nv4x_tgl_v1.4.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.3.0 - 2022-10-18

    +

    Test results for this release can be found +here.

    +

    EC firmware transition

    +

    Please note, that version 1.3.0 of Dasharo BIOS firmware works correctly +only with the Dasharo EC firmware. This is the first release when this +open-source EC firmware is used, so additional steps need to be taken when +upgrading.

    +

    Please refer to the Firmware update +section for more details on upgrading your firmware.

    +

    Added

    + +

    Changed

    + +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    novacustom_nv4x_ec_v1.3.0.rom +sha256 +sha256.sig

    +

    novacustom_nv4x_v1.3.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.2.1 - 2022-06-23

    +

    Fixed

    +
      +
    • cbfstool logo replacement not working on NV4x v1.2.0
    • +
    +

    Known issues

    + +

    Binaries

    +

    novacustom_nv4x_v1.2.1.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.2.0 - 2022-06-10

    +

    Added

    +
      +
    • Renamed device to NovaCustom NV4x
    • +
    +

    Fixed

    +
      +
    • Wake from suspend doesn't work with certain SSDs
    • +
    • CVE-2022-29264 SMM loader vulnerability
    • +
    • Fix BIOS vendor name in SMBIOS
    • +
    +

    Known issues

    + +

    Binaries

    +

    novacustom_nv4x_v1.2.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.1.0 - 2022-03-23

    +

    Added

    +
      +
    • Add Dasharo Tools Suite network boot integration
    • +
    • Add a persistent bootlogo implementation
    • +
    +

    Known issues

    + +

    Binaries

    +

    clevo_nv41mz_v1.1.0.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.1 - 2022-03-01

    +

    Added

    +
      +
    • Change DMI fields to match previous Insyde firmware
    • +
    • Hide unknown ACPI devices
    • +
    • Set correct Realtek HD Audio subsystem ID
    • +
    • Set correct ACPI path for the TPM
    • +
    • Set TPM IRQ in a manner understood by Windows
    • +
    +

    Removed

    +
      +
    • Removed proprietary blobs from built coreboot images
    • +
    +

    Fixed

    +
      +
    • Updating firmware using fwupd
    • +
    • MIC-in phone jack not working
    • +
    • This PC can't run Windows 11 error while installing Windows 11 from a USB pen drive
    • +
    +

    Known issues

    + +

    Binaries

    +

    clevo_nv41mz_v1.0.1.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.0 - 2022-01-19

    +

    Added

    +
      +
    • Documentation for touchpad hotkey enablement on Linux
    • +
    +

    Removed

    +
      +
    • Removed proprietary blobs from built coreboot images
    • +
    +

    Fixed

    +
      +
    • The touchpad ON/OFF switch Fn key is not functional
    • +
    • Charging indicator displays wrong state if power adapter was unplugged while + in sleep mode
    • +
    • Bluetooth does not work under Windows
    • +
    +

    Known issues

    + +

    Binaries

    +

    clevo_nv41mz_v1.0.0.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v0.5.0 - 2021-11-19

    +

    Added

    +
      +
    • vboot Verified Boot
    • +
    • TPM Measured Boot
    • +
    • Custom fan curve
    • +
    • Microcode for Tiger Lake stepping 0x2
    • +
    • Documentation for EC firmware update
    • +
    +

    Changed

    +
      +
    • Disabled unused DPTF device
    • +
    +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    dasharo_clevo_nv41mz_v0.5.0.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v0.4.0 - 2021-10-26

    +

    Added

    +
      +
    • Added full support for sleep mode (s0ix / Modern Standby)
    • +
    • Added support for NV41MB model
    • +
    • Added support for nvidia discrete graphics (doesn't power off in Windows yet)
    • +
    +

    Changed

    +
      +
    • Fixed regression with non-funtional airplane mode hotkey on Windows
    • +
    • Disabled legacy 8254 timer for lower power draw
    • +
    +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    dasharo_clevo_nv41mz_v0.4.0.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v0.3.0 - 2021-10-11

    +

    Added

    +
      +
    • Support for discrete TPM
    • +
    • USB Type-C ACPI support (UCSI)
    • +
    • Improved runtime power management for SSD (reduces power usage while in sleep)
    • +
    • Added partial sleep support (system saves power, but fans still spin)
    • +
    +

    Changed

    +
      +
    • Rebased on coreboot revision ae9a8447
    • +
    +

    Known issues

    + +

    Binaries

    +

    dasharo_clevo_nv41mz_v0.3.0.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v0.2.1 - 2021-9-29

    +

    Added

    +
      +
    • Integrated graphics backlight configuration for Windows
    • +
    +

    Changed

    +
      +
    • Updated the Video Bios Table
    • +
    +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    dasharo_clevo_nv41mz_v0.2.1.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v0.2.0 - 2021-9-24

    +

    Added

    +
      +
    • UEFI Secure Boot support
    • +
    • UEFI Shell selectable in boot menu
    • +
    • iPXE selectable in boot menu
    • +
    • NovaCustom boot logo
    • +
    • Customized boot menu keys
    • +
    • Customized setup menu keys
    • +
    • Support for backlight hotkey in Windows
    • +
    • Preserve boot order settings after Dasharo update
    • +
    +

    Changed

    +
      +
    • Replaced CorebootPayloadPkg with Dasharo UEFIPayloadPkg
    • +
    • Changed the behavior of airplane mode to match stock firmware (now it can be + disabled in software)
    • +
    +

    Known issues

    + +

    Binaries

    +

    dasharo_clevo_nv41mz_v0.2.0.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v0.1.2 - 2021-08-31

    +

    Added

    +
      +
    • Clevo NV41MZ platform support
    • +
    • Clevo IT5570 EC support
    • +
    • UEFI boot support
    • +
    • configurable boot order
    • +
    • configurable boot options
    • +
    • Integrated graphics initialization for internal LCD (eDP) and external HDMI + port
    • +
    +

    Binaries

    +

    clevo_nv41mz_v0.1.2.rom +sha256 +sha256.sig

    +

    All in one zip

    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/novacustom_nv4x_tgl/test-matrix/index.html b/variants/novacustom_nv4x_tgl/test-matrix/index.html new file mode 100644 index 00000000000..3aa31f9cf06 --- /dev/null +++ b/variants/novacustom_nv4x_tgl/test-matrix/index.html @@ -0,0 +1,6622 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    NV41MB test matrix

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.Display ports and LCD supportDSPDSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002
    4.Embedded Controller and Super I/O initializationECRWithout ECR021.xxx - ECR024.xxx, ECR25.001, ECR26.001, ECR27.001, ECR28.001
    5.NVMe supportNVMAll
    6.Custom logoCLGAll
    7.Custom boot menu keyCBKAll
    8.USB HID and MSC SupportUSBAll
    9.Debian Stable and Ubuntu LTS supportLBTLBT004.001, LBT004.002
    10.UEFI ShellUSHAll
    11.Windows bootingWBTWBT001.001
    12.Audio subsystemAUDAll
    13.USB-C supportUTCAll
    14.Network bootPXEWithout PXE007.001
    15.M.2 WiFi/BluetoothWLEAll
    16.SD card supportSDCAll
    17.USB Camera verificationCAMAll
    18.Fan speed measureFANFAN001.001
    19.SMBIOSDMIWithout DMI001.001
    20.Firmware update using fwupdFFWAll
    21.Dasharo Tools SuiteDTSDTS006.001, DTS007.001
    22.CPU statusCPUAll
    23.Embedded controller flashingECFAll
    24.Logo customization functionalityLCMLCM001.001
    25.Firmware locally building and flashingFLBAll
    26.Custom Boot OrderCBOCBO001.002
    27.QubesOS supportQBSAll
    28.Fedora supportFEDAll
    29.Platform suspend and resumeSUSPSUSP001.001, SUSP002.001, SUSP003.001
    30.Sign of lifeSOLAll
    31.NVIDIA Graphics supportNVIAll
    32.BIOS menu function keysBMFAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001 and TPM002.001
    2.Verified Boot supportVBOWithout VBO006.001 and VBO007.001
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOWithout SBO006.001, SBO007.001 and SBO008.001
    5.ME disable/neuter supportMNEWithout MNE006.001
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot boot measureCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFAll
    4.Custom fan curveCFCAll
    5.Platform stabilitySTBAll
    +

    Module: Dasharo stability

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.USB Type-A devices detectionSUDAll
    2.M.2 Wi-fiSMWAll
    3.NVMe detectionSNVAll
    +

    NV41MZ test matrix

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.Display ports and LCD supportDSPDSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002
    4.Embedded Controller and Super I/O initializationECRWithout ECR021.xxx - ECR024.xxx, ECR25.001, ECR26.001, ECR27.001, ECR28.001
    5.NVMe supportNVMAll
    6.Custom logoCLGAll
    7.Custom boot menu keyCBKAll
    8.USB HID and MSC SupportUSBAll
    9.Debian Stable and Ubuntu LTS supportLBTLBT004.001, LBT004.002
    10.UEFI ShellUSHAll
    11.Windows bootingWBTWBT001.001
    12.Audio subsystemAUDAll
    13.USB-C supportUTCAll
    14.Network bootPXEWithout PXE007.001
    15.M.2 WiFi/BluetoothWLEAll
    16.SD card supportSDCAll
    17.USB Camera verificationCAMAll
    18.Fan speed measureFANFAN001.001
    19.SMBIOSDMIWithout DMI001.001
    20.[USB-C docking station detect][DUD]DUDAll
    21.[USB-C docking station USB devices][DUB]DUBAll
    22.[USB-C docking station Audio][DAU]DAUAll
    23.[USB-C docking station Display ports][DDP]DDPAll
    24.[USB-C docking station NET interface][DET]DETAll
    25.Firmware update using fwupdFFWAll
    26.Dasharo Tools SuiteDTSDTS006.001, DTS007.001
    27.CPU statusCPUAll
    28.Embedded controller flashingECFAll
    29.Logo customization functionalityLCMLCM001.001
    30.Firmware locally building and flashingFLBAll
    31.Custom Boot OrderCBOCBO001.002
    32.QubesOS supportQBSAll
    33.Fedora supportFEDAll
    34.Platform suspend and resumeSUSPSUSP001.001, SUSP002.001, SUSP003.001, SUSP005.001
    35.[Thunderbolt docking station detect][TDD]TDDAll
    36.[Thunderbolt docking station USB devices][TDU]TDUAll
    37.[Thunderbolt docking station Audio][TDA]TDAAll
    38.[Thunderbolt docking station][TDS]TDSAll
    39.[Thunderbolt docking station Display ports][TDP]TDPAll
    40.[Thunderbolt docking station NET interface][TDN]TDNAll
    41.Sign of lifeSOLAll
    42.[USB-C docking station SD card reader][DSD]DSDAll
    43.BIOS menu function keysBMFAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001 and TPM002.001
    2.Verified Boot supportVBOWithout VBO006.001 and VBO007.001
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOWithout SBO006.001, SBO007.001 and SBO008.001
    5.ME disable/neuter supportMNEWithout MNE006.001
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot boot measureCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFAll
    4.Custom fan curveCFCAll
    5.Platform stabilitySTBAll
    +

    Module: Dasharo stability

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.USB Type-A devices detectionSUDAll
    2.M.2 Wi-fiSMWAll
    3.NVMe detectionSNVAll
    4.NET interface after coldboot/warmboot/reboot/suspendNETAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/overview/index.html b/variants/overview/index.html new file mode 100644 index 00000000000..da99a57e21a --- /dev/null +++ b/variants/overview/index.html @@ -0,0 +1,5965 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Supported hardware

    +

    Following is up to date list of hardware platforms supported by Dasharo +open-source firmware distribution.

    +

    Network appliance

    + +

    Laptops

    + +

    Desktop

    + +

    Workstation

    + +

    Servers

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/pc_engines/overview/index.html b/variants/pc_engines/overview/index.html new file mode 100644 index 00000000000..46c5453173b --- /dev/null +++ b/variants/pc_engines/overview/index.html @@ -0,0 +1,5892 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    +

    + +

    +

    PC Engines is a Swiss-based company that +specializes in the design and manufacture of small form factor computer +hardware, including single-board computers (SBCs), network appliances, and +embedded systems. Their products are often used in networking, +telecommunications, security applications, in-home automation, and other +industrial applications.

    +

    PC Engines is particularly well-known for its low-power, high-performance SBCs, +including the APU (Accelerated Processing Unit) series, which feature AMD G-series +embedded processors, and the ALIX series, based on the AMD Geode processor. +These SBCs are commonly used as firewalls, routers, and other network +appliances.

    +

    PC Engines is a well-recognized brand in the open-source community mostly +because of full schematics availability (apu2d +example) and use of open-source +firmware. PC Engines products are top-rated +among pfSense and OPNsense users. What you can see based on the number of forum +topics regarding apu platforms.

    +

    Status

    +

    In 2016 PC Engines contracted 3mdeb to take over the maintenance of open-source +firmware for PC Engines products. Development happened in PC Engines Github +organization until September 2022, when PC +Engines decided to discontinue its sponsorship for open-source firmware. +Dasharo Team working on creating a sustainable path forward for PC Engines' +open-source firmware through a subscription and donation model. For more +details please check Post EOL firmware +announcement, contact us +directly or through community +chat.

    +

    References

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/pc_engines/post-eol-fw-announcement/index.html b/variants/pc_engines/post-eol-fw-announcement/index.html new file mode 100644 index 00000000000..91d4ce6ce65 --- /dev/null +++ b/variants/pc_engines/post-eol-fw-announcement/index.html @@ -0,0 +1,5846 @@ + + + + + + + + + + + + + + + + + + Announcement - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Post EOL firmware announcement

    +

    Dear valued PC Engines hardware owners,

    +

    We apologize for the delay in our announcement. We understand that many of you +have eagerly awaited the next PC Engines firmware release. Rest assured that +our commitment to supporting the PC Engines firmware remains strong, and we are +working hard to bring you new features through the upcoming Dasharo firmware +distribution. We appreciate your patience and continued support.

    +

    We regret to inform the community that v4.17.0.3 was the last version of +the firmware sponsored by PC Engines. However, 3mdeb has since released +v4.19.0.1, the final version delivered to the community using the existing +model.

    +

    As some may know, 3mdeb is a small open-source firmware consulting company +based in Poland. Our team consists of passionate engineers and developers from +open-source software, firmware, and hardware communities, frequent conference +speakers, and people who love to tinker with bits. Every day we develop +bleeding-edge low-level security solutions using top open-source frameworks. We +are committed to continuing support and PC Engines hardware in the open-source +firmware community but can't afford that on our dime.

    +

    Since February 2016, we have made 87 binary releases for all PC Engines +hardware platforms from apu1 through famous apu2 up to apu7. We published over +30k test results from our automated testing framework. Thanks to community +feedback, we created extensive documentation. Our firmware development +effort extended the lifetime value of PC Engines hardware. Most notable +examples were:

    +
      +
    • CPU Core Performance Boost feature enabling - blog
    • +
    • DRAM Error Correction Code enabling - blog
    • +
    • AMD Cryptographic Coprocessor enabling - issue tracker
    • +
    • and many small things like a watchdog or SPI flash lockdown.
    • +
    +

    According to PC Engines EOL statement apu2 / apu3 series availability will +be: "Based on an AMD embedded CPU, this platform should have good long term +availability. This CPU should be available until 2024 according to AMD."

    +

    We would like to continue support for PC Engines firmware through our Dasharo +open-source firmware distribution. Further releases could include regular +maintenance updates and new features such as UEFI compatibility, fwupd, +Verified Boot, UEFI Setup password, DMA protection, and more. For a complete +list of planned enhancements, please visit the dasharo-issues repository +on GitHub.

    +

    Your support will play a crucial role in determining the roadmap and the speed +of its implementation. We hope you will support our efforts to bring these new +features and improvements to the PC Engines firmware.

    +

    We are exploring the possibility of implementing a subscription model for +firmware updates. We would like to hear from you to ensure that the pricing +option is fair and reasonable for our community. We have created a survey to +gather your thoughts and preferences on pricing. Your feedback is important to +us and will help us make informed decisions about the future of our offerings. +Please take about two minutes to participate in the survey. Your input +will be greatly appreciated.

    +

    In case of any questions feel free to contact us.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_fw6/building-manual/index.html b/variants/protectli_fw6/building-manual/index.html new file mode 100644 index 00000000000..b7a4ff3f728 --- /dev/null +++ b/variants/protectli_fw6/building-manual/index.html @@ -0,0 +1,5891 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Building manual

    +

    Requirements

    + +

    Building

    +

    To build Dasharo firmware image, follow the steps below:

    +
      +
    1. +

      Clone the coreboot repository:

      +
      git clone https://github.com/Dasharo/coreboot.git -b protectli_vault_kbl/release
      +
      +
    2. +
    +

    To build a specific version replace protectli_vault_kbl/release to + protectli_vault_kbl_v1.0.x where x is the version number.

    +
      +
    1. +

      Start build process (note it requires certain blobs to proceed):

      +
      cd coreboot
      +git submodule update --init --checkout
      +# you will need to obtain the ZIP with blobs at this point
      +unzip protectli_blobs.zip -d 3rdparty/blobs/mainboard
      +./build.sh fw6
      +
      +
    2. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_fw6/hardware-matrix/index.html b/variants/protectli_fw6/hardware-matrix/index.html new file mode 100644 index 00000000000..f3a9a68396b --- /dev/null +++ b/variants/protectli_fw6/hardware-matrix/index.html @@ -0,0 +1,6271 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configuration used for validation of the +coreboot port on the Protectli FW6 firewall.

    +

    Protectli FW6E Dasharo

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIIntel(R) Celeron(TM) 3865U
    SSDM.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S
    external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB
    RAMCRUCIAL CT4G4SFS824A
    CRUCIAL CT4G4SFS824A
    Wireless cardQualcomm Atheros QCA9377
    LTE miniPCIe cardQuectel EC-20  
    DisplayHDMI 1920x1080p
    Ethernet6x Intel i211 (on-board)
    Attached devices1. SanDisk USB 3.2Gen1 16 GB
    2. SanDisk USB 3.2Gen1 16 GB
    3. SanDisk USB 3.2Gen1 16 GB
    4. USB Type-C Hub Pro UCN3286
    USB KeyboardDELL KB216
    Power supplyChannel Well Technology 12V, 7.5A 90W
    +

    Protectli FW6B Dasharo

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i3-7100U
    SSDM.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S
    external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB
    RAMCRUCIAL CT4G4SFS824A
    CRUCIAL CT4G4SFS824A
    Wireless cardQualcomm Atheros QCA9377
    LTE miniPCIe cardQuectel EC-20  
    DisplayHDMI 1920x1080p
    Ethernet6x Intel i211 (on-board)
    Attached devices1. SanDisk USB 3.2Gen1 16 GB
    2. SanDisk USB 3.2Gen1 16 GB
    3. SanDisk USB 3.2Gen1 16 GB
    4. USB Type-C Hub Pro UCN3286
    USB KeyboardDELL KB216
    Power supplyChannel Well Technology 12V, 7.5A 90W
    +

    Protectli FW6C Dasharo

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i5-7200U
    SSDM.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S
    external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB
    RAMCRUCIAL CT4G4SFS824A
    CRUCIAL CT4G4SFS824A
    Wireless cardQualcomm Atheros QCA9377
    LTE miniPCIe cardQuectel EC-20  
    DisplayHDMI 1920x1080p
    Ethernet6x Intel i210 (on-board)
    Attached devices1. SanDisk USB 3.2Gen1 16 GB
    2. SanDisk USB 3.2Gen1 16 GB
    3. SanDisk USB 3.2Gen1 16 GB
    4. USB Type-C Hub Pro UCN3286
    USB KeyboardDELL KB216
    Power supplyChannel Well Technology 12V, 7.5A 90W
    +

    Protectli FW6D Dasharo

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i5-8250U
    SSDM.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S
    external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB
    RAMCRUCIAL CT4G4SFS824A
    CRUCIAL CT4G4SFS824A
    Wireless cardQualcomm Atheros QCA9377
    LTE miniPCIe cardQuectel EC-20  
    DisplayHDMI 1920x1080p
    Ethernet6x Intel i210 (on-board)
    Attached devices1. SanDisk USB 3.2Gen1 16 GB
    2. SanDisk USB 3.2Gen1 16 GB
    3. SanDisk USB 3.2Gen1 16 GB
    4. USB Type-C Hub Pro UCN3286
    USB KeyboardDELL KB216
    Power supplyChannel Well Technology 12V, 7.5A 90W
    +

    Protectli FW6E Dasharo

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i5-8250U
    SSDM.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S
    external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB
    RAMCRUCIAL CT4G4SFS824A
    CRUCIAL CT4G4SFS824A
    Wireless cardQualcomm Atheros QCA9377
    LTE miniPCIe cardQuectel EC-20  
    DisplayHDMI 1920x1080p
    Ethernet6x Intel i210 (on-board)
    Attached devices1. SanDisk USB 3.2Gen1 16 GB
    2. SanDisk USB 3.2Gen1 16 GB
    3. SanDisk USB 3.2Gen1 16 GB
    4. USB Type-C Hub Pro UCN3286
    USB KeyboardDELL KB216
    Power supplyChannel Well Technology 12V, 7.5A 90W
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_fw6/installation-manual/index.html b/variants/protectli_fw6/installation-manual/index.html new file mode 100644 index 00000000000..4fbc22749d8 --- /dev/null +++ b/variants/protectli_fw6/installation-manual/index.html @@ -0,0 +1,5891 @@ + + + + + + + + + + + + + + + + + + Installation manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Installation manual

    +

    Flashing coreboot can be done from Linux using flashrom with the internal +programmer. This document describes the process of building, installing and +running flashrom on Ubuntu 22.04.

    +

    Installing flashrom

    +

    Your distribution will need at least flashrom v1.0.

    +
    sudo apt install flashrom
    +
    +

    Reading flash contents

    +

    Always prepare a backup of the current firmware image. To read from the flash +and save them to a file (dump.rom), execute the following command:

    +
    sudo flashrom -p internal -r dump.rom
    +
    +

    Flashing Dasharo

    +
    flashrom -p internal -w [path] --ifd -i bios
    +
    +

    To flash Dasharo on the platform, execute the following command - replace [path] +with the path to the Dasharo image you want to flash, e.g. protectli_fw6_DF_v1.0.14.rom.

    +
    sudo flashrom -p internal -w protectli_fw6_DF_v1.0.14.rom --ifd -i bios
    +
    +

    After successful operation reboot the platform.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_fw6/overview/index.html b/variants/protectli_fw6/overview/index.html new file mode 100644 index 00000000000..d3966cd67ee --- /dev/null +++ b/variants/protectli_fw6/overview/index.html @@ -0,0 +1,5806 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_fw6/releases/index.html b/variants/protectli_fw6/releases/index.html new file mode 100644 index 00000000000..2f5e9722029 --- /dev/null +++ b/variants/protectli_fw6/releases/index.html @@ -0,0 +1,5889 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Release Notes

    +

    Following Release Notes describe status of Open Source Firmware development for +Protectli FW6.

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    +Subscribe to Protectli FW6 Dasharo Release Newsletter +

    +

    Test results for this platform can be found +here.

    +

    v1.0.14 - 2022-05-13

    +

    Changed

    +
      +
    • Throttling temperature to 75 Celsius degrees
    • +
    +

    Known issues

    +
      +
    • Samsung memory modules do not work properly on older FW6A/B/C (SKU6LAV20)
    • +
    +

    Binaries

    +

    protectli_vault_kbl_v1.0.14.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_fw6/test-matrix/index.html b/variants/protectli_fw6/test-matrix/index.html new file mode 100644 index 00000000000..5231533ba15 --- /dev/null +++ b/variants/protectli_fw6/test-matrix/index.html @@ -0,0 +1,5978 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.Display ports and LCD supportDSPDSP002.001, DSP002.003
    3.USB HID and MSC SupportUSBUSB001.001, USB001.002, USB002.001, USB002.002
    4.SMBIOSDMIDMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001
    5.Custom boot logoCLGDMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001
    6.M.2 WiFi/BluetoothWLEWLE001.001, WLE002.001, WLE003.001
    7.Network bootPXEPXE007.001
    8.Debian Stable and Ubuntu LTS supportLBTLBT003.001, LBT003.002, LBT004.001, LBT004.002
    9.Custom boot menu keyCBKAll
    10.FreeBSD supportBSDAll
    11.miniPCIe LTE/WiFi/BluetoothMWLMWL004.001
    12.Custom network boot entriesCNBCNB001.002
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.CPU temperatureCPTAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_ptx01/hardware-matrix/index.html b/variants/protectli_ptx01/hardware-matrix/index.html new file mode 100644 index 00000000000..7b2c7687f51 --- /dev/null +++ b/variants/protectli_ptx01/hardware-matrix/index.html @@ -0,0 +1,5985 @@ + + + + + + + + + + + + + + + + + + Hardware configuration matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configuration used for validation of the +coreboot port on the Protectli PT201/PT401/PT601 firewall.

    +

    Protectli PT201

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Celeron(R) N5105 @ 2.00GHz
    RAMMicron MT53D512M64D4RQ-046
    Flash memoryWinbond 25Q16JVSSIQ
    USB KeyboardDELL KB216
    USB MouseDELL MS116p
    USB pendrives1. SanDisk Ultra Flair USB 3.0 16 GB
    DisplayHDMI 1920x1080p
    Ethernet controller2x intel i225/i226 (on-board)
    Internal devicesAudio subsystem
    4G ModemAMIT MDG200-0T001
    NetworkLocal network wired connection
    Remote Testing EnvironmentRTE v1.1.0
    Power ControlRTE v1.1.0
    Power supplyPower Adapter GA-0481204000V
    +

    Protectli PT401

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Celeron(R) N5105 @ 2.00GHz
    RAMMicron MT53D512M64D4RQ-046
    Flash memoryWinbond 25Q128JVSIQ
    USB KeyboardDELL KB216
    USB MouseDELL MS116p
    USB pendrives1. SanDisk Ultra Flair USB 3.0 16 GB
    DisplayHDMI 1920x1080p
    Ethernet controller4x intel i225/i226 (on-board)
    Internal devicesAudio subsystem
    4G ModemAMIT MDG200-0T001
    NetworkLocal network wired connection
    Remote Testing EnvironmentRTE v1.1.0
    Power ControlRTE v1.1.0
    Power supplyPower Adapter GA-0481204000V
    +

    Protectli PT601

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Pentium(R) Silver N6005 @ 2.00GHz
    RAMMicron MT53E512M32D4NQ-053
    Flash memoryWinbond 25Q128JVSIQ
    USB KeyboardDELL KB216
    USB MouseDELL MS116p
    USB pendrives1. SanDisk Ultra Flair USB 3.0 16 GB
    DisplayHDMI 1920x1080p
    Ethernet controller6x intel i225/i226 (on-board)
    Internal devicesAudio subsystem
    4G ModemAMIT MDG200-0T001
    NetworkLocal network wired connection
    Remote Testing EnvironmentRTE v1.1.0
    Power ControlRTE v1.1.0
    Power supplyPower Adapter GA-0481204000V
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_ptx01/test-matrix/index.html b/variants/protectli_ptx01/test-matrix/index.html new file mode 100644 index 00000000000..f5db355f824 --- /dev/null +++ b/variants/protectli_ptx01/test-matrix/index.html @@ -0,0 +1,5968 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary. The test scope is the same +for all platforms of the PT family.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.UEFI compatible interfaceEFIAll
    2.Display portsDSPDSP002.001, DSP002.002, DSP002.003
    3.Network boot utilitiesNBTAll
    4.NVMe supportNVMAll
    5.Custom logoCLGAll
    6.Custom Boot KeysCBKAll
    7.USB HID and MSC SupportUSBUSB001.xxx and USB002.xxx
    8.Debian Stable and Ubuntu LTS supportLBTLBT003.001, LBT003.002, LBT004.001, LBT004.002
    9.miniPCIe LTE/WiFi/BluetoothMWLMWL004.001
    10.M.2 WiFi/BluetoothWLEAll
    11.eMMC supportMMCAll
    12.SMBIOSDMIDMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001
    13.Custom network boot entriesCNBCNB001.002
    14.Audio subsystemAUDAUD007.xxx, AUD008.xxx
    15.UEFI ShellUSHAll
    16.USB detectionUDTAll
    17.USB bootingUBTAll
    18.Windows bootingWBTWBT001.001
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMTPM001.002, TPM001.003, TPM002.002, TPM002.003, TPM003.002, TPM003.003
    2.Secure Boot supportSBOAll
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot bring up time measurementCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFWithout CPU003.XXX and CPU005.XXX
    4.Platform stabilitySTBAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2410/building-manual/index.html b/variants/protectli_vp2410/building-manual/index.html new file mode 100644 index 00000000000..6ca10894d3c --- /dev/null +++ b/variants/protectli_vp2410/building-manual/index.html @@ -0,0 +1,5929 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Building manual

    +

    Intro

    +

    This document describes the procedure for compiling coreboot for Protectli +VP2410.

    +

    Requirements

    + +

    Build Dasharo BIOS firmware

    +
    +

    This build procedure produces full firmware binary including blobs such as +FSP, and ME. Currently, access to them is restricted to the OEM (Protectli) via +a private repository.

    +
    +
      +
    1. +

      Clone the coreboot repository:

      +
      git clone https://github.com/Dasharo/coreboot
      +
      +
    2. +
    3. +

      Checkout the desired version, e.g. v1.0.15:

      +
      cd coreboot
      +git checkout protectli_vault_glk_v1.0.15
      +
      +
    4. +
    5. +

      Checkout submodules:

      +
      git submodule update --init --checkout
      +
      +
    6. +
    7. +

      Obtain the Protectli blobs package:

      +
      +

      Replace <PROTECTLI_BLOBS_REPO> with a a proper path to the repository +in a form of: git@repo-path.git. You should checkout to the same tag as +in case aof the coreboot repository.

      +
      +
      cd 3rdparty/blobs/mainboard/
      +git init
      +git remote add origin <PROTECTLI_BLOBS_REPO>
      +git fetch origin && git checkout protectli_vault_glk_v1.0.15
      +cd -
      +ln -s ../blobs/mainboard/protectli/vault_glk/GeminilakeFspBinPkg/ 3rdparty/fsp/GeminilakeFspBinPkg
      +
      +
    8. +
    9. +

      Build the firmware v1.0.15 or newer:

      +
      ./build.sh vp2410
      +
      +
    10. +
    +

    The resulting coreboot image will be placed in the coreboot directory as +protectli_vp2410_<version>.rom.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2410/hardware-matrix/index.html b/variants/protectli_vp2410/hardware-matrix/index.html new file mode 100644 index 00000000000..72f91ce14f8 --- /dev/null +++ b/variants/protectli_vp2410/hardware-matrix/index.html @@ -0,0 +1,5967 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configuration used for validation of the +coreboot port on the Protectli VP2410 firewall.

    +

    Protectli VP2410

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Celeron J4125 @ 2.70GHz
    RAMCRUCIAL CT4G4SFS824A
    SAMSUNG M471A4G43MB1-CTD
    SAMSUNG M471A1K43CB1-CTD
    SAMSUNG M471A5244BB0-CRC
    KINGSTON KVR24S17S8/8
    KINGSTON KVR26S19S8/16
    Flash memoryMacronix MX25U6473F
    SSDM.2 SSD SATA: Hoodisk SSL032GTTC7-S9A-2S
    external SATA 2.5 inch: Goodram SSDPR-CL100-240-G2 240GB
    MMC driveSAMSUNG 8GTF4R (on-board)
    USB pendrives1. SanDisk USB 3.2Gen1 16 GB
    2. SanDisk USB 3.2Gen1 16 GB
    3. USB Type-C Hub Pro UCN3286
    Attached devices1. Logitech, Inc. Keyboard K120
    2. Dell Mouse MS116p
    3. USB Type-C Hub Pro UCN3286
    LTE miniPCIe cardQuectel EC-20
    Wireless cardIntel Wi-Fi 6 AX200
    DisplayHDMI 1920x1080p, DP 1920x1080p
    Ethernet4x intel i211 (on-board)
    TPMPC Engines TPM1A LPC TPM
    Power supplyChannel Well Technology 12V, 5.0A 60W
    +
    +

    Note, that in RAM section all used during verification procedure modules +have been listed. Device has only one RAM mounting slot.

    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2410/initial-deployment/index.html b/variants/protectli_vp2410/initial-deployment/index.html new file mode 100644 index 00000000000..73f35501f28 --- /dev/null +++ b/variants/protectli_vp2410/initial-deployment/index.html @@ -0,0 +1,5948 @@ + + + + + + + + + + + + + + + + + + Initial deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Initial deployment

    +

    Initial flashing of Dasharo firmware can be done from Linux using flashrom with +the internal programmer. This document describes the process of building, +installing and running flashrom on Ubuntu 22.04.

    +

    Deploy using Dasharo Tools Suite

    +

    For simplicity we recommend using +Dasharo Tools Suite to +omit all compilation steps and deploy the Dasharo firmware seamlessly. +Be sure to disable the BIOS lock in the AMI firmware setup utility:

    +
      +
    1. Go to Chipset tab
    2. +
    3. Enter PCH IO Configuration
    4. +
    5. Disable BIOS Lock.
    6. +
    7. Save changes and reset.
    8. +
    +

    Now you are ready to use Dasharo Tools Suite (DTS):

    +
      +
    1. Boot Dasharo Tools Suite.
    2. +
    3. Perform Dasharo installation.
    4. +
    +

    This will flash the full image, including the Intel ME. The operation requires +a hard reset of the platform. To perform a hard reset:

    +
      +
    1. Power off the platform. Note, it may not power off completely due to flashed + ME.
    2. +
    3. Disconnect power supply from the board when OS finishes all tasks after + power off (the screen goes dark or black).
    4. +
    5. Disconnect the RTC/CMOS battery OR clear the CMOS using the pin header + located near memory slots. Wait about 10 seconds and unshort the pins.
    6. +
    7. Connect the power supply back.
    8. +
    9. The platform should power on normally now. You can connect the battery back + if it was disconnected.
    10. +
    +

    This concludes Dasharo deployment process using DTS.

    +

    Build flashrom

    +

    Currently, the latest flashrom release lacks support for Comet Lake U internal +flashing. Because of this, we need to build flashrom from source.

    +

    Install build dependencies:

    +
    apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson
    +
    +

    Obtain source code:

    +
    git clone https://github.com/Dasharo/flashrom -b dasharo-release
    +cd flashrom
    +
    +

    Build flashrom:

    +
    sudo make install
    +
    +

    Reading flash contents

    +

    Always prepare a backup of the current firmware image. To read from the flash +and save them to a file (dump.rom), execute the following command:

    +
    flashrom -p internal -r dump.rom
    +
    +

    Keep the backup for later recovery if needed.

    +

    Flashing Dasharo

    +

    To flash Dasharo on the platform, execute the following command - replace [path] +with the path to the Dasharo image you want to flash, e.g. protectli_vault_glk_v1.0.15.rom.

    +

    If stock firmware is currently installed:

    +
    flashrom -p internal -w [path]
    +
    +

    If Dasharo is currently installed, only the COREBOOT and IFWI partitions of the +flash needs to be updated. Flash it using the following command:

    +
    flashrom -p internal -w protectli_vault_glk_v1.0.15.rom --fmap -i COREBOOT -i IFWI
    +
    +

    This command also preserves Dasharo UEFI settings and the boot order.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2410/overview/index.html b/variants/protectli_vp2410/overview/index.html new file mode 100644 index 00000000000..94c3f9f7b38 --- /dev/null +++ b/variants/protectli_vp2410/overview/index.html @@ -0,0 +1,5896 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    +

    The Vault Pro is a small form network appliance built for use as a firewall +/ router, virtualization platform, a daily-driven personal computer, +and more. The VP2410 is based on a 4 network port design that leverages +a low power, but versatile Intel Celeron J4125 CPU.

    +

    +

    The VP2410 can accommodate up to 16GB DDR4 RAM and 2TB m.2 SATA SSD +storage drive. The built-in 8GB eMMC module can be used for booting a +light-weight OS for example, or for use as optional storage.

    +

    VP2410 specification:

    +
      +
    • Intel Celeron® J4125 Quad Core at 2 GHz (Burst up to 2.7 GHz)
    • +
    • 4 Intel® Gigabit Ethernet NIC ports
    • +
    • 8GB eMMC module on board
    • +
    • Intel® AES-NI support
    • +
    • Fanless and Silent
    • +
    • Included 12v Power Supply, VESA mount kit, Serial Console Cable, +SATA data and power cables for internal SSD, Quick Start Guide
    • +
    +

    For more information please refer to the references below.

    +

    References

    + +

    Documentation sections

    +
      +
    • Releases - groups information about all releases.
    • +
    • Building manual - describes how to build Dasharo for + Protecli 2410.
    • +
    • Initial deployment - describes initial Dasharo + deployment methods (i. e. flashing new firmware) for Protectli VP2410.
    • +
    • Recovery - gathers information on how to recover the platform + from potential failure.
    • +
    • Hardware configuration matrix - describes the + platform's hardware configuration used during the Dasharo firmware + validation procedure.
    • +
    • Test matrix - describes validation scope used during + Dasharo firmware validation procedure.
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2410/recovery/index.html b/variants/protectli_vp2410/recovery/index.html new file mode 100644 index 00000000000..ffdcdd2a4c8 --- /dev/null +++ b/variants/protectli_vp2410/recovery/index.html @@ -0,0 +1,6011 @@ + + + + + + + + + + + + + + + + + + Recovery - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Recovery

    +

    Intro

    +

    The following documentation describes the process of recovering hardware from +the brick state with RTE and +Dasharo open-source firmware.

    +

    Prerequisites

    +
      +
    • Prepared RTE
    • +
    • SOIC-8 Pomona clip
    • +
    • 6x female-female wire cables
    • +
    +

    Connections

    +

    To prepare the stand for flashing follow the steps described below:

    +
      +
    1. +

      Connect the wire cables to the Pomona clip.

      +

      +

      +
    2. +
    3. +

      Connect the Pomona clip to the SPI header + on RTE.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SPI headerPomona clip
      Vccpin 5 (Vcc)
      GNDpin 4 (GND)
      CSpin 1 (CS)
      SCLKpin 7 (CLK)
      MISOpin 2 (MISO)
      MOSIpin 8 (MOSI)
      +

      +
    4. +
    5. +

      Completely remove the motherboard from the platform cover.

      +

      +

      +
      +

      If there is little thermal paste on the CPU, apply it before reassembling +the motherboard to the platform cover.

      +
      +
    6. +
    7. +

      Match pin 1(CS) on the Pomona clip with the first pin of the one of flash + chip, marked with a small dot engraved on the chip.

      +

      +

      +
    8. +
    +

    Firmware flashing

    +

    To flash firmware follow the steps described below:

    +
      +
    1. Login to RTE via ssh or minicom.
    2. +
    3. Turn on the platform by connecting the power supply.
    4. +
    5. Wait at least 5 seconds.
    6. +
    7. Turn off the platform by using the power button.
    8. +
    9. Wait at least 3 seconds.
    10. +
    11. +

      Set the proper state of the SPI by using the following commands on RTE:

      +
      # set SPI Vcc to 1.8V
      +echo 0 > /sys/class/gpio/gpio405/value
      +# SPI Vcc on
      +echo 1 > /sys/class/gpio/gpio406/value
      +# SPI lines ON
      +echo 1 > /sys/class/gpio/gpio404/value
      +
      +
    12. +
    13. +

      Wait at least 2 seconds.

      +
    14. +
    15. Disconnect the power supply from the platform.
    16. +
    17. Wait at least 2 seconds.
    18. +
    19. +

      Flash the platform by using the following command:

      +
      flashrom -p linux_spi:dev=/dev/spidev1.0,spispeed=16000 -c "MX25U6435E/F" -w [path_to_binary]
      +
      +
      +

      Flashing with flashrom takes about 1 minute.

      +
      +
    20. +
    21. +

      Change back the state of the SPI by using the following commands:

      +
      echo 0 > /sys/class/gpio/gpio404/value
      +echo 0 > /sys/class/gpio/gpio406/value
      +
      +
    22. +
    23. +

      Reset CMOS, this can be done by two methods:

      +
        +
      1. Disconnect the CMOS battery, wait at least 10 seconds and connect again.
      2. +
      3. +

        Short the two pins from the CMOS header for at least 10 seconds.

        +

        +
      4. +
      +
    24. +
    25. +

      Turn on the platform by connecting the power supply.

      +
    26. +
    +

    The first boot of the platform after proceeding with the above procedure can +take much longer than standard.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2410/releases/index.html b/variants/protectli_vp2410/releases/index.html new file mode 100644 index 00000000000..927b565213e --- /dev/null +++ b/variants/protectli_vp2410/releases/index.html @@ -0,0 +1,5895 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Release Notes

    +

    Following Release Notes describe status of open-source firmware development for +Protectli VP2410 family.

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    +Subscribe to Protectli VP2410 Dasharo Release Newsletter +

    +

    Test results for this platform can be found +here.

    +

    v1.0.15 - 2022-05-31

    +

    Changed

    +
      +
    • Customized Network boot menu and strings
    • +
    +

    Fixed

    +
      +
    • SMBIOS memory information showing 0 MB DRAM in setup
    • +
    +

    Known issues

    + +

    Binaries

    +

    protectli_VP2410_DF_v1.0.15.rom +sha256 +sha256.sig

    +

    How to verify signatures:

    +
    wget https://github.com/protectli-root/protectli-firmware-updater/raw/main/images/protectli_vp2410_DF_v1.0.15.rom -O protectli_vault_glk_v1.0.15.rom
    +wget https://3mdeb.com/open-source-firmware/Dasharo/protectli_vault_glk/v1.0.15/protectli_vault_glk_v1.0.15.rom.sha256
    +wget https://3mdeb.com/open-source-firmware/Dasharo/protectli_vault_glk/v1.0.15/protectli_vault_glk_v1.0.15.rom.sha256.sig
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/customer-keys/protectli/release-keys/protectli-dasharo-firewall-release-1.0-key.asc
    +gpg --list-sigs "3mdeb Master Key" "3mdeb Dasharo Master Key" "Protectli Dasharo Firewall Release 1.0 Signing Key"
    +sha256sum -c protectli_vault_glk_v1.0.15.rom.sha256
    +gpg -v --verify protectli_vault_glk_v1.0.15.rom.sha256.sig protectli_vault_glk_v1.0.15.rom.sha256
    +
    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2410/test-matrix/index.html b/variants/protectli_vp2410/test-matrix/index.html new file mode 100644 index 00000000000..d3e4069d387 --- /dev/null +++ b/variants/protectli_vp2410/test-matrix/index.html @@ -0,0 +1,6107 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.Display portsDSPDSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003
    4.Network boot utilitiesNBTAll
    5.NVMe supportNVMAll
    6.Custom logoCLGAll
    7.Custom boot menu keyCBKAll
    8.USB HID and MSC SupportUSBAll
    9.FreeBSD supportBSDAll
    10.Debian Stable and Ubuntu LTS supportLBTLBT003.001, LBT003.002, LBT004.001, LBT004.002
    11.USB-C supportUTCUTC004.001, UTC004.001
    12.M.2 WiFi/BluetoothWLEALL
    13.eMMC supportMMCMMC001.001
    14.SMBIOSDMIDMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001
    15.Custom network boot entriesCNBCNB001.002
    16.M.2 automatic SATA/NVMe switching supportMSSMSS001.001
    17.Windows bootingWBTWBT001.001
    18.Audio subsystemAUDAUD001.001, AUD001.002, AUD002.001, AUD002.002, AUD003.001, AUD003.002, AUD004.001, AUD004.002, AUD005.001, AUD005.002, AUD006.001, AUD006.002
    19.UEFI ShellUSHAll
    20.USB detectionUDTAll
    21.USB bootingUBTAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001 and TPM002.001
    2.Verified Boot supportVBOVBO006.002, VBO007.002, VBO008.001
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOAll
    5.BIOS lock supportBLSAll
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot bring up time measurementCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFAll
    4.Platform stabilitySTBAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2420/building-manual/index.html b/variants/protectli_vp2420/building-manual/index.html new file mode 100644 index 00000000000..b25bd393e36 --- /dev/null +++ b/variants/protectli_vp2420/building-manual/index.html @@ -0,0 +1,5928 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Building manual

    +

    Intro

    +

    This document describes the procedure for compiling coreboot for Protectli +VP2420.

    +

    Requirements

    + +

    Build Dasharo BIOS firmware

    +
    +

    This build procedure produces full firmware binary including blobs such as +FSP, and ME. Currently, access to them is restricted to the OEM (Protectli) via +a private repository.

    +
    +
      +
    1. +

      Clone the coreboot repository:

      +
      git clone https://github.com/Dasharo/coreboot
      +
      +
    2. +
    3. +

      Checkout the desired version, e.g. v1.1.0:

      +
      cd coreboot
      +git checkout protectli_vault_ehl_v1.1.0
      +
      +
    4. +
    5. +

      Checkout submodules:

      +
      git submodule update --init --checkout
      +
      +
    6. +
    7. +

      Obtain the Protectli blobs package:

      +
      +

      Replace <PROTECTLI_BLOBS_REPO> with a a proper path to the repository +in a form of: git@repo-path.git. You should checkout to the same tag as +in case aof the coreboot repository.

      +
      +
      cd 3rdparty/blobs/mainboard/
      +git init
      +git remote add origin <PROTECTLI_BLOBS_REPO>
      +git fetch origin && git checkout protectli_vault_ehl_v1.1.0
      +cd -
      +
      +
    8. +
    9. +

      Build the firmware v1.1.0 or newer:

      +
      ./build.sh vp2420
      +
      +
    10. +
    +

    The resulting coreboot image will be placed in the coreboot directory as +protectli_vp2420_<version>.rom.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2420/firmware-update/index.html b/variants/protectli_vp2420/firmware-update/index.html new file mode 100644 index 00000000000..78491c074a2 --- /dev/null +++ b/variants/protectli_vp2420/firmware-update/index.html @@ -0,0 +1,5897 @@ + + + + + + + + + + + + + + + + + + Firmware update - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Firmware update

    +

    The following documentation describes the process of Dasharo open-source +firmware update. If your device is currently flashed with the proprietary +firmware please refer to the Initial deployment +documentation.

    +

    For simplicity of the update process, we recommend using +Dasharo Tools Suite.

    +

    Before starting the update procedure be sure to disable Dasharo BIOS Boot medium +lock, SMM BIOS Write Protection and Secure boot:

    +
      +
    1. Power on the device.
    2. +
    3. While the device is booting, hold the DELETE key to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Dasharo Security Options + submenu.
    8. +
    9. Verify the state of the Lock the BIOS boot medium and + Enable SMM BIOS write protection options - if any of those are set, press + Space to unselect them and then F10 to save the changes.
    10. +
    11. Go back to the main menu using the ESC key.
    12. +
    13. Enter the Device Manager menu.
    14. +
    15. Enter the Secure Boot Configuration + submenu.
    16. +
    17. Verify that the Current Secure Boot State field says Disabled - if not, + unselect the Attempt Secure Boot option below then press F10 to save the + changes.
    18. +
    19. Reboot the device to properly apply the changes.
    20. +
    +

    The settings of all the above options can be restored after a firmware update.

    +

    Updating minor versions v1.x.y

    +

    Both WP_RO and RW_SECTION_A partitions of the flash needs to be updated. +Flash it using the following command:

    +
    flashrom -p internal -w [path] --fmap -i RW_SECTION_A -i WP_RO
    +
    +

    This command also preserves current Dasharo UEFI settings and the boot order.

    +

    Updating patch version v1.0.x

    +

    Only the RW_SECTION_A partition of the flash needs to be updated. Flash it +using the following command:

    +
    flashrom -p internal -w [path] --fmap -i RW_SECTION_A
    +
    +

    This command also preserves Dasharo UEFI settings and the boot order.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2420/hardware-matrix/index.html b/variants/protectli_vp2420/hardware-matrix/index.html new file mode 100644 index 00000000000..37ef42f65c5 --- /dev/null +++ b/variants/protectli_vp2420/hardware-matrix/index.html @@ -0,0 +1,5943 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configuration used for validation of the +coreboot port on the Protectli VP2420 firewall.

    +

    Protectli VP2420

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Celeron(R) J6412 @ 2.60GHz
    RAMKINGSTON KVR29S21S8/16
    Flash memoryMacronix KH25L12835F
    SSD1. SSD Samsung 860 EVO M.2 NZ-N6E250 250GB
    2. SSDPR-CL100-240-g2
    MMC driveSAMSUNG 8GTF4R (on-board)
    USB pendrives1. SanDisk USB 3.2Gen1 16 GB
    2. SanDisk USB 3.2Gen1 16 GB
    3. USB Type-C Hub Pro UCN3286
    USB headersUSB Expander
    Attached devices1. Logitech, Inc. Keyboard K120
    2. Dell Mouse MS116p
    3. USB Type-C Hub Pro UCN3286
    Wireless cardIntel Wi-Fi 6 AX200
    DisplayHDMI 1920x1080p, DP 1920x1080p
    Ethernet4x intel i225 (on-board)
    Power supplyChannel Well Technology 12V, 5.0A 60W
    +
    +

    Note, that in RAM section all used during verification procedure modules +have been listed. Device has only one RAM mounting slot.

    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2420/initial-deployment/index.html b/variants/protectli_vp2420/initial-deployment/index.html new file mode 100644 index 00000000000..26daeca6c07 --- /dev/null +++ b/variants/protectli_vp2420/initial-deployment/index.html @@ -0,0 +1,5935 @@ + + + + + + + + + + + + + + + + + + Initial deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Initial deployment

    +

    Initial flashing of Dasharo firmware can be done from Linux using flashrom with +the internal programmer. This document describes the process of building, +installing and running flashrom on Ubuntu 22.04.

    +

    Deploy using Dasharo Tools Suite

    +

    For simplicity we recommend using +Dasharo Tools Suite to +omit all compilation steps and deploy the Dasharo firmware seamlessly. +Be sure to disable the BIOS lock in the AMI firmware setup utility:

    +
      +
    1. Go to Chipset tab
    2. +
    3. Enter PCH IO Configuration
    4. +
    5. Disable BIOS Lock.
    6. +
    7. Save changes and reset.
    8. +
    +

    Now you are ready to use Dasharo Tools Suite (DTS):

    +
      +
    1. Boot Dasharo Tools Suite.
    2. +
    3. Perform Dasharo installation.
    4. +
    +

    Build flashrom

    +

    Currently, the latest flashrom release lacks support for Comet Lake U internal +flashing. Because of this, we need to build flashrom from source.

    +

    Install build dependencies:

    +
    apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson
    +
    +

    Obtain source code:

    +
    git clone https://github.com/Dasharo/flashrom -b dasharo-release
    +cd flashrom
    +
    +

    Build flashrom:

    +
    sudo make install
    +
    +

    Reading flash contents

    +

    Always prepare a backup of the current firmware image. To read from the flash +and save them to a file (backup.rom), execute the following command:

    +
    flashrom -p internal -r dump.rom
    +
    +

    Keep the backup for later recovery if needed.

    +

    Flashing Dasharo

    +

    To flash Dasharo on the platform, execute the following command - replace +[path] with the path to the Dasharo image you want to flash, e.g. +protectli_vault_ehl_v1.0.0.rom.

    +

    If stock firmware is currently installed:

    +
    flashrom -p internal -w [path] --ifd -i bios
    +
    +

    If Dasharo is currently installed, only the RW_SECTION_A partition of the +flash needs to be updated. Flash it using the following command:

    +
    flashrom -p internal -w protectli_vault_ehl_v1.x.y.rom --fmap -i RW_SECTION_A
    +
    +

    This command also preserves Dasharo UEFI settings and the boot order.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2420/overview/index.html b/variants/protectli_vp2420/overview/index.html new file mode 100644 index 00000000000..dc5698b7756 --- /dev/null +++ b/variants/protectli_vp2420/overview/index.html @@ -0,0 +1,5898 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    +

    The Vault Pro is a small form network appliance built for use as a firewall +/ router, virtualization platform, a daily-driven personal computer, +and more. The VP2420 is based on a 4 x 2.5 G network port design that leverages +a low power, but versatile Intel Celeron J6412 CPU.

    +

    +

    The VP2420 can accommodate up to 32 GB DDR4 RAM and 2 TB M.2 SATA SSD +storage drive (Note: The VP2420 supports M.2 SATA drives, not NVMe +drives). The built-in 8 GB eMMC module can be used for booting a +light-weight OS for example, or for use as optional storage.

    +

    VP2410 specification:

    +
      +
    • Intel Celeron® J6412 Quad Core at 2 GHz (Burst up to 2.6 GHz)
    • +
    • 4 Intel® 2.5 Gigabit Ethernet NIC ports
    • +
    • M.2 SATA SSD Slot (Note: This device does not support NVMe drives)
    • +
    • 8 GB eMMC module on board
    • +
    • Intel® AES-NI support
    • +
    • Fanless and Silent
    • +
    • Included 12v Power Supply, VESA mount kit, Serial Console Cable, +SATA data and power cables for internal SSD, Quick Start Guide
    • +
    +

    For more information please refer to the references below.

    +

    References

    + +

    Documentation sections

    +
      +
    • Releases - groups information about all releases.
    • +
    • Building manual - describes how to build Dasharo for + Protecli 2420.
    • +
    • Initial deployment - describes initial Dasharo + deployment methods (i. e. flashing new firmware) for Protectli VP2420.
    • +
    • Recovery - gathers information on how to recover the platform + from potential failure.
    • +
    • Hardware configuration matrix - describes the + platform's hardware configuration used during the Dasharo firmware + validation procedure.
    • +
    • Test matrix - describes validation scope used during + Dasharo firmware validation procedure.
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2420/recovery/index.html b/variants/protectli_vp2420/recovery/index.html new file mode 100644 index 00000000000..862083b7989 --- /dev/null +++ b/variants/protectli_vp2420/recovery/index.html @@ -0,0 +1,6006 @@ + + + + + + + + + + + + + + + + + + Recovery - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Recovery

    +

    Intro

    +

    The following documentation describes the process of recovering hardware from +the brick state with RTE and +Dasharo open-source firmware.

    +

    Prerequisites

    +
      +
    • Prepared RTE
    • +
    • SOIC-8 Pomona clip
    • +
    • 6x female-female wire cables
    • +
    +

    Connections

    +

    To prepare the stand for flashing follow the steps described below:

    +
      +
    1. +

      Connect the wire cables to the Pomona clip.

      +

      +

      +
    2. +
    3. +

      Connect the Pomona clip to the SPI header + on RTE.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SPI headerPomona clip
      Vccpin 5 (Vcc)
      GNDpin 4 (GND)
      CSpin 1 (CS)
      SCLKpin 7 (CLK)
      MISOpin 2 (MISO)
      MOSIpin 8 (MOSI)
      +

      +
    4. +
    5. +

      Open the platform cover.

      +

      +
    6. +
    7. +

      Match pin 1(CS) on the Pomona clip with the first pin of the one of flash + chip, marked with a small dot engraved on the chip.

      +

      +

      +
    8. +
    +

    Firmware flashing

    +

    To flash firmware follow the steps described below:

    +
      +
    1. Login to RTE via ssh or minicom.
    2. +
    3. Turn on the platform by connecting the power supply.
    4. +
    5. Wait at least 5 seconds.
    6. +
    7. Turn off the platform by using the power button.
    8. +
    9. Wait at least 3 seconds.
    10. +
    11. +

      Set the proper state of the SPI by using the following commands on RTE:

      +
      # set SPI Vcc to 3.3V
      +echo 1 > /sys/class/gpio/gpio405/value
      +# SPI Vcc on
      +echo 1 > /sys/class/gpio/gpio406/value
      +# SPI lines ON
      +echo 1 > /sys/class/gpio/gpio404/value
      +
      +
    12. +
    13. +

      Wait at least 2 seconds.

      +
    14. +
    15. Disconnect the power supply from the platform.
    16. +
    17. Wait at least 2 seconds.
    18. +
    19. +

      Flash the platform by using the following command:

      +
      flashrom -p linux_spi:dev=/dev/spidev1.0,spispeed=16000 -c "MX25L12835F/MX25L12845E/MX25L12865E" -w [path_to_binary]
      +
      +
      +

      Flashing with flashrom takes about 1 minute.

      +
      +
    20. +
    21. +

      Change back the state of the SPI by using the following commands:

      +
      echo 0 > /sys/class/gpio/gpio404/value
      +echo 0 > /sys/class/gpio/gpio406/value
      +
      +
    22. +
    23. +

      Reset CMOS, this can be done by two methods:

      +
        +
      1. Disconnect the CMOS battery, wait at least 10 seconds and connect again.
      2. +
      3. +

        Short the two pins from the CMOS header for at least 10 seconds.

        +

        +
      4. +
      +
    24. +
    25. +

      Turn on the platform by connecting the power supply.

      +
    26. +
    +

    The first boot of the platform after proceeding with the above procedure can +take much longer than standard.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2420/releases/index.html b/variants/protectli_vp2420/releases/index.html new file mode 100644 index 00000000000..79a5edc4bcb --- /dev/null +++ b/variants/protectli_vp2420/releases/index.html @@ -0,0 +1,5983 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Release Notes

    +

    Following Release Notes describe status of open-source firmware development for +Protectli VP2420 family.

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    +Subscribe to Protectli VP2420 Dasharo Release Newsletter +

    +

    Test results for this platform can be found +here.

    +

    v1.1.0 - 2023-04-20

    +

    Added

    + +

    Changed

    + +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    protectli_vp2420_v1.1.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.1 - 2023-02-02

    +

    Added

    + +

    Changed

    +
      +
    • Downgrade edk2 Secure Boot driver to achieve consistent user experience as on + the VP46XX v1.0.19 release
    • +
    +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    protectli_vp2420_v1.0.1.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.0 - 2022-12-22

    +

    Added

    + +

    Binaries

    +

    protectli_VP2420_v1.0.0.rom +sha256 +sha256.sig

    +

    How to verify signatures:

    +
    wget https://3mdeb.com/open-source-firmware/Dasharo/protectli_vault_ehl/v1.0.0/protectli_vp2420_v1.0.0.rom
    +wget https://3mdeb.com/open-source-firmware/Dasharo/protectli_vault_ehl/v1.0.0/protectli_vp2420_v1.0.0.rom.sha256
    +wget https://3mdeb.com/open-source-firmware/Dasharo/protectli_vault_ehl/v1.0.0/protectli_vp2420_v1.0.0.rom.sha256.sig
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/keys/master-key/3mdeb-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/dasharo/3mdeb-dasharo-master-key.asc
    +gpg --fetch-keys https://raw.githubusercontent.com/3mdeb/3mdeb-secpack/master/customer-keys/protectli/release-keys/protectli-dasharo-firewall-release-1.0-key.asc
    +gpg --list-sigs "3mdeb Master Key" "3mdeb Dasharo Master Key" "Protectli Dasharo Firewall Release 1.0 Signing Key"
    +sha256sum -c protectli_vp2420_v1.0.0.rom.sha256
    +gpg -v --verify protectli_vp2420_v1.0.0.rom.sha256.sig protectli_vp2420_v1.0.0.rom.sha256
    +
    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp2420/test-matrix/index.html b/variants/protectli_vp2420/test-matrix/index.html new file mode 100644 index 00000000000..1399078ba46 --- /dev/null +++ b/variants/protectli_vp2420/test-matrix/index.html @@ -0,0 +1,6179 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.Display portsDSPDSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003
    4.Network boot utilitiesNBTAll
    6.Custom logoCLGAll
    7.Custom boot menu keyCBKAll
    8.USB HID and MSC SupportUSBUSB001.XXX and USB002.XXX
    9.FreeBSD supportBSDAll
    10.Debian Stable and Ubuntu LTS supportLBTLBT003.001, LBT003.002, LBT004.001, LBT004.002
    11.USB-C supportUTCUTC004.001, UTC004.002
    12.M.2 WiFi/BluetoothWLEALL
    13.eMMC supportMMCMMC001.001
    14.SMBIOSDMIDMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001
    15.Custom network boot entriesCNBCNB001.002
    17.Windows bootingWBTWBT001.001
    18.UEFI ShellUSHAll
    19.USB detectionUDTAll
    20.USB bootingUBTAll
    21.pfSense supportPFSAll
    22.OPNsense supportOPNAll
    23.Proxmox supportPVEAll
    24.Ubuntu Server supportUSSAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMTPM001.002 and TPM001.003
    2.Verified Boot supportVBOWithout VBO006.001 and VBO007.001
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOAll
    5.BIOS lock supportBLSAll
    6.USB stack enable/disableUSSAll
    7.SMM BIOS write protectionSMMAll
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot bring up time measurementCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFWithout CPU003.XXX and CPU005.XXX
    4.Platform stabilitySTBAll
    5.Ubuntu booting performance testBUBAll
    6.Debian booting performance testBDEAll
    7.FreeBSD booting performance testBFBAll
    8.Proxmox booting performance testBPMAll
    9.Ubuntu Server booting performance testBUSAll
    10.OPNsense (serial output) booting performance testBOSAll
    11.OPNsense (VGA output) booting performance testBOVAll
    12.pfSense (serial output) booting performance testBPSAll
    13.pfSense (VGA output) booting performance testBPVAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp46xx/building-manual/index.html b/variants/protectli_vp46xx/building-manual/index.html new file mode 100644 index 00000000000..696b5247ea3 --- /dev/null +++ b/variants/protectli_vp46xx/building-manual/index.html @@ -0,0 +1,5941 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Building manual

    +

    Intro

    +

    This document describes the procedure for compiling coreboot for Protectli +VP4630, VP4650 and VP4670.

    +

    Requirements

    + +

    Build Dasharo BIOS firmware

    +
    +

    This build procedure produces full firmware binary including blobs such as +FSP, and ME. Currently, access to them is restricted to the OEM (Protectli) via +a private repository.

    +
    +

    Since version v1.0.18 VP4630 and VP4650 use different configuration file than +VP4670. Versions v1.0.17 and older do not support VP4650 and VP4670 at all.

    +
      +
    1. +

      Clone the coreboot repository:

      +
      git clone https://github.com/Dasharo/coreboot
      +
      +
    2. +
    3. +

      Checkout the desired version, e.g. v1.0.19:

      +
      cd coreboot
      +git checkout protectli_vault_cml_v1.0.19
      +
      +
    4. +
    5. +

      Checkout submodules:

      +
      git submodule update --init --checkout
      +
      +
    6. +
    7. +

      Obtain the Protectli blobs package:

      +
      +

      Replace <PROTECTLI_BLOBS_REPO> with a a proper path to the repository +in a form of: git@repo-path.git. You should checkout to the same tag as +in case aof the coreboot repository.

      +
      +
      cd 3rdparty/blobs/mainboard/
      +git init
      +git remote add origin <PROTECTLI_BLOBS_REPO>
      +git fetch origin && git checkout protectli_vault_cml_v1.0.19
      +cd -
      +
      +
    8. +
    9. +

      Build the firmware v1.0.19 or newer:

      +
        +
      • +

        for VP4630 and VP4650

        +
        ./build.sh vp4630_vp4650
        +
        +
      • +
      • +

        for VP4670

        +
        ./build.sh vp4670
        +
        +
      • +
      +
    10. +
    +

    The resulting coreboot image will be placed in the coreboot directory as +protectli_vault_cml_<version>_vp4630_vp4650.rom or +protectli_vault_cml_<version>_vp4670.rom respectvely.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp46xx/firmware-update/index.html b/variants/protectli_vp46xx/firmware-update/index.html new file mode 100644 index 00000000000..44e1e031db5 --- /dev/null +++ b/variants/protectli_vp46xx/firmware-update/index.html @@ -0,0 +1,5921 @@ + + + + + + + + + + + + + + + + + + Firmware update - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    + +
    + + + +
    +
    + + + + + + + + + +

    Firmware update

    +

    The following documentation describes the process of Dasharo open-source +firmware update. If your device is currently flashed with the proprietary +firmware please refer to the Initial deployment +documentation.

    +

    The update process may be different, depending on the currently installed +Dasharo firmware version.

    +

    For simplicity of the update process, we recommend using +Dasharo Tools Suite.

    +

    Before starting the update procedure be sure to disable Dasharo BIOS Boot medium +lock and Secure Boot:

    +
      +
    1. Power on the device.
    2. +
    3. While the device is booting, hold the DELETE key to enter the UEFI Setup + Menu.
    4. +
    5. Enter the Dasharo System Features menu using the arrow keys and Enter.
    6. +
    7. Enter the Dasharo Security Options + submenu.
    8. +
    9. Verify the state of the Lock the BIOS boot medium option - if the option + is chosen, press Space and then F10 to save the changes.
    10. +
    11. Go back to the main menu using the ESC key.
    12. +
    13. Enter the Device Manager menu.
    14. +
    15. Enter the Secure Boot Configuration + submenu.
    16. +
    17. Verify that the Current Secure Boot State field says Disabled - if not, + unselect the Attempt Secure Boot option below then press F10 to save the + changes.
    18. +
    19. Reboot the device to properly apply the changes.
    20. +
    +

    The settings of all the above options can be restored after a firmware update.

    +

    Updating to Dasharo v1.0.18 or v1.0.19 or v1.1.0

    +

    From v1.0.18 Dasharo firmware is rebased on the more up-to-date revision of +coreboot.

    +

    If the current version of the firmware on the device is older than v1.0.18 or +you are migrating from proprietary firmware the whole flash chip should be +flashed as described in Initial Deployment.

    +

    If the current version of the firmware on the device is v1.0.18 and it should +be updated to v1.0.19 or v1.1.0, only the WP_RO and RW_SECTION_A should be +flashed. To do this the following command should be used:

    +
    flashrom -p internal -w protectli_vault_cml_v1.0.19.rom --fmap -i WP_RO -i RW_SECTION_A
    +
    +

    Updating on Dasharo v1.0.16 or v1.0.17

    +

    Only the RW_SECTION_A partition of the flash needs to be updated. Flash it +using the following command:

    +
    flashrom -p internal -w protectli_vault_cml_v1.0.16.rom --fmap -i RW_SECTION_A
    +
    +

    This command also preserves Dasharo UEFI settings and the boot order.

    +

    Updating on older Dasharo versions

    +

    In this case, the whole bios region must be updated.

    +
    flashrom -p internal -w protectli_vault_cml_v1.0.13.rom --ifd -i bios
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp46xx/hardware-matrix/index.html b/variants/protectli_vp46xx/hardware-matrix/index.html new file mode 100644 index 00000000000..e28feeb888c --- /dev/null +++ b/variants/protectli_vp46xx/hardware-matrix/index.html @@ -0,0 +1,6153 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configuration used for validation of the +coreboot port on the Protectli VP46XX firewall.

    +

    Protectli VP4630

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core i3-10110U
    RAMSlot 1: Empty
    Slot 2: SAMSUNG M471A4G43MB1-CTD
    Flash memoryMacronix KH25L12835F
    SSDKingston NV1 250GB SNVS/250G
    MMC driveSAMSUNG KLM8G1GETF-B041 (on-board)
    USB pendrives1. SanDisk Ultra Flair USB 3.0 16 GB
    USB KeyboardDELL KB216
    USB MouseDELL MS116p
    Wireless cardIntel Wi-Fi 6 AX200
    4G ModemAMIT MDG200-0T001
    DisplayDisplay 1: HDMI 1920x1080p
    Display 2: DP 1920x1080p
    Ethernet controller6x intel i225 (on-board)
    Internal devicesAudio subsystem
    TPMProtectli TPM
    NetworkLocal network wired connection
    Remote Testing EnvironmentRTE v1.1.0
    Power ControlRTE v1.1.0
    Power supplyChannel Well Technology 12V, 5.0A 60W
    +

    Protectli VP4650

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core i5-10210U
    RAMSlot 1: Kingston KVR24S17S8/8
    Slot 2: Kingston KVR26S19S8/16
    Flash memoryMacronix KH25L12835F
    SSDSamsung 980 PRO NVMe 250 GB
    MMC driveSAMSUNG KLM8G1GETF-B041 (on-board)
    USB KeyboardDELL KB216
    USB MouseDELL MS116p
    Wireless cardJJPLUS JWW6051
    4G ModemAMIT MDG200-0T001
    DisplayDisplay 1: HDMI 1920x1080p
    Display 2: DP 1920x1080p
    Ethernet controller6x intel i225 (on-board)
    Internal devicesAudio subsystem
    TPMProtectli TPM
    NetworkLocal network wired connection
    Remote Testing EnvironmentRTE v1.1.0
    Power ControlRTE v1.1.0
    Power supplyChannel Well Technology 12V, 7.5A 90W
    +

    Protectli VP4670

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core i7-10810U
    RAMSlot 1: Samsung 4GB 1Rx8 PC4-2133P-SA0-11
    Slot 2: Samsung 4GB 1Rx8 PC4-2133P-SA0-11
    Flash memoryMacronix KH25L12835F
    SSDKingston NV1 250GB SNVS/250G
    MMC driveSAMSUNG KLM8G1GETF-B041 (on-board)
    USB KeyboardDELL KB216
    USB MouseDELL MS116p
    Wireless cardJJPLUS JWW6051
    4G ModemAMIT MDG200-0T001
    DisplayDisplay 1: HDMI 1920x1080p
    Display 2: DP 1920x1080p
    Ethernet controller6x intel i225 (on-board)
    Internal devicesAudio subsystem
    TPMProtectli TPM
    NetworkLocal network wired connection
    Remote Testing EnvironmentRTE v1.1.0
    Power ControlRTE v1.1.0
    Power supplyChannel Well Technology 12V, 7.5A 90W
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp46xx/initial-deployment/index.html b/variants/protectli_vp46xx/initial-deployment/index.html new file mode 100644 index 00000000000..442cf94518b --- /dev/null +++ b/variants/protectli_vp46xx/initial-deployment/index.html @@ -0,0 +1,5956 @@ + + + + + + + + + + + + + + + + + + Initial deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Initial deployment

    +

    Initial flashing of Dasharo firmware can be done from Linux using flashrom with +the internal programmer. This document describes the process of building, +installing and running flashrom on Ubuntu 22.04.

    +

    Deploy using Dasharo Tools Suite

    +

    For simplicity we recommend using +Dasharo Tools Suite to +omit all compilation steps and deploy the Dasharo firmware seamlessly. +Be sure to disable the BIOS lock in the AMI firmware setup utility:

    +
      +
    1. Go to Chipset tab
    2. +
    3. Enter PCH IO Configuration
    4. +
    5. Disable BIOS Lock.
    6. +
    7. Save changes and reset.
    8. +
    +

    Now you are ready to use Dasharo Tools Suite (DTS):

    +
      +
    1. Boot Dasharo Tools Suite.
    2. +
    3. Perform Dasharo installation.
    4. +
    +

    This will flash the full image, including the Intel ME. The operation requires +a hard reset of the platform. To perform a hard reset:

    +
      +
    1. Power off the platform. Note, it may not power off completely due to flashed + ME.
    2. +
    3. Disconnect power supply from the board when OS finishes all tasks after + power off (the screen goes dark or black).
    4. +
    5. Disconnect the RTC/CMOS battery OR clear the CMOS using the pin header + located near memory slots. Wait about 10 seconds and unshort the pins.
    6. +
    7. Connect the power supply back.
    8. +
    9. The platform should power on normally now. You can connect the battery back + if it was disconnected.
    10. +
    +

    This concludes Dasharo deployment process using DTS.

    +

    Build flashrom

    +

    Currently, the latest flashrom release lacks support for Comet Lake U internal +flashing. Because of this, we need to build flashrom from source.

    +

    Install build dependencies:

    +
    apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson
    +
    +

    Obtain source code:

    +
    git clone https://review.coreboot.org/flashrom.git
    +cd flashrom
    +
    +

    Build flashrom:

    +
    make
    +sudo make install
    +
    +

    Reading flash contents

    +

    Always prepare a backup of the current firmware image. To read from the flash +and save it to a file (dump.rom), execute the following command:

    +
    flashrom -p internal -r dump.rom
    +
    +

    Flashing Dasharo

    +

    To flash Dasharo on the platform, execute the following command - replace +[path] with the path to the Dasharo image you want to flash, e.g. +protectli_vault_cml_v1.0.13.rom.

    +
    flashrom -p internal -w protectli_vault_cml_v1.0.13.rom
    +
    +

    This will flash the full image, including the Intel ME. The operation requires +a hard reset of the platform. To perform a hard reset:

    +
      +
    1. Power off the platform. Note, it may not power off completely due to flashed + ME.
    2. +
    3. Disconnect power supply from the board when OS finishes all tasks after + power off (the screen goes dark or black).
    4. +
    5. Disconnect the RTC/CMOS battery OR clear the CMOS using the pin header + located near memory slots. Wait about half a minute (unshort the pins).
    6. +
    7. Connect the power supply back.
    8. +
    9. The platform should power on normally now. You can connect the battery back + if it was disconnected.
    10. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp46xx/overview/index.html b/variants/protectli_vp46xx/overview/index.html new file mode 100644 index 00000000000..ca6651d1c1c --- /dev/null +++ b/variants/protectli_vp46xx/overview/index.html @@ -0,0 +1,5893 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    +

    The Vault is a small form network appliance built for use as a firewall / +router, virtualization platform, a daily-driven personal computer, and more. +The VP46XX is the second platform of the Vault Pro series with higher +performance and newer technology than the original FW6 series.

    +

    +

    The VP46XX features an Intel 10th Generation CPU, 2x DDR4 DIMM modules, 6x +Intel i225-V 2.5G Ethernet ports, PCIe x4/SATA NVMe storage, LPC TPM, M.2 WIFI +and WWAN slots.

    +
      +
    • VP4630 - Intel Core i3-10110U
    • +
    • VP4650 - Intel Core i5-10210U
    • +
    • VP4670 - Intel Core i7-10810U
    • +
    +

    For more information please refer to the references below.

    +

    References

    + +

    Documentation sections

    +
      +
    • Releases - groups information about all releases.
    • +
    • Building manual - describes how to build Dasharo for + NovaCustom NV4x.
    • +
    • Initial deployment - describes initial Dasharo + deployment methods (i. e. flashing new firmware) for Protectli VP46xx.
    • +
    • Firmware update - explains supported Dasharo + open-source firmware update methods.
    • +
    • Recovery - gathers information on how to recover the platform + from potential failure.
    • +
    • Hardware configuration matrix - describes the + platform's hardware configuration used during the Dasharo firmware + validation procedure.
    • +
    • Test matrix - describes validation scope used during + Dasharo firmware validation procedure.
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp46xx/recovery/index.html b/variants/protectli_vp46xx/recovery/index.html new file mode 100644 index 00000000000..74440969d49 --- /dev/null +++ b/variants/protectli_vp46xx/recovery/index.html @@ -0,0 +1,6006 @@ + + + + + + + + + + + + + + + + + + Recovery - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Recovery

    +

    Intro

    +

    The following documentation describes the process of recovering hardware from +the brick state with RTE and +Dasharo open-source firmware.

    +

    Prerequisites

    +
      +
    • Prepared RTE
    • +
    • SOIC-8 Pomona clip
    • +
    • 6x female-female wire cables
    • +
    +

    Connections

    +

    To prepare the stand for flashing follow the steps described below:

    +
      +
    1. +

      Connect the wire cables to the Pomona clip.

      +

      +

      +
    2. +
    3. +

      Connect the Pomona clip to the SPI header + on RTE.

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      SPI headerPomona clip
      Vccpin 5 (Vcc)
      GNDpin 4 (GND)
      CSpin 1 (CS)
      SCLKpin 7 (CLK)
      MISOpin 2 (MISO)
      MOSIpin 8 (MOSI)
      +

      +
    4. +
    5. +

      Open the platform cover.

      +

      +
    6. +
    7. +

      Match pin 1(CS) on the Pomona clip with the first pin of the flash chip, + marked with a small dot engraved on the chip.

      +

      +

      +
    8. +
    +

    Firmware flashing

    +

    To flash firmware follow the steps described below:

    +
      +
    1. Login to RTE via ssh or minicom.
    2. +
    3. Turn on the platform by connecting the power supply.
    4. +
    5. Wait at least 5 seconds.
    6. +
    7. Turn off the platform by using the power button.
    8. +
    9. Wait at least 3 seconds.
    10. +
    11. +

      Set the proper state of the SPI by using the following commands on RTE:

      +
      # set SPI Vcc to 3.3V
      +echo 1 > /sys/class/gpio/gpio405/value
      +# SPI Vcc on
      +echo 1 > /sys/class/gpio/gpio406/value
      +# SPI lines ON
      +echo 1 > /sys/class/gpio/gpio404/value
      +
      +
    12. +
    13. +

      Wait at least 2 seconds.

      +
    14. +
    15. Disconnect the power supply from the platform.
    16. +
    17. Wait at least 2 seconds.
    18. +
    19. +

      Flash the platform by using the following command:

      +
      flashrom -p linux_spi:dev=/dev/spidev1.0,spispeed=16000 -c "MX25L12835F/MX25L12845E/MX25L12865E" -w [path_to_binary]
      +
      +
      +

      Flashing with flashrom takes about 1 minute.

      +
      +
    20. +
    21. +

      Change back the state of the SPI by using the following commands:

      +
      echo 0 > /sys/class/gpio/gpio404/value
      +echo 0 > /sys/class/gpio/gpio406/value
      +
      +
    22. +
    23. +

      Reset CMOS, this can be done by two methods:

      +
        +
      1. Disconnect the CMOS battery, wait at least 10 seconds and connect again.
      2. +
      3. +

        Short the two pins from the CMOS header for at least 10 seconds.

        +

        +
      4. +
      +
    24. +
    25. +

      Turn on the platform by connecting the power supply.

      +
    26. +
    +

    The first boot of the platform after proceeding with the above procedure can +take much longer than standard.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp46xx/releases/index.html b/variants/protectli_vp46xx/releases/index.html new file mode 100644 index 00000000000..6142b4b34d9 --- /dev/null +++ b/variants/protectli_vp46xx/releases/index.html @@ -0,0 +1,6159 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Release Notes

    +

    Following Release Notes describe status of Open Source Firmware development for +Protectli VP46xx

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    +Subscribe to Protectli VP46xx Dasharo Release Newsletter +

    +

    Test results for this platform can be found +here.

    +

    v1.1.0 - 2023-06-05

    +

    Release version v1.1.0 is currently only available for the VP4670 platform.

    +

    Added

    + +

    Changed

    + +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    protectli_vp4670_v1.1.0.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.19 - 2022-12-08

    +

    Changed

    +
      +
    • ME is now disabled by default (ME soft-disable)
    • +
    • vboot is now run as separate verstage (previously was run inside bootblock)
    • +
    • increased pre-RAM console buffer to fit more early cbmem logs
    • +
    +

    Binaries

    +

    protectli_vp4630_vp4650_v1.0.19.rom +sha256 +sha256.sig

    +

    protectli_vp4670_v1.0.19.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.18 - 2022-11-16

    +

    Test results for this release can be found +here.

    +

    Added

    +
      +
    • Support for VP4650 and VP4670 platforms
    • +
    • Platform will beep 12 times and blink HDD led on critical firmware errors
    • +
    +

    Changed

    + +

    Binaries

    +

    protectli_vp4630_vp4650_v1.0.18.rom +sha256 +sha256.sig

    +

    protectli_vp4670_v1.0.18.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.17 - 2022-08-17

    +

    Test results for this release can be found +here.

    +

    Added

    + +

    Changed

    +
      +
    • Set thermal throttling temperature to 80 degrees
    • +
    • Disabled UEFI Secure Boot by default
    • +
    +

    Fixed

    +
      +
    • Platform rebooting every 56 minutes
    • +
    • Incorrect menu labels displayed in network boot menu
    • +
    • Built-in audio jack does not work
    • +
    +

    Binaries

    +

    protectli_vault_cml_v1.0.17.rom_file +protectli_vault_cml_v1.0.17.rom_hash +protectli_vault_cml_v1.0.17.rom_sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.16 - 2022-07-13

    +

    Test results for this release can be found +here.

    +

    Added

    + +

    Changed

    + +

    Fixed

    + +

    Binaries

    +

    protectli_vault_cml_v1.0.16.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v1.0.13 - 2022-03-22

    +

    Added

    +
      +
    • UEFI boot support
    • +
    • i225 network controller network boot support
    • +
    • Customized boot menu keys
    • +
    • Customized setup menu keys
    • +
    • Configurable boot order
    • +
    • Configurable boot options
    • +
    +

    Changed

    +
      +
    • ME version to 14.0.47.1558
    • +
    +

    Known issues

    + +

    Binaries

    +

    protectli_vault_cml_v1.0.13.rom +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/protectli_vp46xx/test-matrix/index.html b/variants/protectli_vp46xx/test-matrix/index.html new file mode 100644 index 00000000000..97ea0e67d5e --- /dev/null +++ b/variants/protectli_vp46xx/test-matrix/index.html @@ -0,0 +1,6209 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary. The test scope is the same +for all platforms of the VP46XX family.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.Display portsDSPDSP002.001, DSP002.002, DSP002.003, DSP003.001, DSP003.002, DSP003.003
    4.Network boot utilitiesNBTAll
    5.NVMe supportNVMAll
    6.Custom logoCLGAll
    7.Custom boot menu keyCBKAll
    8.USB HID and MSC SupportUSBUSB001.XXX and USB002.XXX
    9.FreeBSD supportBSDAll
    10.Debian Stable and Ubuntu LTS supportLBTLBT003.001, LBT003.002, LBT004.001, LBT004.002
    11.USB-C supportUTCUTC004.001, UTC004.002
    12.M.2 WiFi/BluetoothWLEALL
    13.eMMC supportMMCMMC001.001
    14.SMBIOSDMIDMI002.001, DMI003.001, DMI004.001, DMI005.001, DMI006.001
    15.Custom network boot entriesCNBCNB001.002
    16.M.2 automatic SATA/NVMe switching supportMSSMSS001.001
    17.Windows bootingWBTWBT001.001
    18.Audio subsystemAUDAUD001.001, AUD001.002, AUD002.001, AUD002.002, AUD003.001, AUD003.002, AUD004.001, AUD004.002, AUD005.001, AUD005.002, AUD006.001, AUD006.002
    19.UEFI ShellUSHAll
    20.USB detectionUDTAll
    21.USB bootingUBTAll
    22.pfSense supportPFSAll
    23.OPNsense supportOPNAll
    24.Proxmox supportPVEAll
    25.Ubuntu Server supportUSSAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001,TPM002.001 and TPM003.001
    2.Verified Boot supportVBOWithout VBO006.001 and VBO007.001
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOAll
    5.ME disable/neuter supportMNEMNE004.001
    6.BIOS lock supportBLSAll
    7.USB stack enable/disableUSSAll
    8.SMM BIOS write protectionSMMAll
    +
    +

    Note: in Dasharo compatible with Protectli VP46xx ME is soft-disabled by +default - no additional option for ME disabling is available in the Setup +Menu.

    +
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot bring up time measurementCBMEMAll
    2.CPU temperature measureCPTAll
    3.CPU frequency measureCPFWithout CPU003.XXX and CPU005.XXX
    4.Platform stabilitySTBAll
    5.Ubuntu booting performance testBUBAll
    6.Debian booting performance testBDEAll
    7.FreeBSD booting performance testBFBAll
    8.Proxmox booting performance testBPMAll
    9.Ubuntu Server booting performance testBUSAll
    10.OPNsense (serial output) booting performance testBOSAll
    11.OPNsense (VGA output) booting performance testBOVAll
    12.pfSense (serial output) booting performance testBPSAll
    13.pfSense (VGA output) booting performance testBPVAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/qemu_q35/building-manual/index.html b/variants/qemu_q35/building-manual/index.html new file mode 100644 index 00000000000..7a8608fc2b1 --- /dev/null +++ b/variants/qemu_q35/building-manual/index.html @@ -0,0 +1,5949 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo (UEFI) v0.1.0 for QEMU Q35 - Building Manual

    +

    Follow below steps to create the "Dasharo (UEFI) OVMF image for QEMU Q35" from EDK2:

    +

    Requirements

    + +

    Procedure

    +

    Easiest way to build OVMF for QEMU Q35 is to use coreboot Docker image. +As some dependencies maybe missing in given local instance.

    +

    Obtain the docker image:

    +
    docker pull coreboot/coreboot-sdk:2021-09-23_b0d87f753c
    +
    +

    Clone official Dasharo EDK2 repository to your docker instance, +with git or downloading the source code from github.

    +
    git clone https://github.com/Dasharo/edk2.git
    +
    +

    Start the instance of the docker image under the Dasharo/edk2 repository:

    +
    sudo docker run --rm -it -v $PWD:/home/coreboot/coreboot \
    +    -w /home/coreboot/coreboot coreboot/coreboot-sdk:2021-09-23_b0d87f753c \
    +    /bin/bash
    +
    +

    Follow below instructions, to prepare your environment for building OVMF +image.

    +
      +
    • Setup the environment variables with the following command
    • +
    +
    make -C BaseTools
    +source edksetup.sh
    +
    +
      +
    • Update the submodules in order get latest dependencies.
    • +
    +
    git submodule update --init --checkout
    +
    +
      +
    • Clone the edk2-platforms repository for additional packages
    • +
    +
    git clone https://github.com/Dasharo/edk2-platforms.git \
    +    -b 3323ed481d35096fb6a7eae7b49f35eff00f86cf
    +
    +
      +
    • Update the PACKAGES_PATH variable
    • +
    +
    export EDK2_PLATFORMS_PATH="$WORKSPACE/edk2-platforms"
    +export PACKAGES_PATH="$WORKSPACE:\
    +$EDK2_PLATFORMS_PATH/Platform/Intel:\
    +$EDK2_PLATFORMS_PATH/Silicon/Intel:\
    +$EDK2_PLATFORMS_PATH/Features/Intel:\
    +$EDK2_PLATFORMS_PATH/Features/Intel/Debugging:\
    +$EDK2_PLATFORMS_PATH/Features/Intel/Network:\
    +$EDK2_PLATFORMS_PATH/Features/Intel/OutOfBandManagement:\
    +$EDK2_PLATFORMS_PATH/Features/Intel/PowerManagement:\
    +$EDK2_PLATFORMS_PATH/Features/Intel/SystemInformation:\
    +$EDK2_PLATFORMS_PATH/Features/Intel/UserInterface"
    +
    +

    Building the firmware image

    +

    To build the image simply invoke the following command

    +
    build -a IA32 -a X64 -t GCC5 -b RELEASE -p OvmfPkg/OvmfPkgX64.dsc
    +
    +

    You can also enable additional options, for example CSM with by adding +-D CSM_ENABLE:

    +
    build -a IA32 -a X64 -t GCC5 -b RELEASE -p OvmfPkg/OvmfPkgX64.dsc -D CSM_ENABLE
    +
    +

    Once the build is completed, the OVMF firmware image can be found below given +path:

    +
    edk2/Build/Ovmf/RELEASE_GCC5/FV/OVMF_CODE.fd
    +edk2/Build/Ovmf/RELEASE_GCC5/FV/OVMF_VARS.fd
    +
    +

    For debug build use:

    +
    build -a IA32 -a X64 -t GCC5 -b DEBUG -p OvmfPkg/OvmfPkgX64.dsc
    +
    +

    Then the resulting files will be placed in:

    +
    edk2/Build/Ovmf/DEBUG_GCC5/FV/OVMF_CODE.fd
    +edk2/Build/Ovmf/DEBUG_GCC5/FV/OVMF_VARS.fd
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/qemu_q35/development/index.html b/variants/qemu_q35/development/index.html new file mode 100644 index 00000000000..0161b7f30b3 --- /dev/null +++ b/variants/qemu_q35/development/index.html @@ -0,0 +1,5971 @@ + + + + + + + + + + + + + + + + + + Development - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo (UEFI) v0.1.0 for QEMU Q35

    +

    Intro

    +
      +
    1. +

      Please check your qemu setup and launch qemu outside docker instance (host + machine) using built OVMF firmware image.

      + +
      qemu-system-x86_64 -machine q35,smm=on \
      +    -global driver=cfi.pflash01,property=secure,value=on \
      +    -drive if=pflash,format=raw,unit=0,file=Build/OvmfX64/DEBUG_GCC5/FV/OVMF_CODE.fd,readonly=on \
      +    -drive if=pflash,format=raw,unit=1,file=Build/OvmfX64/DEBUG_GCC5/FV/OVMF_VARS.fd \
      +    -debugcon file:debug.log -global isa-debugcon.iobase=0x402 \
      +    -global ICH9-LPC.disable_s3=1
      +
      +
        +
      • -drive indicate device is pflash with firmware image of built + OVMF*.fd image.
      • +
      • -debugcon file:debug.log -global isa-debugcon.iobase=0x402 default + OVMF build writes debug messages to IO port 0x402. The following + qemu command line options save them in the file called debug.log.
      • +
      • -global ICH9-LPC.disable_s3=1 SMM is put to use in the S3 suspend + and resume infrastructure, and in the UEFI variable driver stack. + Similarly, a pflash-backed variable store is a requirement.
      • +
      • -machine q35,smm=on For SMM to work, only Q35 machines are supported + hence the machine type.
      • +
      +
    2. +
    3. +

      After executing the above qemu command, qemu boots into UEFI built-in shell + and to BIOS selection area.

      +
    4. +
    5. The features which are enabled in OvmfPkgX64.dsc can be verified at + Setup menu. At Device Manager section Dasharo features can be verified + in Dasharo System Features section.
    6. +
    +

    Useful Tips for modifying the DSC & FDF

    +

    Follow the steps below to rebuild firmware image & experiment with the features

    +

    If any code is added to C file or any library functions are invoked in other +files, rebuild the OVMF image with the following command.

    +
    build -a IA32 -a X64 -t GCC5 -b DEBUG -p OvmfPkg/OvmfPkgX64.dsc
    +
    +

    By making some changes in the OvmfPkgX64.dsc file, one can add features like +OPAL, SATA security support for QEMU Q35 machine and also for specific +platforms. An example of where the changes can be made in the OvmfPkgX64.dsc +file is given below.

    +

    The following changes describe defining in the Defines Section of +OvmfPkgX64.dsc

    +
    # Defines for default states.  These can be changed on the command line.
    +# -D FLAG=VALUE
    +#
    +(...)
    +DEFINE SATA_PASSWORD_ENABLE    = TRUE
    +DEFINE OPAL_PASSWORD_ENABLE    = TRUE
    +
    +

    Include the appropriate libraries in the Libraries Section of +OvmfPkgX64.dsc.

    +
    !if $(OPAL_PASSWORD_ENABLE) == TRUE
    +TcgStorageCoreLib|SecurityPkg/Library/TcgStorageCoreLib/TcgStorageCoreLib.inf
    +TcgStorageOpalLib|SecurityPkg/Library/TcgStorageOpalLib/TcgStorageOpalLib.inf
    +!endif
    +
    +

    According to the feature, proper PCD's must be defined in OvmfPkgX64.dsc +file.

    +

    Adding components in Components Section of OvmfPkgX64.dsc file:

    +
    !if $(SATA_PASSWORD_ENABLE) == TRUE
    +SecurityPkg/HddPassword/HddPasswordPei.inf
    +!endif
    +
    +

    Dasharo System Features

    +

    The .fdf describes the source files' location and variables used during the +build process.

    +

    Below code snippet shows the location of SATA disk password INF file.

    +
    !if $(SATA_PASSWORD_ENABLE) == TRUE
    +INF SecurityPkg/HddPassword/HddPasswordDxe.inf
    +!endif
    +
    +

    Include all necessary source file locations to point at source libraries in +FDF file.

    +

    Below is the screenshot of the SATA_PASSWORD support in Device Manager.

    +

    SATA_PASSWORD

    +

    By default the Dasharo System Features are enabled in the +DasharoSystemFeatures.dec. It describes the configuration of the platform. +The flags can be toggled inside platform DSC file in order to enable +Dasharo System Features.

    +
    [PcdsFixedAtBuild]
    +  gDasharoSystemFeaturesTokenSpaceGuid.PcdShowMenu|TRUE
    +  gDasharoSystemFeaturesTokenSpaceGuid.PcdShowSecurityMenu|TRUE
    +  gDasharoSystemFeaturesTokenSpaceGuid.PcdShowIntelMeMenu|TRUE
    +  gDasharoSystemFeaturesTokenSpaceGuid.PcdShowUsbMenu|TRUE
    +  gDasharoSystemFeaturesTokenSpaceGuid.PcdShowNetworkMenu|TRUE
    +  gDasharoSystemFeaturesTokenSpaceGuid.PcdShowChipsetMenu|TRUE
    +  gDasharoSystemFeaturesTokenSpaceGuid.PcdDefaultNetworkBootEnable|FALSE
    +
    +

    In the above PCD definitions, please check column after PCD definition to find +TRUE/FALSE. By toggling these flags, one can enable or disable the Dasharo +System Features. The below image shows the Dasharo System Features enabled for +the QEMU Q35 machine.

    +

    DasharoSystemFeatures

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/qemu_q35/firmware-update/index.html b/variants/qemu_q35/firmware-update/index.html new file mode 100644 index 00000000000..bf10ae8f6a3 --- /dev/null +++ b/variants/qemu_q35/firmware-update/index.html @@ -0,0 +1,5808 @@ + + + + + + + + + + + + + + + + + + Firmware update - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Firmware Update

    +

    The update process of Dasharo OVMF firmware on QEMU Q35 does not need any +special actions. QEMU Q35 is an emulated platform, not real hardware.

    +

    Updating the Dasharo OVMF firmware is as simple as invoking a QEMU command +with a newer OVMF*.fd files:

    +
    qemu-system-x86_64 -machine q35,smm=on \
    +    -global driver=cfi.pflash01,property=secure,value=on \
    +    -drive if=pflash,format=raw,unit=0,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd,readonly=on \
    +    -drive if=pflash,format=raw,unit=1,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \
    +    -debugcon file:debug.log -global isa-debugcon.iobase=0x402 \
    +    -global ICH9-LPC.disable_s3=1
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/qemu_q35/hardware-matrix/index.html b/variants/qemu_q35/hardware-matrix/index.html new file mode 100644 index 00000000000..58bbfa83395 --- /dev/null +++ b/variants/qemu_q35/hardware-matrix/index.html @@ -0,0 +1,5914 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the devices emulated by the QEMU Q35.

    +

    QEMU Q35

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUQEMU emulated with Q35 emulated chipset
    RAMSlot 1: QEMU DIMM
    CDROMQEMU DVD-ROM
    USB KeyboardAT Translated Set 2 Keyboard
    USB MouseVirtual/PS 2 VMware Mouse
    DisplayDisplay 1: Emulated 1024px768p
    Ethernet controllerEmulated Intel 82574L Gigabit Ethernet
    Internal devicesQEMU emulated Audio subsystem
    NetworkLocal Network Connection from host
    Power ControlNone
    Power supplyPower Button Emulated
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/qemu_q35/images/q35-dasharo-device-manager.jpg b/variants/qemu_q35/images/q35-dasharo-device-manager.jpg new file mode 100644 index 00000000000..46105014cbd Binary files /dev/null and b/variants/qemu_q35/images/q35-dasharo-device-manager.jpg differ diff --git a/variants/qemu_q35/images/q35-dasharo-features.jpg b/variants/qemu_q35/images/q35-dasharo-features.jpg new file mode 100644 index 00000000000..8580ab5aae1 Binary files /dev/null and b/variants/qemu_q35/images/q35-dasharo-features.jpg differ diff --git a/variants/qemu_q35/initial-deployment/index.html b/variants/qemu_q35/initial-deployment/index.html new file mode 100644 index 00000000000..2e6fa50b7c6 --- /dev/null +++ b/variants/qemu_q35/initial-deployment/index.html @@ -0,0 +1,5807 @@ + + + + + + + + + + + + + + + + + + Initial Deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Initial Deployment

    +

    Initial deployment of Dasharo OVMF firmware on QEMU Q35 does not need any +special actions. QEMU Q35 is an emulated platform, not real hardware.

    +

    Running the Dasharo OVMF is as simple as invoking a QEMU command:

    +
    qemu-system-x86_64 -machine q35,smm=on \
    +    -global driver=cfi.pflash01,property=secure,value=on \
    +    -drive if=pflash,format=raw,unit=0,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd,readonly=on \
    +    -drive if=pflash,format=raw,unit=1,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \
    +    -debugcon file:debug.log -global isa-debugcon.iobase=0x402 \
    +    -global ICH9-LPC.disable_s3=1
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/qemu_q35/overview/index.html b/variants/qemu_q35/overview/index.html new file mode 100644 index 00000000000..e75ecd50e36 --- /dev/null +++ b/variants/qemu_q35/overview/index.html @@ -0,0 +1,5866 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    +
      +
    • Releases - Groups information about all releases.
    • +
    • Building manual - describes how to build Dasharo + (UEFI) for the QEMU Emulator Q35 Machine type.
    • +
    • Test matrix - describes the validation scope used during + the Dasharo firmware validation procedure.
    • +
    • Development - describes information for running Dasharo + OVMF in QEMU Q35 machine and for Dasharo Developers.
    • +
    • Initial deployment - QEMU is an emulation + environment and not real hardware thus firmware deployment is not + applicable.
    • +
    • Firmware update - QEMU is an emulation environment and + not real hardware thus firmware update is not applicable.
    • +
    • Recovery - QEMU is an emulation environment and not a real + hardware thus firmware recovery is not applicable.
    • +
    • Hardware configuration matrix - describes about the + devices emulated by QEMU.
    • +
    +

    Useful documents

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/qemu_q35/recovery/index.html b/variants/qemu_q35/recovery/index.html new file mode 100644 index 00000000000..2d95c9839d3 --- /dev/null +++ b/variants/qemu_q35/recovery/index.html @@ -0,0 +1,5817 @@ + + + + + + + + + + + + + + + + + + Recovery - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Recovery

    +

    The recovery process of Dasharo OVMF firmware on QEMU Q35 does not need any +special actions. QEMU Q35 is an emulated platform, not real hardware, so it +doesn't brick itself.

    +

    If something goes wrong simply rerun the QEMU command:

    +
    qemu-system-x86_64 -machine q35,smm=on \
    +    -global driver=cfi.pflash01,property=secure,value=on \
    +    -drive if=pflash,format=raw,unit=0,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd,readonly=on \
    +    -drive if=pflash,format=raw,unit=1,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \
    +    -debugcon file:debug.log -global isa-debugcon.iobase=0x402 \
    +    -global ICH9-LPC.disable_s3=1
    +
    +

    Or build a debug image, gather the logs in debug.log file

    +
    qemu-system-x86_64 -machine q35,smm=on \
    +    -global driver=cfi.pflash01,property=secure,value=on \
    +    -drive if=pflash,format=raw,unit=0,file=Build/OvmfX64/DEBUG_GCC5/FV/OVMF_CODE.fd,readonly=on \
    +    -drive if=pflash,format=raw,unit=1,file=Build/OvmfX64/DEBUG_GCC5/FV/OVMF_VARS.fd \
    +    -debugcon file:debug.log -global isa-debugcon.iobase=0x402 \
    +    -global ICH9-LPC.disable_s3=1
    +
    +

    and report an issue with attached log.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/qemu_q35/releases/index.html b/variants/qemu_q35/releases/index.html new file mode 100644 index 00000000000..adc0a9cc651 --- /dev/null +++ b/variants/qemu_q35/releases/index.html @@ -0,0 +1,5857 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Release Notes

    +

    Following Release Notes describe status of Open Source Firmware development for +QEMU Q35 (Emulator).

    +

    v0.1.0 - 2023-01-20

    +

    Added

    +
      +
    • Enabled TPM Support.
    • +
    • Secure Boot Support for Q35 machine.
    • +
    • Option to reset Secure Boot keys to defaults.
    • +
    • Dasharo System Features.
    • +
    • Dasharo setup password.
    • +
    • OPAL disk password support.
    • +
    • SATA disk password support.
    • +
    • SMM Feature enabled.
    • +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/qemu_q35/test-matrix/index.html b/variants/qemu_q35/test-matrix/index.html new file mode 100644 index 00000000000..1cd8c28aa08 --- /dev/null +++ b/variants/qemu_q35/test-matrix/index.html @@ -0,0 +1,5968 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Note, that the below-described test scope is used during Dasharo Certification +Procedure for tested platform: QEMU Q35 Machine

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.UEFI compatible interfaceEFIAll
    2.UEFI ShellUSHAll
    3.Display ports and LCD supportDSPDSP001.001
    4.Debian Stable and Ubuntu LTS supportLBTLBT001.001, LBT001.002, LBT002.001, LBT002.002, LBT003.001, LBT003.002, LBT004.001, LBT004.002
    5.Network bootPXEAll
    6.Windows bootingWBTAll
    7.Qubes OS SupportQBSQBS001.001, QBS001.002
    8.CPU statusCPUAll
    9.UEFI Setup passwordPSWAll
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001, TPM002.001 and TPM003.001
    2.Secure Boot supportSBOAll
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/supermicro_x11_lga1151_series/building-manual/index.html b/variants/supermicro_x11_lga1151_series/building-manual/index.html new file mode 100644 index 00000000000..d414bd636d1 --- /dev/null +++ b/variants/supermicro_x11_lga1151_series/building-manual/index.html @@ -0,0 +1,5877 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Supermicro X11 LGA1151 Series - building manual

    +

    Please read the overview page first!

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/supermicro_x11_lga1151_series/faq/index.html b/variants/supermicro_x11_lga1151_series/faq/index.html new file mode 100644 index 00000000000..f6745f8a45a --- /dev/null +++ b/variants/supermicro_x11_lga1151_series/faq/index.html @@ -0,0 +1,5897 @@ + + + + + + + + + + + + + + + + + + FAQ - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    FAQ

    +

    Please read the overview page first!

    +

    How to identify my mainboard model?

    +
    ~# dmidecode -t baseboard
    +# dmidecode 3.0
    +Getting SMBIOS data from sysfs.
    +SMBIOS 3.0 present.
    +
    +Handle 0x0002, DMI type 2, 15 bytes
    +Base Board Information
    +    Manufacturer: Supermicro
    +    Product Name: X11SSH-TF
    +    Version: 1.01
    +    Serial Number: WM123S123456
    +    Asset Tag: To be filled by O.E.M.
    +    Features:
    +        Board is a hosting board
    +        Board is replaceable
    +    Location In Chassis: To be filled by O.E.M.
    +    Chassis Handle: 0x0003
    +    Type: Motherboard
    +    Contained Object Handles: 0
    +
    +Handle 0x0026, DMI type 41, 11 bytes
    +Onboard Device
    +    Reference Designation: ASPEED Video AST2400
    +    Type: Video
    +    Status: Enabled
    +    Type Instance: 1
    +    Bus Address: 0000:03:00.0
    +
    +Handle 0x0027, DMI type 41, 11 bytes
    +Onboard Device
    +    Reference Designation: Intel LAN X550-AT2 #1
    +    Type: Ethernet
    +    Status: Enabled
    +    Type Instance: 1
    +    Bus Address: 0000:04:00.0
    +
    +Handle 0x0028, DMI type 41, 11 bytes
    +Onboard Device
    +    Reference Designation: Intel LAN X550-AT2 #2
    +    Type: Ethernet
    +    Status: Enabled
    +    Type Instance: 2
    +    Bus Address: 0000:04:00.1
    +
    +Handle 0x0029, DMI type 41, 11 bytes
    +Onboard Device
    +    Reference Designation: Avago SAS 3008
    +    Type: SAS Controller
    +    Status: Disabled
    +    Type Instance: 1
    +    Bus Address: 0000:ff:00.0
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/supermicro_x11_lga1151_series/firmware-update/index.html b/variants/supermicro_x11_lga1151_series/firmware-update/index.html new file mode 100644 index 00000000000..70c365cf08a --- /dev/null +++ b/variants/supermicro_x11_lga1151_series/firmware-update/index.html @@ -0,0 +1,5824 @@ + + + + + + + + + + + + + + + + + + Firmware update - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Firmware update

    +

    Please read the overview page first!

    +

    Following documentation describe process of Dasharo open-source firmware +distribution update.

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/supermicro_x11_lga1151_series/hardware-matrix/index.html b/variants/supermicro_x11_lga1151_series/hardware-matrix/index.html new file mode 100644 index 00000000000..b8bc536b01d --- /dev/null +++ b/variants/supermicro_x11_lga1151_series/hardware-matrix/index.html @@ -0,0 +1,5910 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Please read the overview page first!

    +

    The tables below contain information about current components of the testing +environment for Supermicro X11 LGA1151 Series available in 3mdeb testing +laboratory and in hands of community members.

    +

    Supermicro X11SSH-TF (pietrushnic)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel Core iTBD
    CPU Cooler
    GPUN/A
    RAMTBD
    HDDTBD
    SSDTBD
    Flash memoryTBD
    NetworkLocal network wired connection
    Attached devices1. TBD USB stick
    Power SupplyTBD
    Power Control1. Sonoff TBD
    Remote Testing Environment1. RTE TBD
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/supermicro_x11_lga1151_series/initial-deployment/index.html b/variants/supermicro_x11_lga1151_series/initial-deployment/index.html new file mode 100644 index 00000000000..b2b983e01a2 --- /dev/null +++ b/variants/supermicro_x11_lga1151_series/initial-deployment/index.html @@ -0,0 +1,6046 @@ + + + + + + + + + + + + + + + + + + Initial deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Initial deployment

    + +

    We strongly recommend following these official instructions. The official guide +has a lot of collaborative effort put into covering all of the edge cases and +is regularly tested. Following these instructions to the letter without +skipping, reordering or adding any steps will give you a proper Dasharo +installation unless there's a hardware issue. We strongly recommend against +following unofficial guides deviating in any way from the official +instructions.

    +

    If you have trouble with the installation process, ask for help on the official +Dasharo chat channel. There are almost always people +around willing to help with it. Before asking for help, make an attempt to +follow the guide on your own and then ask for help with anything you get stuck +on.

    +

    Hardware preparation

    +

    Please use Supermicro Quick Reference Guide for you mainboard e.g. +X11SSH-TF. +Find JPME2 and change its state to position 2-3, which means ME Manufacturing +Mode enabled.

    +

    + +

    +

    Booting DTS over network

    +

    For seamless and storageless deployment one can use BMC virtual floppy +functionality to mount a floppy image containing iPXE.

    +

    iPXE will allow to boot DTS over network without much effort. The image file +can be downloaded from 3mdeb FTP +server. If you wish to +build the image, please follow instructions in Building iPXE floppy +image section.

    +

    To boot from the iPXE image, please do the following:

    +
      +
    1. Download or + build the iPXE image on your host machine.
    2. +
    3. Log in to the BMC dashboard.
    4. +
    5. +

      Select the floppy image through Browse button:

      +

      + +

      +
    6. +
    7. +

      Upload image to the BMC in the Virtual Media panel, by clicking Upload:

      +

      + +

      +
    8. +
    9. +

      Go to Remote Control -> iKVM/HTML5 and start iKVM/HTML5 remote control + window.

      +
    10. +
    11. Use Power Control -> Set Power On
    12. +
    13. Enter Boot Menu with F11.
    14. +
    15. Select UEFI: ATEN Virtual Floppy 3000, Partition 1.
    16. +
    17. Wait for the embedded menu to show up (it may take up to 30 seconds for the + UEFI protocols to execute during iPXE initialization - proprietary UEFI + banzai...).
    18. +
    19. Choose Dasharo Tools Suite from the menu:
    20. +
    +
    ------------------------ Dasharo Network Boot Menu ------------------------
    +Autoboot (DHCP)
    +Dasharo Tools Suite
    +OS installation (netboot.xyz official server)
    +iPXE Shell
    +
    +

    Vendor BIOS backup

    +

    Please follow DTS backup +guide.

    +

    Installing Dasharo with DTS

    +

    TBD

    +

    Building iPXE floppy image

    +

    To create a floppy disk image for Supermicro BMC Virtual Media, you +will need a Linux OS with docker installed. Then follow steps below:

    +
      +
    1. +

      Compile iPXE (a sample revision has been taken from top of master branch on + 25.01.2023, iPXE unfortunately stopped tagging the code in December 2020). + Following set of commands will embed Dasharo iPXE menu script, enable HTTPS + and EFI image support and provide custom build ID command to ensure build + reproducibility:

      +
        +
      • Clone iPXE repository:
      • +
      +
      git clone https://github.com/ipxe/ipxe.git
      +
      +
      cd ipxe
      +
      +
      git checkout 4bffe0f0d9d0e1496ae5cfb7579e813277c29b0f
      +
      +

      NOTE: As mentioned above this is sample revision since iPXE code is + not tagged.

      +
        +
      • Get Dasharo menu for network booting.
      • +
      +
      wget https://raw.githubusercontent.com/Dasharo/dasharo-blobs/46cc16f6d8f0ed9d057fdd20f15bb89ce5b8d212/dasharo/dasharo.ipxe
      +
      +
        +
      • Modify iPXE build configuration through general.h
      • +
      +
      sed "s|//#define\s*IMAGE_SCRIPT.*|#define IMAGE_SCRIPT|" src/config/general.h > src/config/general.h.tmp
      +mv src/config/general.h.tmp src/config/general.h
      +sed "s|.*DOWNLOAD_PROTO_HTTPS|#define DOWNLOAD_PROTO_HTTPS|g" src/config/general.h > src/config/general.h.tmp
      +mv src/config/general.h.tmp src/config/general.h
      +sed "s|.*IMAGE_EFI|#define IMAGE_EFI|g" src/config/general.h > src/config/general.h.tmp
      +mv src/config/general.h.tmp src/config/general.h
      +
      +
        +
      • Use coreboot-sdk container to build iPXE binry:
      • +
      +
      docker run --rm -it -v $PWD:/home/coreboot/ipxe -w /home/coreboot/ipxe \
      +         coreboot/coreboot-sdk:2022-12-18_3b32af950d /bin/bash
      +
      +
        +
      • Inside container: make sure you use correct cross-toolchain:
      • +
      +
      export CROSS_COMPILE="x86_64-elf-"
      +
      +
        +
      • Inside container: start compailation:
      • +
      +
      make -C src bin-x86_64-efi-sb/ipxe.efi EMBED=$PWD/dasharo.ipxe BUILD_ID_CMD="echo 0x1234567890" \
      +    EXTRA_CFLAGS="-Wno-address-of-packed-member  -m64  -fuse-ld=bfd \
      +    -Wl,--build-id=none -fno-delete-null-pointer-checks -Wlogical-op -march=nocona \
      +    -malign-data=abi -mcmodel=large -mno-red-zone -fno-pic"
      +
      +
    2. +
    3. +

      Exit docker container with exit command.

      +
    4. +
    5. +

      Create image file:

      +
      dd if=/dev/zero of=ipxe.img count=1 bs=1440K
      +
      +
    6. +
    7. +

      Make FAT filesystem on the image file:

      +
      sudo mkfs.fat --mbr=y ipxe.img
      +
      +
    8. +
    9. +

      Mount the image file:

      +
      sudo mount ipxe.img /mnt
      +
      +
    10. +
    11. +

      Copy the iPXE to the mounted image file:

      +
      sudo mkdir -p /mnt/EFI/BOOT/ && \
      +    sudo cp src/bin-x86_64-efi-sb/ipxe.efi /mnt/EFI/BOOT/BOOTX64.EFI
      +
      +
    12. +
    13. +

      Unmount the image file:

      +
      sudo umount /mnt
      +
      +
    14. +
    +

    The resulting ipxe.img file is now ready to be attached as Virtual Media on +Supermicro BMC.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/supermicro_x11_lga1151_series/overview/index.html b/variants/supermicro_x11_lga1151_series/overview/index.html new file mode 100644 index 00000000000..db77cc20c8a --- /dev/null +++ b/variants/supermicro_x11_lga1151_series/overview/index.html @@ -0,0 +1,5902 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    +

    + +

    +

    Supermicro X11 LGA1151 Series are mainboards dedicated for servers and +workstations. Most notable examples of this hardware are +X11SSH-TF and +X11SSH-F. Ideal +motherboard for NAS servers, with a PCIE x16 slot to potentially accommodate a +graphics card.

    +

    To learn more about our motivation for the coreboot port and Dasharo compatible +with Supermicro X11 LGA1151 Series please check references section. +If you want to build, initially deploy, update or recover your setup please +check documentation sections on the left.

    +

    Status

    +

    Dasharo compatible with Supermicro X11 LGA1151 Series is a community-driven +effort. We work on this in our free time, since we have no sponsor for this +project. To address the issue we organize virtual hackathon on Dasharo Matrix +whenever we can. At this point two communinty members are engaged +(collector-ynh with X11SSH-F +and pietrushnic with X11SSH-TF, +we also have X11SSH-TF in 3mdeb lab). Feel free to conact +us if you wan to talk about project status.

    +

    Please note that Dasharo compatilbe with Supermicro X11 LGA1151 Series may work +with various boards from this family, at this stage only X11SSH-F and X11SSH-TF +can be treated as tested. This state can change when we will enter more mature +state with transparent validation results published in Releases +section and hardware configuration matrix used for +testing. We may also consider CPU, DRAM and GPU HCL sections in documentation.

    +

    If you are interested in this project, please consider joining the +community-dirven effort or supporting us in other +way.

    +

    The most advanced code is on development +branch. This code supports only +Dasharo (coreboot+UEFI). Work in progress documentation can be found +here.

    +

    NOTE: We decided to follow divide and conquer strategy, every piece of +contribution which was verified and reviewed will be merged even if that is +just small part of bigger documentation . Otherwise we will never move forward.

    +

    References

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/supermicro_x11_lga1151_series/recovery/index.html b/variants/supermicro_x11_lga1151_series/recovery/index.html new file mode 100644 index 00000000000..52e84d86256 --- /dev/null +++ b/variants/supermicro_x11_lga1151_series/recovery/index.html @@ -0,0 +1,5881 @@ + + + + + + + + + + + + + + + + + + Recovery - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Recovery

    +

    Please read the overview page first!

    +
    +

    BIOS Update through BMC

    +

    Following instruction was tested on:

    +
      +
    • X11SSH-TF v1.01
    • +
    +

    For information how to identify your mainboard model pelase check +faq.

    +

    Following documentation describes the process of recovering hardware from brick +state with through BMC BIOS Update feature. This feature can be used also for +initial deployment and Firmware +Update.

    +

    Requirements

    +

    License activation

    +

    Without active license you can't use BIOS Update feature. License key can be +generated using kasuganosoras +scripts and +entered through BMC web interface (Miscellaneous->Activate License).

    +

    Up to date firmware

    +

    Please make sure you using firmware revision 01.60 +

    + +

    +

    If not please follow IPMI Firmware Update_NEW.pdf instruction from package +that you can download +here.

    +

    Unfortunately most efficient way to interact with proprietary BMC is to use +Supermicro proprietary closed source tools:

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/supermicro_x11_lga1151_series/releases/index.html b/variants/supermicro_x11_lga1151_series/releases/index.html new file mode 100644 index 00000000000..7b623a1faa0 --- /dev/null +++ b/variants/supermicro_x11_lga1151_series/releases/index.html @@ -0,0 +1,5873 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo compatible with Supermicro X11 LGA1151 Series

    +

    Please read the overview page first!

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/supermicro_x11_lga1151_series/test-matrix/index.html b/variants/supermicro_x11_lga1151_series/test-matrix/index.html new file mode 100644 index 00000000000..02e3409fafb --- /dev/null +++ b/variants/supermicro_x11_lga1151_series/test-matrix/index.html @@ -0,0 +1,5847 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix - MSI Z690-A WIFI DDR4

    +

    Please read the overview page first!

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/talos_2/building-manual/index.html b/variants/talos_2/building-manual/index.html new file mode 100644 index 00000000000..19db3dd5fff --- /dev/null +++ b/variants/talos_2/building-manual/index.html @@ -0,0 +1,5907 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Building manual

    +

    Building coreboot

    +

    To build coreboot image, follow the steps below:

    +
      +
    1. +

      Clone the coreboot repository:

      +
      git clone --depth=1 https://github.com/Dasharo/coreboot.git -b raptor-cs_talos-2/rel_v0.7.0
      +
      +
    2. +
    3. +

      Get the submodules:

      +
      cd coreboot
      +git submodule update --init --recursive --checkout
      +
      +
    4. +
    5. +

      Start docker container:

      +
      docker run --rm -it \
      +   -v $PWD:/home/coreboot/coreboot \
      +   -w /home/coreboot/coreboot \
      +   -u "$(id -u):$(id -g)" \
      +   coreboot/coreboot-sdk:0ad5fbd48d /bin/bash
      +
      +
    6. +
    7. +

      Inside of the container, configure and start the build process:

      +
      (docker)cp configs/config.raptor-cs-talos-2 .config
      +(docker)make olddefconfig
      +(docker)make
      +
      +
    8. +
    +

    Building heads

    +
      +
    1. +

      Clone the heads repository:

      +
      git clone --depth=1 https://github.com/Dasharo/heads.git -b raptor-cs_talos-2/release
      +
      +
    2. +
    3. +

      Start docker container:

      +
      cd heads
      +docker run --rm -it -v $PWD:$PWD -w $PWD -u "$(id -u):$(id -g)" 3mdeb/heads-docker:2.4.0 /bin/bash
      +
      +
    4. +
    5. +

      Build:

      +
      make BOARD=talos-2
      +
      +
    6. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/talos_2/conferences/index.html b/variants/talos_2/conferences/index.html new file mode 100644 index 00000000000..07f570867ea --- /dev/null +++ b/variants/talos_2/conferences/index.html @@ -0,0 +1,5893 @@ + + + + + + + + + + + + + + + + + + Conference materials - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/talos_2/firmware-update/index.html b/variants/talos_2/firmware-update/index.html new file mode 100644 index 00000000000..469ce5bc4de --- /dev/null +++ b/variants/talos_2/firmware-update/index.html @@ -0,0 +1,5827 @@ + + + + + + + + + + + + + + + + + + Firmware update - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Firmware update

    +

    The following documentation describes the process of Dasharo open-source firmware +update.

    +
      +
    1. +

      Copy the binaries to the BMC:

      +
      scp build/bootblock.signed.ecc root@<BMC_IP>:/tmp/bootblock.signed.ecc
      +scp build/coreboot.rom.signed.ecc root@<BMC_IP>:/tmp/coreboot.rom.signed.ecc
      +
      +
    2. +
    3. +

      Flash the binaries by replacing the HBB partition (execute from BMC):

      +
      pflash -e -P HBB -p /tmp/bootblock.signed.ecc
      +pflash -e -P HBI -p /tmp/coreboot.rom.signed.ecc
      +
      +
    4. +
    5. +

      Log into the BMC GUI at https://<BMC_IP>.

      +
    6. +
    7. +

      Enter the Server power operations + (https://<BMC_IP>/#/server-control/power-operations) and invoke + warm reboot.

      +
    8. +
    9. +

      Go to Serial over LAN remote console (https://<BMC_IP>/#/server-control/remote-console).

      +
    10. +
    11. +

      Enjoy the updated firmware running on Talos II.

      +
    12. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/talos_2/hardware-matrix/index.html b/variants/talos_2/hardware-matrix/index.html new file mode 100644 index 00000000000..5fc719f122d --- /dev/null +++ b/variants/talos_2/hardware-matrix/index.html @@ -0,0 +1,5946 @@ + + + + + + + + + + + + + + + + + + Hardware configuration matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix

    +

    Introduction

    +

    This document describes the hardware configuration used for validation of the +coreboot port on the Talos II platform.

    +

    Talos II

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    1st CPUIBM POWER9 “Sforza” 02CY650
    CPU Cooler
    2nd CPUIBM POWER9 “Sforza” 02CY650
    CPU Cooler
    SSDIntel 670p 512 GB M26472-201 NVME
    RAMCrucial CT8G4RF88266
    Flash memoryMicron MT25QL512ABB8ESF-0SIT
    NetworkLocal network wired connection
    Attached devices1. SanDisk USB 3.2Gen1 16 GB
    2. Logitech, Inc. Keyboard K120
    Ethernet2x Broadcom BCM5719
    Power SupplyCorsair TX550M
    Power ControlSonoff S20 switch
    Remote ControlOpenBMC
    +
    +

    Note: for single CPU testing the 2nd CPU is dismantled.

    +
    +

    Following RAM configurations were tested and are proved to be properly +initialized.

    +
    MCS0, MCA0
    +   DIMM0: 1Rx4 16GB PC4-2666V-RC2-12-PA0
    +   DIMM1: not installed
    +MCS0, MCA1
    +   DIMM0: 1Rx8 8GB PC4-2666V-RD1-12
    +   DIMM1: not installed
    +MCS1, MCA0
    +   DIMM0: 2Rx4 32GB PC4-2666V-RB2-12-MA0
    +   DIMM1: not installed
    +MCS1, MCA1
    +   DIMM0: 2Rx8 16GB PC4-2666V-RE2-12
    +   DIMM1: not installed
    +
    +

    All 3 major DRAM vendors are supported, namely Samsung, Micron and Hynix.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/talos_2/images/tpm_connected.jpg b/variants/talos_2/images/tpm_connected.jpg new file mode 100644 index 00000000000..a0147f8ea46 Binary files /dev/null and b/variants/talos_2/images/tpm_connected.jpg differ diff --git a/variants/talos_2/images/tpm_square_solder_back.jpg b/variants/talos_2/images/tpm_square_solder_back.jpg new file mode 100644 index 00000000000..2534a7f0823 Binary files /dev/null and b/variants/talos_2/images/tpm_square_solder_back.jpg differ diff --git a/variants/talos_2/images/tpm_square_solder_front.jpg b/variants/talos_2/images/tpm_square_solder_front.jpg new file mode 100644 index 00000000000..d345b0ab924 Binary files /dev/null and b/variants/talos_2/images/tpm_square_solder_front.jpg differ diff --git a/variants/talos_2/initial-deployment/index.html b/variants/talos_2/initial-deployment/index.html new file mode 100644 index 00000000000..2430d546cb1 --- /dev/null +++ b/variants/talos_2/initial-deployment/index.html @@ -0,0 +1,6038 @@ + + + + + + + + + + + + + + + + + + Initial deployment - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Initial deployment

    +

    coreboot installation

    +
      +
    1. +

      Copy the binaries to the BMC + (assuming in the coreboot root directory):

      +
      scp build/bootblock.signed.ecc root@<BMC_IP>:/tmp/bootblock.signed.ecc
      +scp build/coreboot.rom.signed.ecc root@<BMC_IP>:/tmp/coreboot.rom.signed.ecc
      +
      +
      +

      If that file is not present, use coreboot.rom instead

      +
      +
    2. +
    3. +

      Backup the HBB partition (for faster later recovery) by invoking this + command on BMC:

      +
      pflash -P HBB -r /tmp/hbb.bin
      +pflash -P HBI -r /tmp/hbi.bin
      +
      +
    4. +
    5. +

      Flash the binaries by replacing HBB partition (execute from BMC):

      +
      pflash -e -P HBB -p /tmp/bootblock.signed.ecc
      +pflash -e -P HBI -p /tmp/coreboot.rom.signed.ecc
      +
      +
      +

      Again, if that file is not present, use coreboot.rom instead

      +
      +

      Answer yes to the prompt and wait for the process to finish.

      +
    6. +
    7. +

      Log into the BMC GUI again at https://<BMC_IP>.

      +
    8. +
    9. +

      Enter the Server power operations + (https://<BMC_IP>/#/server-control/power-operations) and invoke + warm reboot.

      +
    10. +
    11. +

      Go to Serial over LAN remote console (https://<BMC_IP>/#/server-control/remote-console).

      +
    12. +
    13. +

      Wait for a while until coreboot shows up:

      +

      asciicast

      +
    14. +
    15. +

      Enjoy the coreboot running on Talos II.

      +
    16. +
    +
    +

    Optional: In order to recovery the platform quickly to healthy state, flash +the HBB partition back with: +pflash -e -P HBB -p /tmp/hbb.bin +pflash -e -P HBI -p /tmp/hbi.bin

    +
    +

    Heads installation

    +
      +
    1. +

      Copy the Heads binary to the BMC (assuming in the Heads root directory):

      +
      scp build/zImage.bundled root@<BMC_IP>:/tmp/zImage.bundled
      +
      +
    2. +
    3. +

      Log in to the BMC:

      +
      ssh root@<BMC_IP>
      +
      +
    4. +
    5. +

      Flash the BOOTKERNEL partition with Heads:

      +
      pflash -e -P BOOTKERNEL -p /tmp/zImage.bundled
      +
      +

      Answer yes to the prompt and wait for the process to finish.

      +
    6. +
    7. +

      Log into the BMC GUI at https://<BMC_IP>/.

      +
    8. +
    9. +

      Enter the Server power operations + (https://<BMC_IP>/#/server-control/power-operations) and invoke + warm reboot.

      +
    10. +
    11. +

      Go to Serial over LAN remote console (https://<BMC_IP>/#/server-control/remote-console).

      +
    12. +
    13. +

      Wait for a while until Heads shows up:

      +

      asciicast

      +
    14. +
    15. +

      Enjoy the Heads running on Talos II.

      +
    16. +
    +

    Testing firmware images without flashing

    +

    BMC firmware v2.00+ allows testing new firmware images without flashing the +physical flash device. This makes testing and switching between two versions +(e.g. Hostboot and coreboot) much faster and safer. There are two ways of doing +so, here's a more convenient one that uses mboxctl:

    +
      +
    1. +

      Read original flash:

      +

      For earlier versions of coreboot port it is required to read from system +that booted at least once, since some of the partitions are modified on the +first boot. this is no longer necessary since v0.5.0.

      +
      root@talos:~# pflash -r /tmp/talos.pnor
      +
      +

      This file may also be copied out of BMC to a secure place and serve as a +backup of whole flash contents.

      +
      +

      Keep in mind that tmpfs size is limited and exceeding that limit may +result in unresponsive BMC, which in most severe cases requires hard power +cycle.

      +
      +
    2. +
    3. +

      "Flashing" modified partition(s):

      +

      This is similar to flashing real device with two changes: no need to erase +the flash and target file must be specified. New command looks like this:

      +
      root@talos:~# pflash -f -P <partition> -p <partition>.bin -F /tmp/talos.pnor
      +
      +

      Since the real flash device is not used, backup can be skipped. The rest is +like above:

      +
      # bootblock
      +pflash -f -P HBB -p /tmp/bootblock.signed.ecc -F /tmp/talos.pnor
      +# coreboot
      +pflash -f -P HBI -p /tmp/coreboot.rom.signed.ecc -F /tmp/talos.pnor
      +
      +# Heads
      +pflash -f -P BOOTKERNEL -p /tmp/zImage.bundled -F /tmp/talos.pnor
      +
      +
    4. +
    5. +

      Mount the file as flash device:

      +
      root@talos:~# mboxctl --backend file:/tmp/talos.pnor
      +
      +

      Sometimes this command fails with timeout, in that case repeat it until it +succeeds. Optionally, success can be tested with:

      +
      root@talos:~# mboxctl --lpc-state
      +LPC Bus Maps: BMC Memory
      +
      +

      BMC Memory tells that emulated flash is used instead of real one. Host +doesn't see any difference (except maybe different access times and erase +block size), it still reads and writes PNOR the same way as with physical +device.

      +
    6. +
    7. +

      Start the platform as described in previous sections and test it.

      +
    8. +
    9. +

      To get back to using real PNOR:

      +
      root@talos:~# mboxctl --backend vpnor
      +Failed to post message: Connection timed out
      +root@talos:~# mboxctl --lpc-state
      +LPC Bus Maps: Flash Device
      +
      +

      Even though that command reports failure, it maps LPC back to flash device. +This can be tested with mboxctl --lpc-state.

      +
    10. +
    11. +

      (Optional) Flash tested image to permanent storage:

      +
      root@talos:~# pflash -E -p /tmp/talos.pnor
      +
      +
    12. +
    +

    The other method is described on +Raptor's wiki +and requires starting mboxd manually (still needs BMC firmware v2.00+). It's +worth to take a look there because sometimes mboxd stops working (mboxctl +errors every time) and that page shows how it can be started.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/talos_2/overview/index.html b/variants/talos_2/overview/index.html new file mode 100644 index 00000000000..141319b256c --- /dev/null +++ b/variants/talos_2/overview/index.html @@ -0,0 +1,5867 @@ + + + + + + + + + + + + + + + + + + Overview - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Overview

    +
      +
    • Releases - groups information about all releases.
    • +
    • Building manual - describes how to build Dasharo for + Talos II.
    • +
    • Initial deployment - describes initial Dasharo + deployment methods (i. e. flashing new firmware) for Talos II.
    • +
    • Firmware update - explains supported Dasharo + open-source firmware update methods.
    • +
    • Recovery - gathers information on how to recover the platform + from potential failure.
    • +
    • Hardware configuration matrix - describes the platform's + hardware configuration used during the Dasharo firmware validation + procedure.
    • +
    • Test matrix - describes validation scope used during + Dasharo firmware validation procedure.
    • +
    • Conferences - includes information from various conferences + about POWER architecture support in coreboot.
    • +
    • TPM connections and support - describes the methods of + connecting dedicated TPM module to the board and how to validate it.
    • +
    +

    Useful documents

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/talos_2/recovery/index.html b/variants/talos_2/recovery/index.html new file mode 100644 index 00000000000..eb7ad65151d --- /dev/null +++ b/variants/talos_2/recovery/index.html @@ -0,0 +1,5937 @@ + + + + + + + + + + + + + + + + + + Recovery - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Recovery

    +

    Prequisitions

    +

    To proceed with the recovery procedure the backup with the vendor firmware will +be necessary eg. talos.pnor.

    +

    The backup file should be generated before making any changes in the device flash +chip according to documentation in the first step in +Testing firmware images without flashing +section.

    +

    Flashing using BMC

    +

    Flash firmware by executing the following commands on BMC:

    +
    pflash -E -p /tmp/talos.pnor
    +
    +
      +
    1. +

      Log into the BMC GUI at https://<BMC_IP>.

      +
    2. +
    3. +

      Enter the Server power operations + (https://<BMC_IP>/#/server-control/power-operations) and invoke + warm reboot.

      +
    4. +
    5. +

      After rebooting the vendor firmware will be restored.

      +
    6. +
    +

    Restore Petitboot

    +

    If you want to use Petitboot, and you have already installed system Heads, +follow this procedure:

    +
      +
    1. +

      Download the newest PNOR package from + raptor wiki.

      +
    2. +
    3. +

      Unzip downloaded file and find the talos.pnor file.

      +
    4. +
    5. +

      Copy the file to the BMC:

      +
    6. +
    +
    scp talos.pnor root@<BMC_IP>:/tmp/talos.pnor
    +
    +
      +
    1. Modify partitions by executing the following commands on BMC + (this is not necessary):
    2. +
    +
    pflash -P HBB -p /tmp/bootblock.signed.ecc -F /tmp/talos.pnor
    +pflash -P HBI -p /tmp/coreboot.rom.signed.ecc -F /tmp/talos.pnor
    +
    +
      +
    1. Flash firmware:
    2. +
    +
    pflash -E -p /tmp/talos.pnor
    +
    +
      +
    1. +

      Log into the BMC GUI at https://<BMC_IP>.

      +
    2. +
    3. +

      Enter the Server power operations + (https://<BMC_IP>/#/server-control/power-operations) and invoke + warm reboot.

      +
    4. +
    5. +

      Enjoy the Petitboot running on Talos II.

      +
    6. +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/talos_2/releases/index.html b/variants/talos_2/releases/index.html new file mode 100644 index 00000000000..e9a898feb07 --- /dev/null +++ b/variants/talos_2/releases/index.html @@ -0,0 +1,6079 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Release notes

    +

    Following Release Notes describe status of Open Source Firmware development for +Raptor Computing Systems Talos II

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    +

    Subscribe to Release Newsletter

    +

    +

    Test results for this platform can be found +here.

    +

    v0.7.0 - 2023-07-26

    +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    raptor-cs_talos-2_bootblock_v0.7.0.signed.ecc +sha256 +sha256.sig

    +

    raptor-cs_talos-2_coreboot_v0.7.0.rom.signed.ecc +sha256 +sha256.sig

    +

    raptor-cs_talos-2_zImage_v0.7.0.bundled +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v0.6.0 - 2022-08-26

    +

    Added

    +
      +
    • Optional support for Infineon I2C TPM1 chips
    • +
    • Initial support for measured boot
    • +
    +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    raptor-cs_talos-2_zImage_v0.6.0.bundled +sha256 +sha256.sig

    +

    raptor-cs_talos-2_coreboot_v0.6.0.rom.signed.ecc +sha256 +sha256.sig

    +

    raptor-cs_talos-2_bootblock_v0.6.0.signed.ecc +sha256 +sha256.sig

    +

    See how to verify signatures on this video

    +

    SBOM (Software Bill of Materials)

    + +

    v0.5.0 - 2022-04-12

    +

    Changed

    +
      +
    • Add FSI initialization and functions for accessing devices behind FSI bus
    • +
    • Cache MVPD between stages
    • +
    • Initialize and train XBus links
    • +
    • Change SCOM API to be able to access second CPU
    • +
    • Initialize PCIe, MCS, OCC and TOD for second CPU
    • +
    • Switch to ELF payload, clean up Device Tree generation
    • +
    • Various boot time optimizations
    • +
    +

    Fixed

    + +

    Known issues

    + +

    Binaries

    +

    raptor-cs_talos-2_bootblock_v0.5.0.signed.ecc +sha256 +sha256.sig

    +

    raptor-cs_talos-2_coreboot_v0.5.0.rom.signed.ecc +sha256 +sha256.sig

    +

    Heads was not modified in this release, its binary from previous releases can be +used.

    +

    SBOM (Software Bill of Materials)

    + +

    v0.4.1 - 2022-01-10

    +

    Changed

    +
      +
    • Simplify memlayout
    • +
    • Replace PPC_SHIFT with PPC_PLACE macro
    • +
    • Change SPR numbers definitions to decimal
    • +
    • Print signing output to terminal
    • +
    +

    Fixed

    +
      +
    • Watchdog timing out
    • +
    • Sporadic signing failure due to the tools not being built
    • +
    • Building with cross compiler other than powerpc64-linux-gnu-
    • +
    +

    Known issues

    + +

    Binaries

    +

    dasharo_talos_2_bootblock_v0.4.1.signed.ecc +sha256 +sha256.sig

    +

    dasharo_talos_2_coreboot_v0.4.1.rom.signed.ecc +sha256 +sha256.sig

    +

    dasharo_talos_2_zImage_v0.4.1.bundled +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + +

    v0.4.0 - 2021-10-29

    +

    Added

    +
      +
    • OCC support
    • +
    • XIVE support
    • +
    • PCIe initialization
    • +
    • IPMI block transfer interface
    • +
    • Non-constant nodes in Device Tree are generated programmatically
    • +
    +

    Known issues

    + +

    Binaries

    +

    dasharo_talos_2_bootblock_v0.4.0.signed.ecc +sha256 +sha256.sig

    +

    dasharo_talos_2_coreboot.rom.signed.ecc +sha256 +sha256.sig

    +

    zImage_v0.4.0.bundled +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/talos_2/test-matrix/index.html b/variants/talos_2/test-matrix/index.html new file mode 100644 index 00000000000..7eb136042bc --- /dev/null +++ b/variants/talos_2/test-matrix/index.html @@ -0,0 +1,5957 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.coreboot base portCBPCBP001.001, CBP002.001, CBP004.001
    2.Heads bootloader supportHDSHDS001.001, HDS001.002
    3.Device TreeDVTDVT001.001, DVT002.001
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMTPM001.001 and TPM002.001
    +

    Module: Dasharo performance

    + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.CPU frequency measureCPFCPF001.003
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/talos_2/tpm-support/index.html b/variants/talos_2/tpm-support/index.html new file mode 100644 index 00000000000..de3b7d636f3 --- /dev/null +++ b/variants/talos_2/tpm-support/index.html @@ -0,0 +1,5974 @@ + + + + + + + + + + + + + + + + + + TPM connection and support - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    TPM connections and support

    +

    The following documentation contains most important information about TPM 1.2 +module dedicated to the Talos II mainboard.

    +

    Connecting TPM to the Talos mainboard

    +

    To properly connect TPM to the Talos II mainboard reproduce the following steps:

    +
      +
    1. Turn off the platform by using OpenBMC.
    2. +
    3. Disconnect mainboard from the mains.
    4. +
    5. Based on the + documentation + find TPM connector on the mainboard.
    6. +
    7. +

      Mount TPM module as shown in the graphics below:

      +

      TPM front +TPM back +TPM connected

      +
    8. +
    9. +

      Connect mainboard to the mains.

      +
    10. +
    +

    Additional information, i. e. TPM header pinout, might be found in the +mainboard documentation.

    +

    TPM module testing

    +
      +
    1. Turn on the platform and log into it by using obmc-console-client or KVM.
    2. +
    3. Boot into Heads.
    4. +
    5. Select the Exit to recovery shell option using the arrow keys and Enter.
    6. +
    7. +

      Execute the following command:

      +
      cbmem -L
      +
      +
    8. +
    +

    Output of the above-described command should contains information about TPM +logs.

    +

    Example output:

    +
    TPM2 log:
    +Specification: 2.00
    +Platform class: PC Client
    +No vendor information provided
    +TPM2 log entry 1:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: f78a530fb5a70afcffdc86a98529abd24a90bac9
    +    Event data: FMAP: FMAP
    +TPM2 log entry 2:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: 369155e6eab3b0a874140e591a4c0e992268b4b9
    +    Event data: FMAP: BOOTBLOCK
    +TPM2 log entry 3:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: 5e785c080264aa6e169f70c80ac40b556066292b
    +    Event data: FMAP: COREBOOT CBFS: fallback/romstage
    +TPM2 log entry 4:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: ba2a5af955811fbac58a5198545539596eb38c3e
    +    Event data: FMAP: COREBOOT CBFS: fallback/ramstage
    +TPM2 log entry 5:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: ba35d4ce29d7b633b5644e2a3206c6069cf7f24d
    +    Event data: FMAP: COREBOOT CBFS: fallback/payload
    +TPM2 log entry 6:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA1: 47b49026133377e05193f8440c9a7cad239e883c
    +    Event data: FMAP: COREBOOT CBFS: 1-cpu.dtb
    +TPM2 log entry 7:
    +    PCR: 3
    +    Event type: Action
    +    Digests:
    +         SHA256: 6e7b06693452d997ac534e823b1ea79e5bb8ed19ba8a7af878abf10199c3d515
    +         SHA1: 6e7b06693452d997ac534e823b1ea79e5bb8ed19
    +    Event data: VERSION
    +TPM2 log entry 8:
    +    PCR: 2
    +    Event type: Action
    +    Digests:
    +         SHA256: de73053377e1ae5ba5d2b637a4f5bfaeb410137722f11ef135e7a1be524e3092
    +         SHA1: de73053377e1ae5ba5d2b637a4f5bfaeb4101377
    +    Event data: IMA_CATALOG
    +TPM2 log entry 9:
    +    PCR: 4
    +    Event type: Action
    +    Digests:
    +         SHA256: cd32830f83a4f74b75d7feac6c03bd3ad8d553f54a8cac4b4b5a4b175ccbce3e
    +         SHA1: cd32830f83a4f74b75d7feac6c03bd3ad8d553f5
    +    Event data: BOOTKERNEL
    +
    +

    Additional information

    +

    The Module is available at the official +3mdeb store.

    +

    You can also buy the product by mailing us at: +shopping@3mdeb.com.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/tuxedo_ibs15/building/index.html b/variants/tuxedo_ibs15/building/index.html new file mode 100644 index 00000000000..d714649d653 --- /dev/null +++ b/variants/tuxedo_ibs15/building/index.html @@ -0,0 +1,5908 @@ + + + + + + + + + + + + + + + + + + Building manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo for Tuxedo IBS15 Gen6 - Building manual

    +

    Intro

    +

    This documents describes the procedure for compiling coreboot for Tuxedo IBS15.

    +

    Requirements

    + +

    Procedure

    +

    The easiest way to build coreboot is to use the official Docker image.

    +

    Obtain the image:

    +
    docker pull coreboot/coreboot-sdk:0ad5fbd48d
    +
    +

    Obtain coreboot source code for Tuxedo IBS15:

    +
    git clone https://github.com/Dasharo/coreboot.git
    +
    +

    Navigate to the source code directory and checkout to the desired revision:

    +
    +

    Replace the REVISION with one of the: +- tuxedo_ibs15/release for the latest released version +- tuxedo_ibs15/vVERSION (e.g. v1.0.0) for the given release

    +
    +
    cd coreboot
    +git checkout REVISION
    +git submodule update --init --recursive --checkout
    +
    +
    ./build.sh build
    +
    +

    The resulting coreboot image will be placed in +artifacts/dasharo_tuxedo_ibs15_VERSION.rom.

    +

    Warning: Do not run ./build.sh as root. This command uses docker and should +be executed as your current user. If you're having trouble running build.sh +on your user account, follow the Docker instructions outlined in +Requirements.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/tuxedo_ibs15/hardware-matrix/index.html b/variants/tuxedo_ibs15/hardware-matrix/index.html new file mode 100644 index 00000000000..58f1c314b2d --- /dev/null +++ b/variants/tuxedo_ibs15/hardware-matrix/index.html @@ -0,0 +1,6100 @@ + + + + + + + + + + + + + + + + + + Hardware Configuration Matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Hardware configuration matrix - Tuxedo IBS15

    +

    Introduction

    +

    This document describes the hardware configurations used for validation of the +coreboot port on the Tuxedo IBS15 laptop.

    +

    IBS15 #1

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i5-1135G7
    Internal Cooling
    RAMSlot 1: KVR29S21S6/8
    Slot 2: KVR29S21S6/4
    SSD1. Samsung 980 PRO NVMe 250 GB
    2. Samsung 860 EVO SATA M.2 250 GB
    Flash memoryGigaDevice 25B127DSIG 16 MB
    NetworkLocal network wired connection
    Internal devices1. 1920x1080 15 inch screen
    2. Internal keyboard with LED backlight
    3. Touchpad
    4. Fingerprint scanner
    5. Camera
    6. Audio subsystem
    7. Intel Wi-Fi 6 AX201 wireless card
    Attached devices1. SanDisk Ultra USB 3.0 64 GB
    2. SanDisk Ultra Flair USB 3.0 16 GB
    3. Kingston DataTraveler 3.1Gen1 16 GB
    4. SanDisk Ultra microSD HC I 16 GB + SD Adapter
    5. DELL KB216 USB Keyboard
    6. 4-port USB Type-C Hub Pro
    7. HDMI 1920x1080p Display
    8. Sony MDR-EX15AP headset
    Power SupplyChicony 65 W
    Power ControlN/A
    Remote Testing EnvironmentOpenSSH_8.2p1 OpenSSL 1.1.1f
    +

    IBS15 #2

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ComponentDescription
    CPUIntel(R) Core(TM) i5-11300H
    Internal Cooling
    RAMSlot 1: KVR29S21S6/8
    Slot 2: KVR29S21S6/4
    SSDToshiba KXG50NV256G NVMe 256GB
    Flash memoryGigaDevice 25B127DSIG 16 MB
    NetworkLocal network wired connection
    Internal devices1. 1920x1080 14 inch screen
    2. Internal keyboard with LED backlight
    3. Touchpad
    4. Fingerprint scanner
    5. Camera
    6. Audio subsystem
    7. Intel Wi-Fi 6 AX201 wireless card
    Attached devices1. SanDisk Ultra USB 3.0 64 GB
    2. SanDisk Ultra Flair USB 3.0 16 GB
    3. Kingston DataTraveler 3.1Gen1 16 GB
    4. SanDisk Ultra microSD HC I 16 GB + SD Adapter
    5. DELL KB216 USB Keyboard
    6. 4-port USB Type-C Hub Pro
    7. HDMI 1920x1080p Display
    8. Sony MDR-EX15AP headset
    Power SupplyChicony 65 W
    Power ControlN/A
    Remote Testing EnvironmentOpenSSH_8.2p1 OpenSSL 1.1.1f
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/tuxedo_ibs15/installation/index.html b/variants/tuxedo_ibs15/installation/index.html new file mode 100644 index 00000000000..f3517b5a2cb --- /dev/null +++ b/variants/tuxedo_ibs15/installation/index.html @@ -0,0 +1,5946 @@ + + + + + + + + + + + + + + + + + + Installation manual - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Dasharo for Tuxedo IBS15 Gen6 - Installation manual

    +

    Intro

    +

    Flashing coreboot can be done from Linux using flashrom with the internal +programmer. This document describes the process of building, installing and +running flashrom on Ubuntu 20.04.

    +

    Build flashrom

    +

    Currently, the latest flashrom release lacks support for Tiger Lake-U internal +flashing. Because of this, we need to build flashrom from source.

    +

    Install build dependencies:

    +
    apt install git build-essential debhelper pkg-config libpci-dev libusb-1.0-0-dev libftdi1-dev meson
    +
    +

    Obtain source code:

    +
    git clone https://review.coreboot.org/flashrom.git
    +cd flashrom
    +
    +

    Build flashrom:

    +
    make
    +sudo make install
    +
    +

    Reading flash contents

    +

    To read from the flash and save them to a file (dump.rom), execute the +following command:

    +
    flashrom -p internal -r dump.rom
    +
    +

    Installing Dasharo

    +

    Initial Installation

    +

    During the initial installation of Dasharo, you will need the supported Intel +ME version (and configuration) to be present in the Dasharo firmware image. If +you already have a Dasharo compatible ME firmware installed, then proceed with +Updating Dasharo instructions.

    +
    +

    Publicly released binaries do not contain ME binary. If you need a Dasharo +compatible Intel ME update for your device, contact us via already +established commercial support channel.

    +
    +

    When flashing binaries with ME binary included, flashing of the whole chip is +required. Follow the steps below:

    +
      +
    • Power off the laptop
    • +
    • While holding the Fn+M keys, power on the laptop - This unlocks the ME and + allows for it to be overwritten. The fans will spin at 100% speed at this + point
    • +
    • Execute the following command, replacing [path] with the path to the full + firmware image (containing ME firmware and flash descriptor) you want to + flash:
    • +
    +
    flashrom -p internal -w [full_image]
    +
    +
      +
    • Reboot the laptop
    • +
    • The laptop will boot into Dasharo. After Dasharo has booted, it is safe to + shut down the laptop to silence the fans
    • +
    +
    +

    Note: if you shut down the laptop instead of rebooting, it may be necessary +to hold Fn+M for it to boot the first time after flashing.

    +
    +

    Updating Dasharo

    +

    If Dasharo is currently installed, only the BIOS region of the flash needs to +be updated. Flash it using the following command:

    +
    flashrom -p internal -w [path] --ifd -i bios
    +
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/tuxedo_ibs15/post_install/index.html b/variants/tuxedo_ibs15/post_install/index.html new file mode 100644 index 00000000000..036cbe468fb --- /dev/null +++ b/variants/tuxedo_ibs15/post_install/index.html @@ -0,0 +1,5863 @@ + + + + + + + + + + + + + + + + + + Post-installation setup - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Post-installation setup

    +

    This document contains extra steps to perform after installing Dasharo in order +to enable full functionality.

    +

    Touchpad hotkey enablement (Linux)

    +

    The touchpad hotkey needs extra setup to function correctly under Linux. To +enable the touchpad hotkey to work under Linux, follow the steps below:

    +
      +
    1. Create a file /etc/udev/hwdb.d/60-keyboard.hwdb with the following contents:
    2. +
    +
    evdev:atkbd:dmi:bvn*:bvr*:svnNotebook:pnNS50MU:*
    +        KEYBOARD_KEY_f7=191
    +        KEYBOARD_KEY_f8=191
    +
    +
      +
    1. Execute the following commands:
    2. +
    +
    sudo systemd-hwdb update
    +sudo udevadm trigger
    +
    +

    After executing these steps, it should be possible to enable and disable the +touchpad using the touchpad hotkey (Fn+F1) on the keyboard when using GNOME.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/tuxedo_ibs15/releases/index.html b/variants/tuxedo_ibs15/releases/index.html new file mode 100644 index 00000000000..edee3c2ca42 --- /dev/null +++ b/variants/tuxedo_ibs15/releases/index.html @@ -0,0 +1,5877 @@ + + + + + + + + + + + + + + + + + + Releases - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Tuxedo IBS15 Dasharo Release Notes

    +

    Following Release Notes describe status of Open Source Firmware development for +Tuxedo IBS15

    +

    For details about our release process please read +Dasharo Standard Release Process.

    +

    +

    Subscribe to Tuxedo IBS15 Dasharo Release Newsletter

    +

    +

    Test results for this platform can be found +here.

    +

    v1.0.0 - 2022-03-15

    +

    Added

    +
      +
    • Support for Tuxedo InfinityBook S 15 Gen6
    • +
    • Support for EC firmware 1.07.02
    • +
    • Support for Intel ME version 15.0.30.1776
    • +
    • UEFI Boot Support
    • +
    • Configurable boot order
    • +
    • Configurable boot options
    • +
    • UEFI Secure Boot support
    • +
    • Tuxedo boot logo
    • +
    +

    Known issues

    + +

    Binaries

    +

    tuxedo_ibs15_v1.0.0.rom +sha256 +sha256.sig

    +

    SBOM (Software Bill of Materials)

    + + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/variants/tuxedo_ibs15/test-matrix/index.html b/variants/tuxedo_ibs15/test-matrix/index.html new file mode 100644 index 00000000000..27977a2ba79 --- /dev/null +++ b/variants/tuxedo_ibs15/test-matrix/index.html @@ -0,0 +1,6038 @@ + + + + + + + + + + + + + + + + + + Test matrix - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + + + +

    Test matrix - Tuxedo - Tuxedo IBS15

    +

    About

    +

    The test matrix is used to determine the scope of tests which the DUT is +subjected from before the release of the new binary.

    +

    Module: Dasharo compatibility

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.Memory HCLHCLAll
    2.UEFI compatible interfaceEFIAll
    3.Display ports and LCD supportDSPDSP001.001, DSP001.002, DSP001.003, DSP002.001, DSP002.002, DSP002.003
    4.Embedded Controller and Super I/O initializationECRWithout ECR021.xxx - ECR024.xxx
    5.NVMe supportNVMAll
    6.Custom logoCLGAll
    7.Custom boot menu keyCBKAll
    8.USB HID and MSC SupportUSBAll
    9.Debian Stable and Ubuntu LTS supportLBTLBT003.001, LBT003.002, LBT004.001, LBT004.002
    10.UEFI ShellUSHAll
    11.Windows bootingWBTWBT001.001
    12.Audio subsystemAUDAll
    13.USB-C supportUTCAll
    14.Network bootPXEPXE007.001
    15.M.2 WiFi/BluetoothWLEAll
    16.SD card supportSDCAll
    17.USB Camera verificationCAMAll
    19.Fan speed measureFANFAN001.001
    20.SMBIOSDMIDMI002.001, DMI003.001, DMI005.001, DMI006.001, DMI007.001, DMI008.001
    +

    Module: Dasharo security

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    No.Supported test suiteTest suite IDSupported test cases
    1.TPM SupportTPMWithout TPM001.001 and TPM002.001
    2.Verified Boot supportVBOVBO006.002, VBO007.002,
    3.Measured Boot supportMBOAll
    4.Secure Boot supportSBOWithout SBO006.001, SBO007.001 and SBO008.001
    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file diff --git a/ways-you-can-help-us/index.html b/ways-you-can-help-us/index.html new file mode 100644 index 00000000000..9d50f36ba2c --- /dev/null +++ b/ways-you-can-help-us/index.html @@ -0,0 +1,6099 @@ + + + + + + + + + + + + + + + + + + Ways you can help us - Dasharo Universe + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + + + + + + +
    + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + + + + + + +

    Ways you can help us

    +

    Please consider the following methods to support us if you value what we are +doing.

    +

    Join Dasharo Matrix Community

    +

    We have created Matrix Dasharo Space, an open-source online community, inviting +you to join us. Matrix Dasharo Space is a place where you can find solutions to +many problems, and if not - our community will gladly help you. We encourage you +to troubleshoot your open-source firmware issues there.

    +

    Here is invitation link.

    +

    Inside you will find multiple rooms. The main discussion happens in "Dasharo - +General".

    +

    Join Dasharo open-source firmware vPub

    +

    We encourage you to join us at our vPub parties, which we hold 3-4x / year in +"Dasharo OSF vPub." vPub is an alternative to live meeting for those who can't +or don't want to meet live. It also served as salvation in times of COVID-19. +Our goal is to have a platform for open-source firmware, open-source hardware, +and open instruction set architectures discussion in a casual atmosphere.

    +

    For more information please visit event website.

    +

    Write a Google review

    +

    Google reviews help us attract new customers that can sponsor open-source +development and provide value to the community. Please follow Google review +link.

    +

    Follow us on social media

    + +

    Contribute through Github

    +

    If you have a GitHub account, you can help us in multiple ways:

    + + + + +

    A donation of any amount motivates us because it means you care about our +open-source firmware mission. It is straightforward if you don't have time for +other contributions, and there are multiple options - feel free to choose one +that works for you.

    +

    Become a Dasharo Supporter

    +

    Buy the Dasharo Supporters Entrance subscription if you own/use/buy a machine +running Dasharo firmware:

    + +

    Or buy the hardware including the subscriptions from us, e.g.:

    + +

    As a Dasharo Supporter you will get:

    +
      +
    • The latest Dasharo releases issued by Dasharo Team
    • +
    • Special Dasharo Updates for Supporters – Community receives one update per + year, but Supporters are not limited to it. Number of updates depends on the + number of Dasharo Subscriptions sold and the availability of other funding + (e.g., NLNet, corporate sponsors, community donations).
    • +
    • Dasharo Primer Support through invite-only Matrix channel where we often + gather Supporters opinion and share exciting news about Dasharo direction
    • +
    • Insider's view and influence on Dasharo features roadmap – you can have a + real impact on Dasharo development
    • +
    +

    PayPal

    +

    +
    + + + +
    +

    +

    Transferwise (aka Wise)

    +

    Donations in USD

    +
    TransferWise (ACH/ABA: 026073150)
    +IBAN 8311535451
    +SWIFT: CMFGUS33
    +
    +

    Donations in EUR

    +
    TransferWise Europe SA
    +IBAN: BE11 9672 7712 7548
    +SWIFT: TRWIBEB1XXX
    +
    +

    Bank wire

    +

    Donations in USD

    +
    3mdeb Sp. z o.o
    +IBAN: PL 87 1160 2202 0000 0005 1576 2206
    +SWIFT: BIGBPLPW
    +
    +

    Donations in EUR

    +
    3mdeb Sp. z o.o
    +IBAN: PL 94 1160 2202 0000 0005 1576 1304
    +SWIFT: BIGBPLPW
    +
    +

    BTC and other crypto coins

    +

    Our company does not currently support payment in cryptocurrencies.

    +

    While we understand that cryptocurrencies have gained popularity and recognition +in recent years, we have chosen to retain our focus on conventional payment +channels.

    +

    Firstly, we prioritize financial compliance and adhere to EU regulations. +Managing cryptocurrencies would require extensive knowledge and resources to +ensure compliance, which we are not equipped to handle at our current stage of +development. Moreover, the uncertain and evolving nature of cryptocurrency +regulations introduces significant risks and potential vulnerabilities. These +factors could potentially lead to fiscal audits that could hamper the operations +of 3mdeb and impede the progress of Dasharo development.

    +

    We believe that by adhering to established payment methods, we can ensure a +consistent and reliable payment process for our customers. This allows us to +maintain a high level of security, accountability, and regulatory compliance.

    +

    Technology Commons Trust

    +

    If you are concerned about the privacy of your donation as well as the fact how +we would spend the money, then please consider Technology Commons Trust Open +Firmware Fund.

    +

    Addresses:

    + +

    If you want to contribute to other cryptocurrencies, please visit +OFF website for details about contact +information. We are pretty sure the Technology Commons Trust team will find the +way.

    +

    Open Collective

    +

    You can donate by using +3mdeb's Open Collective page - a legal +and financial tech platform that enables over 300 groups to raise and spend over +$13 million dollars a year in full transparency.

    +

    Purchasing merchandise

    +

    We're excited to offer a range of Dasharo merchandise +products to help support +our open-source firmware distribution project. By purchasing items such as +t-shirts and mugs, you can support Dasharo and help us continue developing and +improving the firmware.

    +

    Our online shop makes browsing and ordering merchandise easy, and we offer fast +shipping to get your items to you quickly. Whether you're looking for a new +t-shirt to wear to events or a mug for your morning coffee, we have various +products. Head over to our shop and browse our selection of Dasharo merchandise!

    +

    Can't see your option?

    +

    Contact us contact@dasharo.com

    +

    For OEM/ODM: Join the private-beta program

    +

    We created Dasharo private beta program for OEM/ODM to improve quality and the +efficiency of platform firmware development and deployment.

    +

    Program benefits:

    +
      +
    • Early access to the Dasharo roadmap reflects the most recent market trends and + covers future hardware support and features.
    • +
    • Early access to information about firmware development funding campaigns.
    • +
    • Early access to source code and release binaries.
    • +
    • Dasharo Tools Suite for seamless integration of value-added features.
    • +
    • Dasharo Marketing Package helps explain the value that Dasharo brings to the + product.
    • +
    • Professional support at all stages of the product life cycle.
    • +
    • Vertical market integration support.
    • +
    +

    How to join? Please send us an email to contact@dasharo.com.

    + + + + + + + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + \ No newline at end of file