Date: Sun, 25 Aug 2013 10:08:59 +0000 (UTC) From: Mark Murray <markm@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r254839 - in projects/random_number_generator: bin/sh contrib/llvm/include/llvm/MC contrib/llvm/lib/MC contrib/llvm/lib/Target/X86/InstPrinter contrib/llvm/tools/lldb/source/Expression ... Message-ID: <201308251008.r7PA8x08092839@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: markm Date: Sun Aug 25 10:08:58 2013 New Revision: 254839 URL: http://svnweb.freebsd.org/changeset/base/254839 Log: MFC Added: projects/random_number_generator/sys/dev/drm2/drm_buffer.c - copied unchanged from r254838, head/sys/dev/drm2/drm_buffer.c projects/random_number_generator/sys/dev/drm2/drm_buffer.h - copied unchanged from r254838, head/sys/dev/drm2/drm_buffer.h projects/random_number_generator/sys/dev/drm2/drm_core.h - copied unchanged from r254838, head/sys/dev/drm2/drm_core.h projects/random_number_generator/sys/dev/drm2/drm_dp_helper.c - copied unchanged from r254838, head/sys/dev/drm2/drm_dp_helper.c projects/random_number_generator/tools/regression/bin/sh/expansion/arith13.0 - copied unchanged from r254838, head/tools/regression/bin/sh/expansion/arith13.0 Modified: projects/random_number_generator/bin/sh/arith_yylex.c projects/random_number_generator/contrib/llvm/include/llvm/MC/MCInstPrinter.h projects/random_number_generator/contrib/llvm/lib/MC/MCInstPrinter.cpp projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp projects/random_number_generator/contrib/llvm/tools/lldb/source/Expression/IRForTarget.cpp projects/random_number_generator/etc/defaults/periodic.conf projects/random_number_generator/share/man/man9/EVENTHANDLER.9 projects/random_number_generator/share/man/man9/pfil.9 projects/random_number_generator/share/man/man9/timeout.9 projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_load.c projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_unload.c projects/random_number_generator/sys/cddl/dev/sdt/sdt.c projects/random_number_generator/sys/dev/cas/if_cas.c projects/random_number_generator/sys/dev/cxgb/cxgb_sge.c projects/random_number_generator/sys/dev/drm2/drmP.h projects/random_number_generator/sys/dev/drm2/drm_crtc.c projects/random_number_generator/sys/dev/drm2/drm_crtc.h projects/random_number_generator/sys/dev/drm2/drm_crtc_helper.h projects/random_number_generator/sys/dev/drm2/drm_dp_helper.h projects/random_number_generator/sys/dev/drm2/drm_dp_iic_helper.c projects/random_number_generator/sys/dev/drm2/drm_drv.c projects/random_number_generator/sys/dev/drm2/drm_edid.c projects/random_number_generator/sys/dev/drm2/drm_gem.c projects/random_number_generator/sys/dev/drm2/drm_gem_names.c projects/random_number_generator/sys/dev/drm2/i915/intel_crt.c projects/random_number_generator/sys/dev/drm2/i915/intel_display.c projects/random_number_generator/sys/dev/drm2/i915/intel_dp.c projects/random_number_generator/sys/dev/drm2/i915/intel_drv.h projects/random_number_generator/sys/dev/drm2/i915/intel_hdmi.c projects/random_number_generator/sys/dev/drm2/i915/intel_lvds.c projects/random_number_generator/sys/dev/drm2/i915/intel_panel.c projects/random_number_generator/sys/dev/drm2/i915/intel_sdvo.c projects/random_number_generator/sys/dev/drm2/i915/intel_tv.c projects/random_number_generator/sys/dev/e1000/if_igb.c projects/random_number_generator/sys/dev/fdc/fdc.c projects/random_number_generator/sys/dev/hatm/if_hatm_intr.c projects/random_number_generator/sys/dev/hwpmc/hwpmc_core.c projects/random_number_generator/sys/dev/hwpmc/hwpmc_mod.c projects/random_number_generator/sys/dev/hwpmc/pmc_events.h projects/random_number_generator/sys/dev/iscsi_initiator/isc_soc.c projects/random_number_generator/sys/dev/ixgbe/ixgbe.c projects/random_number_generator/sys/dev/ixgbe/ixv.c projects/random_number_generator/sys/dev/jme/if_jme.c projects/random_number_generator/sys/dev/lge/if_lge.c projects/random_number_generator/sys/dev/mwl/if_mwl.c projects/random_number_generator/sys/dev/nfe/if_nfe.c projects/random_number_generator/sys/dev/patm/if_patm.c projects/random_number_generator/sys/dev/patm/if_patm_tx.c projects/random_number_generator/sys/dev/qlxgb/qla_hw.c projects/random_number_generator/sys/dev/sfxge/sfxge_rx.c projects/random_number_generator/sys/dev/usb/controller/dwc_otg.c projects/random_number_generator/sys/dev/usb/controller/musb_otg.c projects/random_number_generator/sys/kern/kern_linker.c projects/random_number_generator/sys/kern/kern_mbuf.c projects/random_number_generator/sys/kern/kern_physio.c projects/random_number_generator/sys/kern/link_elf.c projects/random_number_generator/sys/kern/subr_mbpool.c projects/random_number_generator/sys/kern/subr_taskqueue.c projects/random_number_generator/sys/kern/uipc_cow.c projects/random_number_generator/sys/kern/uipc_mbuf.c projects/random_number_generator/sys/kern/uipc_syscalls.c projects/random_number_generator/sys/modules/drm2/drm2/Makefile projects/random_number_generator/sys/modules/vmware/vmxnet3/Makefile projects/random_number_generator/sys/net/if.h projects/random_number_generator/sys/net/if_fddisubr.c projects/random_number_generator/sys/net/if_iso88025subr.c projects/random_number_generator/sys/net/if_llatbl.h projects/random_number_generator/sys/netinet/igmp.c projects/random_number_generator/sys/netinet/ip_input.c projects/random_number_generator/sys/netinet/sctp_input.c projects/random_number_generator/sys/netinet6/ip6_output.c projects/random_number_generator/sys/netinet6/mld6.c projects/random_number_generator/sys/netinet6/sctp6_usrreq.c projects/random_number_generator/sys/ofed/drivers/net/mlx4/en_frag.c projects/random_number_generator/sys/sys/eventhandler.h projects/random_number_generator/sys/sys/mbpool.h projects/random_number_generator/sys/sys/mbuf.h projects/random_number_generator/sys/sys/pmckern.h projects/random_number_generator/sys/sys/sf_buf.h projects/random_number_generator/usr.sbin/periodic/periodic.sh Directory Properties: projects/random_number_generator/ (props changed) projects/random_number_generator/contrib/llvm/ (props changed) projects/random_number_generator/sys/ (props changed) projects/random_number_generator/sys/cddl/contrib/opensolaris/ (props changed) Modified: projects/random_number_generator/bin/sh/arith_yylex.c ============================================================================== --- projects/random_number_generator/bin/sh/arith_yylex.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/bin/sh/arith_yylex.c Sun Aug 25 10:08:58 2013 (r254839) @@ -218,9 +218,13 @@ checkeqcur: value += ARITH_REM - '%'; goto checkeq; case '+': + if (buf[1] == '+') + return ARITH_BAD; value += ARITH_ADD - '+'; goto checkeq; case '-': + if (buf[1] == '-') + return ARITH_BAD; value += ARITH_SUB - '-'; goto checkeq; case '~': Modified: projects/random_number_generator/contrib/llvm/include/llvm/MC/MCInstPrinter.h ============================================================================== --- projects/random_number_generator/contrib/llvm/include/llvm/MC/MCInstPrinter.h Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/contrib/llvm/include/llvm/MC/MCInstPrinter.h Sun Aug 25 10:08:58 2013 (r254839) @@ -21,6 +21,13 @@ class MCInstrInfo; class MCRegisterInfo; class StringRef; +namespace HexStyle { + enum Style { + C, ///< 0xff + Asm ///< 0ffh + }; +} + /// MCInstPrinter - This is an instance of a target assembly language printer /// that converts an MCInst to valid target assembly syntax. class MCInstPrinter { @@ -42,13 +49,16 @@ protected: /// True if we are printing immediates as hex. bool PrintImmHex; + /// Which style to use for printing hexadecimal values. + HexStyle::Style PrintHexStyle; + /// Utility function for printing annotations. void printAnnotation(raw_ostream &OS, StringRef Annot); public: MCInstPrinter(const MCAsmInfo &mai, const MCInstrInfo &mii, const MCRegisterInfo &mri) : CommentStream(0), MAI(mai), MII(mii), MRI(mri), AvailableFeatures(0), - UseMarkup(0), PrintImmHex(0) {} + UseMarkup(0), PrintImmHex(0), PrintHexStyle(HexStyle::C) {} virtual ~MCInstPrinter(); @@ -80,8 +90,16 @@ public: bool getPrintImmHex() const { return PrintImmHex; } void setPrintImmHex(bool Value) { PrintImmHex = Value; } + HexStyle::Style getPrintHexStyleHex() const { return PrintHexStyle; } + void setPrintImmHex(HexStyle::Style Value) { PrintHexStyle = Value; } + /// Utility function to print immediates in decimal or hex. - format_object1<int64_t> formatImm(const int64_t Value) const; + format_object1<int64_t> formatImm(const int64_t Value) const { return PrintImmHex ? formatHex(Value) : formatDec(Value); } + + /// Utility functions to print decimal/hexadecimal values. + format_object1<int64_t> formatDec(const int64_t Value) const; + format_object1<int64_t> formatHex(const int64_t Value) const; + format_object1<uint64_t> formatHex(const uint64_t Value) const; }; } // namespace llvm Modified: projects/random_number_generator/contrib/llvm/lib/MC/MCInstPrinter.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/lib/MC/MCInstPrinter.cpp Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/contrib/llvm/lib/MC/MCInstPrinter.cpp Sun Aug 25 10:08:58 2013 (r254839) @@ -52,10 +52,53 @@ StringRef MCInstPrinter::markup(StringRe return b; } -/// Utility function to print immediates in decimal or hex. -format_object1<int64_t> MCInstPrinter::formatImm(const int64_t Value) const { - if (getPrintImmHex()) - return format("0x%" PRIx64, Value); - else - return format("%" PRId64, Value); +// For asm-style hex (e.g. 0ffh) the first digit always has to be a number. +static bool needsLeadingZero(uint64_t Value) +{ + while(Value) + { + uint64_t digit = (Value >> 60) & 0xf; + if (digit != 0) + return (digit >= 0xa); + Value <<= 4; + } + return false; +} + +format_object1<int64_t> MCInstPrinter::formatDec(const int64_t Value) const { + return format("%" PRId64, Value); +} + +format_object1<int64_t> MCInstPrinter::formatHex(const int64_t Value) const { + switch(PrintHexStyle) { + case HexStyle::C: + if (Value < 0) + return format("-0x%" PRIx64, -Value); + else + return format("0x%" PRIx64, Value); + case HexStyle::Asm: + if (Value < 0) { + if (needsLeadingZero((uint64_t)(-Value))) + return format("-0%" PRIx64 "h", -Value); + else + return format("-%" PRIx64 "h", -Value); + } else { + if (needsLeadingZero((uint64_t)(Value))) + return format("0%" PRIx64 "h", Value); + else + return format("%" PRIx64 "h", Value); + } + } +} + +format_object1<uint64_t> MCInstPrinter::formatHex(const uint64_t Value) const { + switch(PrintHexStyle) { + case HexStyle::C: + return format("0x%" PRIx64, Value); + case HexStyle::Asm: + if (needsLeadingZero(Value)) + return format("0%" PRIx64 "h", Value); + else + return format("%" PRIx64 "h", Value); + } } Modified: projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86ATTInstPrinter.cpp Sun Aug 25 10:08:58 2013 (r254839) @@ -139,8 +139,7 @@ void X86ATTInstPrinter::printPCRelImm(co const MCConstantExpr *BranchTarget = dyn_cast<MCConstantExpr>(Op.getExpr()); int64_t Address; if (BranchTarget && BranchTarget->EvaluateAsAbsolute(Address)) { - O << "0x"; - O.write_hex(Address); + O << formatHex((uint64_t)Address); } else { // Otherwise, just print the expression. Modified: projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/contrib/llvm/lib/Target/X86/InstPrinter/X86IntelInstPrinter.cpp Sun Aug 25 10:08:58 2013 (r254839) @@ -119,7 +119,7 @@ void X86IntelInstPrinter::printPCRelImm( raw_ostream &O) { const MCOperand &Op = MI->getOperand(OpNo); if (Op.isImm()) - O << Op.getImm(); + O << formatImm(Op.getImm()); else { assert(Op.isExpr() && "unknown pcrel immediate operand"); // If a symbolic branch target was added as a constant expression then print @@ -127,8 +127,7 @@ void X86IntelInstPrinter::printPCRelImm( const MCConstantExpr *BranchTarget = dyn_cast<MCConstantExpr>(Op.getExpr()); int64_t Address; if (BranchTarget && BranchTarget->EvaluateAsAbsolute(Address)) { - O << "0x"; - O.write_hex(Address); + O << formatHex((uint64_t)Address); } else { // Otherwise, just print the expression. @@ -148,7 +147,7 @@ void X86IntelInstPrinter::printOperand(c if (Op.isReg()) { PrintRegName(O, getRegisterName(Op.getReg())); } else if (Op.isImm()) { - O << Op.getImm(); + O << formatImm((int64_t)Op.getImm()); } else { assert(Op.isExpr() && "unknown operand kind in printOperand"); O << *Op.getExpr(); @@ -200,7 +199,7 @@ void X86IntelInstPrinter::printMemRefere DispVal = -DispVal; } } - O << DispVal; + O << formatImm(DispVal); } } Modified: projects/random_number_generator/contrib/llvm/tools/lldb/source/Expression/IRForTarget.cpp ============================================================================== --- projects/random_number_generator/contrib/llvm/tools/lldb/source/Expression/IRForTarget.cpp Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/contrib/llvm/tools/lldb/source/Expression/IRForTarget.cpp Sun Aug 25 10:08:58 2013 (r254839) @@ -356,20 +356,6 @@ IRForTarget::ResolveFunctionPointers(llv if (value_ptr) *value_ptr = value; - - // If we are replacing a function with the nobuiltin attribute, it may - // be called with the builtin attribute on call sites. Remove any such - // attributes since it's illegal to have a builtin call to something - // other than a nobuiltin function. - if (fun->hasFnAttribute(Attribute::NoBuiltin)) { - Attribute builtin = Attribute::get(fun->getContext(), Attribute::Builtin); - - for (auto u = fun->use_begin(), e = fun->use_end(); u != e; ++u) { - if (auto call = dyn_cast<CallInst>(*u)) { - call->removeAttribute(AttributeSet::FunctionIndex, builtin); - } - } - } fun->replaceAllUsesWith(value); } Modified: projects/random_number_generator/etc/defaults/periodic.conf ============================================================================== --- projects/random_number_generator/etc/defaults/periodic.conf Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/etc/defaults/periodic.conf Sun Aug 25 10:08:58 2013 (r254839) @@ -166,7 +166,6 @@ daily_local="/etc/daily.local" # Loca # 450.status-security above. daily_status_security_inline="NO" # Run inline ? daily_status_security_output="root" # user or /file -daily_status_security_noamd="NO" # Don't check amd mounts daily_status_security_logdir="/var/log" # Directory for logs daily_status_security_diff_flags="-b -u" # flags for diff output @@ -180,6 +179,7 @@ daily_status_security_neggrpperm_enable= daily_status_security_chkmounts_enable="YES" #daily_status_security_chkmounts_ignore="^amd:" # Don't check matching # FS types +daily_status_security_noamd="NO" # Don't check amd mounts # 300.chkuid0 daily_status_security_chkuid0_enable="YES" Modified: projects/random_number_generator/share/man/man9/EVENTHANDLER.9 ============================================================================== --- projects/random_number_generator/share/man/man9/EVENTHANDLER.9 Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/share/man/man9/EVENTHANDLER.9 Sun Aug 25 10:08:58 2013 (r254839) @@ -202,6 +202,8 @@ Callbacks invoked when a BPF listener at .It Vt kld_load Callbacks invoked after a linker file has been loaded. .It Vt kld_unload +Callbacks invoked after a linker file has been successfully unloaded. +.It Vt kld_unload_try Callbacks invoked before a linker file is about to be unloaded. These callbacks may be used to return an error and prevent the unload from proceeding. Modified: projects/random_number_generator/share/man/man9/pfil.9 ============================================================================== --- projects/random_number_generator/share/man/man9/pfil.9 Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/share/man/man9/pfil.9 Sun Aug 25 10:08:58 2013 (r254839) @@ -71,6 +71,7 @@ typedef int (*pfil_func_t)(void *arg, st .Fn pfil_wlock "struct pfil_head *" .Ft void .Fn pfil_wunlock "struct pfil_head *" +.Ed .Sh DESCRIPTION The .Nm @@ -241,8 +242,7 @@ Fine-grained locking was added in lock export was added in .Fx 10.0 . .Sh BUGS -The -.Fn When a +When a .Vt pfil_head is being modified, no traffic is diverted (to avoid deadlock). Modified: projects/random_number_generator/share/man/man9/timeout.9 ============================================================================== --- projects/random_number_generator/share/man/man9/timeout.9 Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/share/man/man9/timeout.9 Sun Aug 25 10:08:58 2013 (r254839) @@ -256,7 +256,7 @@ after the callout function returns. .Pp The .Fn callout_init_rw -and the +and the .Fn callout_init_rm fuctions serve the need of using rwlocks and rmlocks in conjunction with callouts. Modified: projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c ============================================================================== --- projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c Sun Aug 25 10:08:58 2013 (r254839) @@ -242,7 +242,7 @@ int dtrace_in_probe; /* non-zero if exe uintptr_t dtrace_in_probe_addr; /* Address of invop when already in probe */ #endif static eventhandler_tag dtrace_kld_load_tag; -static eventhandler_tag dtrace_kld_unload_tag; +static eventhandler_tag dtrace_kld_unload_try_tag; #endif /* @@ -15351,7 +15351,7 @@ dtrace_kld_load(void *arg __unused, link } static void -dtrace_kld_unload(void *arg __unused, linker_file_t lf, int *error) +dtrace_kld_unload_try(void *arg __unused, linker_file_t lf, int *error) { if (*error != 0) Modified: projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_load.c ============================================================================== --- projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_load.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_load.c Sun Aug 25 10:08:58 2013 (r254839) @@ -59,8 +59,8 @@ dtrace_load(void *dummy) /* Register callbacks for linker file load and unload events. */ dtrace_kld_load_tag = EVENTHANDLER_REGISTER(kld_load, dtrace_kld_load, NULL, EVENTHANDLER_PRI_ANY); - dtrace_kld_unload_tag = EVENTHANDLER_REGISTER(kld_unload, - dtrace_kld_unload, NULL, EVENTHANDLER_PRI_ANY); + dtrace_kld_unload_try_tag = EVENTHANDLER_REGISTER(kld_unload_try, + dtrace_kld_unload_try, NULL, EVENTHANDLER_PRI_ANY); /* * Initialise the mutexes without 'witness' because the dtrace Modified: projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_unload.c ============================================================================== --- projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_unload.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/cddl/dev/dtrace/dtrace_unload.c Sun Aug 25 10:08:58 2013 (r254839) @@ -68,7 +68,7 @@ dtrace_unload() dtrace_provider = NULL; EVENTHANDLER_DEREGISTER(kld_load, dtrace_kld_load_tag); - EVENTHANDLER_DEREGISTER(kld_unload, dtrace_kld_unload_tag); + EVENTHANDLER_DEREGISTER(kld_unload_try, dtrace_kld_unload_try_tag); if ((state = dtrace_anon_grab()) != NULL) { /* Modified: projects/random_number_generator/sys/cddl/dev/sdt/sdt.c ============================================================================== --- projects/random_number_generator/sys/cddl/dev/sdt/sdt.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/cddl/dev/sdt/sdt.c Sun Aug 25 10:08:58 2013 (r254839) @@ -59,7 +59,7 @@ static int sdt_unload(void *); static void sdt_create_provider(struct sdt_provider *); static void sdt_create_probe(struct sdt_probe *); static void sdt_kld_load(void *, struct linker_file *); -static void sdt_kld_unload(void *, struct linker_file *, int *); +static void sdt_kld_unload_try(void *, struct linker_file *, int *); static MALLOC_DEFINE(M_SDT, "SDT", "DTrace SDT providers"); @@ -95,7 +95,7 @@ static struct cdev *sdt_cdev; static TAILQ_HEAD(, sdt_provider) sdt_prov_list; eventhandler_tag sdt_kld_load_tag; -eventhandler_tag sdt_kld_unload_tag; +eventhandler_tag sdt_kld_unload_try_tag; static void sdt_create_provider(struct sdt_provider *prov) @@ -264,7 +264,7 @@ sdt_kld_load(void *arg __unused, struct } static void -sdt_kld_unload(void *arg __unused, struct linker_file *lf, int *error __unused) +sdt_kld_unload_try(void *arg __unused, struct linker_file *lf, int *error __unused) { struct sdt_provider *prov, **curr, **begin, **end, *tmp; @@ -319,8 +319,8 @@ sdt_load(void *arg __unused) sdt_kld_load_tag = EVENTHANDLER_REGISTER(kld_load, sdt_kld_load, NULL, EVENTHANDLER_PRI_ANY); - sdt_kld_unload_tag = EVENTHANDLER_REGISTER(kld_unload, sdt_kld_unload, - NULL, EVENTHANDLER_PRI_ANY); + sdt_kld_unload_try_tag = EVENTHANDLER_REGISTER(kld_unload_try, + sdt_kld_unload_try, NULL, EVENTHANDLER_PRI_ANY); /* Pick up probes from the kernel and already-loaded linker files. */ linker_file_foreach(sdt_linker_file_cb, NULL); @@ -332,7 +332,7 @@ sdt_unload(void *arg __unused) struct sdt_provider *prov, *tmp; EVENTHANDLER_DEREGISTER(kld_load, sdt_kld_load_tag); - EVENTHANDLER_DEREGISTER(kld_unload, sdt_kld_unload_tag); + EVENTHANDLER_DEREGISTER(kld_unload_try, sdt_kld_unload_try_tag); sdt_probe_func = sdt_probe_stub; Modified: projects/random_number_generator/sys/dev/cas/if_cas.c ============================================================================== --- projects/random_number_generator/sys/dev/cas/if_cas.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/cas/if_cas.c Sun Aug 25 10:08:58 2013 (r254839) @@ -132,7 +132,7 @@ static void cas_detach(struct cas_softc static int cas_disable_rx(struct cas_softc *sc); static int cas_disable_tx(struct cas_softc *sc); static void cas_eint(struct cas_softc *sc, u_int status); -static void cas_free(void *arg1, void* arg2); +static void cas_free(struct mbuf *m, void *arg1, void* arg2); static void cas_init(void *xsc); static void cas_init_locked(struct cas_softc *sc); static void cas_init_regs(struct cas_softc *sc); @@ -1888,7 +1888,7 @@ cas_rint(struct cas_softc *sc) } static void -cas_free(void *arg1, void *arg2) +cas_free(struct mbuf *m, void *arg1, void *arg2) { struct cas_rxdsoft *rxds; struct cas_softc *sc; Modified: projects/random_number_generator/sys/dev/cxgb/cxgb_sge.c ============================================================================== --- projects/random_number_generator/sys/dev/cxgb/cxgb_sge.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/cxgb/cxgb_sge.c Sun Aug 25 10:08:58 2013 (r254839) @@ -1470,9 +1470,9 @@ t3_encap(struct sge_qset *qs, struct mbu hdr->len = htonl(mlen | 0x80000000); if (__predict_false(mlen < TCPPKTHDRSIZE)) { - printf("mbuf=%p,len=%d,tso_segsz=%d,csum_flags=%#x,flags=%#x", + printf("mbuf=%p,len=%d,tso_segsz=%d,csum_flags=%b,flags=%#x", m0, mlen, m0->m_pkthdr.tso_segsz, - m0->m_pkthdr.csum_flags, m0->m_flags); + (int)m0->m_pkthdr.csum_flags, CSUM_BITS, m0->m_flags); panic("tx tso packet too small"); } @@ -2634,7 +2634,6 @@ t3_rx_eth(struct adapter *adap, struct m } m->m_pkthdr.rcvif = ifp; - m->m_pkthdr.header = mtod(m, uint8_t *) + sizeof(*cpl) + ethpad; /* * adjust after conversion to mbuf chain */ Modified: projects/random_number_generator/sys/dev/drm2/drmP.h ============================================================================== --- projects/random_number_generator/sys/dev/drm2/drmP.h Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/drm2/drmP.h Sun Aug 25 10:08:58 2013 (r254839) @@ -317,6 +317,9 @@ typedef int8_t s8; #define DRM_HZ hz #define DRM_UDELAY(udelay) DELAY(udelay) +#define DRM_MDELAY(msecs) do { int loops = (msecs); \ + while (loops--) DELAY(1000); \ + } while (0) #define DRM_TIME_SLICE (hz/20) /* Time slice for GLXContexts */ #define DRM_GET_PRIV_SAREA(_dev, _ctx, _map) do { \ @@ -695,6 +698,7 @@ struct drm_gem_object { struct drm_driver_info { int (*load)(struct drm_device *, unsigned long flags); + int (*use_msi)(struct drm_device *, unsigned long flags); int (*firstopen)(struct drm_device *); int (*open)(struct drm_device *, struct drm_file *); void (*preclose)(struct drm_device *, struct drm_file *file_priv); @@ -733,6 +737,8 @@ struct drm_driver_info { int (*gem_init_object)(struct drm_gem_object *obj); void (*gem_free_object)(struct drm_gem_object *obj); + int (*gem_open_object)(struct drm_gem_object *, struct drm_file *); + void (*gem_close_object)(struct drm_gem_object *, struct drm_file *); struct cdev_pager_ops *gem_pager_ops; @@ -826,8 +832,10 @@ struct drm_device { struct drm_driver_info *driver; drm_pci_id_list_t *id_entry; /* PCI ID, name, and chipset private */ - u_int16_t pci_device; /* PCI device id */ - u_int16_t pci_vendor; /* PCI vendor id */ + uint16_t pci_device; /* PCI device id */ + uint16_t pci_vendor; /* PCI vendor id */ + uint16_t pci_subdevice; /* PCI subsystem device id */ + uint16_t pci_subvendor; /* PCI subsystem vendor id */ char *unique; /* Unique identifier: e.g., busid */ int unique_len; /* Length of unique field */ @@ -907,7 +915,7 @@ struct drm_device { struct drm_minor *control; /**< Control node for card */ struct drm_minor *primary; /**< render type primary screen head */ - void *drm_ttm_bo; + void *drm_ttm_bdev; struct unrhdr *drw_unrhdr; /* RB tree of drawable infos */ RB_HEAD(drawable_tree, bsd_drm_drawable_info) drw_head; @@ -1408,5 +1416,10 @@ do { \ #define KTR_DRM KTR_DEV #define KTR_DRM_REG KTR_SPARE3 +/* Error codes conversion from Linux to FreeBSD. */ +/* XXXKIB what is the right code for EREMOTEIO on FreeBSD? */ +#define EREMOTEIO ENXIO +#define ERESTARTSYS ERESTART + #endif /* __KERNEL__ */ #endif /* _DRM_P_H_ */ Copied: projects/random_number_generator/sys/dev/drm2/drm_buffer.c (from r254838, head/sys/dev/drm2/drm_buffer.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/dev/drm2/drm_buffer.c Sun Aug 25 10:08:58 2013 (r254839, copy of r254838, head/sys/dev/drm2/drm_buffer.c) @@ -0,0 +1,183 @@ +/************************************************************************** + * + * Copyright 2010 Pauli Nieminen. + * All Rights Reserved. + * + * 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, sub license, 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 (including the + * next paragraph) 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS 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. + * + * + **************************************************************************/ +/* + * Multipart buffer for coping data which is larger than the page size. + * + * Authors: + * Pauli Nieminen <suokkos-at-gmail-dot-com> + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <dev/drm2/drm_buffer.h> + +/** + * Allocate the drm buffer object. + * + * buf: Pointer to a pointer where the object is stored. + * size: The number of bytes to allocate. + */ +int drm_buffer_alloc(struct drm_buffer **buf, int size) +{ + int nr_pages = size / PAGE_SIZE + 1; + int idx; + + /* Allocating pointer table to end of structure makes drm_buffer + * variable sized */ + *buf = malloc(sizeof(struct drm_buffer) + nr_pages*sizeof(char *), + DRM_MEM_DRIVER, M_ZERO | M_WAITOK); + + if (*buf == NULL) { + DRM_ERROR("Failed to allocate drm buffer object to hold" + " %d bytes in %d pages.\n", + size, nr_pages); + return -ENOMEM; + } + + (*buf)->size = size; + + for (idx = 0; idx < nr_pages; ++idx) { + + (*buf)->data[idx] = + malloc(min(PAGE_SIZE, size - idx * PAGE_SIZE), + DRM_MEM_DRIVER, M_WAITOK); + + + if ((*buf)->data[idx] == NULL) { + DRM_ERROR("Failed to allocate %dth page for drm" + " buffer with %d bytes and %d pages.\n", + idx + 1, size, nr_pages); + goto error_out; + } + + } + + return 0; + +error_out: + + /* Only last element can be null pointer so check for it first. */ + if ((*buf)->data[idx]) + free((*buf)->data[idx], DRM_MEM_DRIVER); + + for (--idx; idx >= 0; --idx) + free((*buf)->data[idx], DRM_MEM_DRIVER); + + free(*buf, DRM_MEM_DRIVER); + return -ENOMEM; +} + +/** + * Copy the user data to the begin of the buffer and reset the processing + * iterator. + * + * user_data: A pointer the data that is copied to the buffer. + * size: The Number of bytes to copy. + */ +int drm_buffer_copy_from_user(struct drm_buffer *buf, + void __user *user_data, int size) +{ + int nr_pages = size / PAGE_SIZE + 1; + int idx; + + if (size > buf->size) { + DRM_ERROR("Requesting to copy %d bytes to a drm buffer with" + " %d bytes space\n", + size, buf->size); + return -EFAULT; + } + + for (idx = 0; idx < nr_pages; ++idx) { + + if (DRM_COPY_FROM_USER(buf->data[idx], + (char *)user_data + idx * PAGE_SIZE, + min(PAGE_SIZE, size - idx * PAGE_SIZE))) { + DRM_ERROR("Failed to copy user data (%p) to drm buffer" + " (%p) %dth page.\n", + user_data, buf, idx); + return -EFAULT; + + } + } + buf->iterator = 0; + return 0; +} + +/** + * Free the drm buffer object + */ +void drm_buffer_free(struct drm_buffer *buf) +{ + + if (buf != NULL) { + + int nr_pages = buf->size / PAGE_SIZE + 1; + int idx; + for (idx = 0; idx < nr_pages; ++idx) + free(buf->data[idx], DRM_MEM_DRIVER); + + free(buf, DRM_MEM_DRIVER); + } +} + +/** + * Read an object from buffer that may be split to multiple parts. If object + * is not split function just returns the pointer to object in buffer. But in + * case of split object data is copied to given stack object that is suplied + * by caller. + * + * The processing location of the buffer is also advanced to the next byte + * after the object. + * + * objsize: The size of the objet in bytes. + * stack_obj: A pointer to a memory location where object can be copied. + */ +void *drm_buffer_read_object(struct drm_buffer *buf, + int objsize, void *stack_obj) +{ + int idx = drm_buffer_index(buf); + int page = drm_buffer_page(buf); + void *obj = NULL; + + if (idx + objsize <= PAGE_SIZE) { + obj = &buf->data[page][idx]; + } else { + /* The object is split which forces copy to temporary object.*/ + int beginsz = PAGE_SIZE - idx; + memcpy(stack_obj, &buf->data[page][idx], beginsz); + + memcpy((char *)stack_obj + beginsz, &buf->data[page + 1][0], + objsize - beginsz); + + obj = stack_obj; + } + + drm_buffer_advance(buf, objsize); + return obj; +} Copied: projects/random_number_generator/sys/dev/drm2/drm_buffer.h (from r254838, head/sys/dev/drm2/drm_buffer.h) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/dev/drm2/drm_buffer.h Sun Aug 25 10:08:58 2013 (r254839, copy of r254838, head/sys/dev/drm2/drm_buffer.h) @@ -0,0 +1,151 @@ +/************************************************************************** + * + * Copyright 2010 Pauli Nieminen. + * All Rights Reserved. + * + * 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, sub license, 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 (including the + * next paragraph) 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS 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. + * + * + **************************************************************************/ +/* + * Multipart buffer for coping data which is larger than the page size. + * + * Authors: + * Pauli Nieminen <suokkos-at-gmail-dot-com> + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#ifndef _DRM_BUFFER_H_ +#define _DRM_BUFFER_H_ + +#include <dev/drm2/drmP.h> + +struct drm_buffer { + int iterator; + int size; + char *data[]; +}; + + +/** + * Return the index of page that buffer is currently pointing at. + */ +static inline int drm_buffer_page(struct drm_buffer *buf) +{ + return buf->iterator / PAGE_SIZE; +} +/** + * Return the index of the current byte in the page + */ +static inline int drm_buffer_index(struct drm_buffer *buf) +{ + return buf->iterator & (PAGE_SIZE - 1); +} +/** + * Return number of bytes that is left to process + */ +static inline int drm_buffer_unprocessed(struct drm_buffer *buf) +{ + return buf->size - buf->iterator; +} + +/** + * Advance the buffer iterator number of bytes that is given. + */ +static inline void drm_buffer_advance(struct drm_buffer *buf, int bytes) +{ + buf->iterator += bytes; +} + +/** + * Allocate the drm buffer object. + * + * buf: A pointer to a pointer where the object is stored. + * size: The number of bytes to allocate. + */ +extern int drm_buffer_alloc(struct drm_buffer **buf, int size); + +/** + * Copy the user data to the begin of the buffer and reset the processing + * iterator. + * + * user_data: A pointer the data that is copied to the buffer. + * size: The Number of bytes to copy. + */ +extern int drm_buffer_copy_from_user(struct drm_buffer *buf, + void __user *user_data, int size); + +/** + * Free the drm buffer object + */ +extern void drm_buffer_free(struct drm_buffer *buf); + +/** + * Read an object from buffer that may be split to multiple parts. If object + * is not split function just returns the pointer to object in buffer. But in + * case of split object data is copied to given stack object that is suplied + * by caller. + * + * The processing location of the buffer is also advanced to the next byte + * after the object. + * + * objsize: The size of the objet in bytes. + * stack_obj: A pointer to a memory location where object can be copied. + */ +extern void *drm_buffer_read_object(struct drm_buffer *buf, + int objsize, void *stack_obj); + +/** + * Returns the pointer to the dword which is offset number of elements from the + * current processing location. + * + * Caller must make sure that dword is not split in the buffer. This + * requirement is easily met if all the sizes of objects in buffer are + * multiples of dword and PAGE_SIZE is multiple dword. + * + * Call to this function doesn't change the processing location. + * + * offset: The index of the dword relative to the internat iterator. + */ +static inline void *drm_buffer_pointer_to_dword(struct drm_buffer *buffer, + int offset) +{ + int iter = buffer->iterator + offset * 4; + return &buffer->data[iter / PAGE_SIZE][iter & (PAGE_SIZE - 1)]; +} +/** + * Returns the pointer to the dword which is offset number of elements from + * the current processing location. + * + * Call to this function doesn't change the processing location. + * + * offset: The index of the byte relative to the internat iterator. + */ +static inline void *drm_buffer_pointer_to_byte(struct drm_buffer *buffer, + int offset) +{ + int iter = buffer->iterator + offset; + return &buffer->data[iter / PAGE_SIZE][iter & (PAGE_SIZE - 1)]; +} + +#endif Copied: projects/random_number_generator/sys/dev/drm2/drm_core.h (from r254838, head/sys/dev/drm2/drm_core.h) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/dev/drm2/drm_core.h Sun Aug 25 10:08:58 2013 (r254839, copy of r254838, head/sys/dev/drm2/drm_core.h) @@ -0,0 +1,38 @@ +/* + * Copyright 2004 Jon Smirl <jonsmirl@gmail.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, sub license, + * 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 (including the + * next paragraph) 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 NON-INFRINGEMENT. IN NO EVENT SHALL + * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS 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. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#define CORE_AUTHOR "Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl" + +#define CORE_NAME "drm" +#define CORE_DESC "DRM shared core routines" +#define CORE_DATE "20060810" + +#define DRM_IF_MAJOR 1 +#define DRM_IF_MINOR 4 + +#define CORE_MAJOR 1 +#define CORE_MINOR 1 +#define CORE_PATCHLEVEL 0 Modified: projects/random_number_generator/sys/dev/drm2/drm_crtc.c ============================================================================== --- projects/random_number_generator/sys/dev/drm2/drm_crtc.c Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/drm2/drm_crtc.c Sun Aug 25 10:08:58 2013 (r254839) @@ -170,6 +170,9 @@ static struct drm_prop_enum_list drm_enc { DRM_MODE_ENCODER_TVDAC, "TV" }, }; +static void drm_property_destroy_blob(struct drm_device *dev, + struct drm_property_blob *blob); + char *drm_get_encoder_name(struct drm_encoder *encoder) { static char buf[32]; @@ -520,6 +523,8 @@ void drm_connector_cleanup(struct drm_co drm_mode_remove(connector, mode); sx_xlock(&dev->mode_config.mutex); + if (connector->edid_blob_ptr) + drm_property_destroy_blob(dev, connector->edid_blob_ptr); drm_mode_object_put(dev, &connector->base); list_del(&connector->head); dev->mode_config.num_connector--; Modified: projects/random_number_generator/sys/dev/drm2/drm_crtc.h ============================================================================== --- projects/random_number_generator/sys/dev/drm2/drm_crtc.h Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/drm2/drm_crtc.h Sun Aug 25 10:08:58 2013 (r254839) @@ -659,7 +659,7 @@ struct drm_mode_config { int min_width, min_height; int max_width, max_height; - struct drm_mode_config_funcs *funcs; + const struct drm_mode_config_funcs *funcs; resource_size_t fb_base; /* output poll support */ Modified: projects/random_number_generator/sys/dev/drm2/drm_crtc_helper.h ============================================================================== --- projects/random_number_generator/sys/dev/drm2/drm_crtc_helper.h Sun Aug 25 10:04:10 2013 (r254838) +++ projects/random_number_generator/sys/dev/drm2/drm_crtc_helper.h Sun Aug 25 10:08:58 2013 (r254839) @@ -51,7 +51,7 @@ struct drm_crtc_helper_funcs { /* Provider can fixup or change mode timings before modeset occurs */ bool (*mode_fixup)(struct drm_crtc *crtc, - struct drm_display_mode *mode, + const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode); /* Actually set the mode */ int (*mode_set)(struct drm_crtc *crtc, struct drm_display_mode *mode, @@ -78,7 +78,7 @@ struct drm_encoder_helper_funcs { void (*restore)(struct drm_encoder *encoder); bool (*mode_fixup)(struct drm_encoder *encoder, - struct drm_display_mode *mode, + const struct drm_display_mode *mode, struct drm_display_mode *adjusted_mode); void (*prepare)(struct drm_encoder *encoder); void (*commit)(struct drm_encoder *encoder); Copied: projects/random_number_generator/sys/dev/drm2/drm_dp_helper.c (from r254838, head/sys/dev/drm2/drm_dp_helper.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/random_number_generator/sys/dev/drm2/drm_dp_helper.c Sun Aug 25 10:08:58 2013 (r254839, copy of r254838, head/sys/dev/drm2/drm_dp_helper.c) @@ -0,0 +1,147 @@ +/* + * Copyright © 2009 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, 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. + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include <dev/drm2/drmP.h> +#include <dev/drm2/drm_dp_helper.h> + +/** + * DOC: dp helpers + * + * These functions contain some common logic and helpers at various abstraction + * levels to deal with Display Port sink devices and related things like DP aux + * channel transfers, EDID reading over DP aux channels, decoding certain DPCD + * blocks, ... + */ + +static u8 dp_link_status(u8 link_status[DP_LINK_STATUS_SIZE], int r) +{ + return link_status[r - DP_LANE0_1_STATUS]; +} + +static u8 dp_get_lane_status(u8 link_status[DP_LINK_STATUS_SIZE], + int lane) +{ + int i = DP_LANE0_1_STATUS + (lane >> 1); + int s = (lane & 1) * 4; + u8 l = dp_link_status(link_status, i); + return (l >> s) & 0xf; +} + +bool drm_dp_channel_eq_ok(u8 link_status[DP_LINK_STATUS_SIZE], + int lane_count) +{ + u8 lane_align; + u8 lane_status; + int lane; + + lane_align = dp_link_status(link_status, + DP_LANE_ALIGN_STATUS_UPDATED); + if ((lane_align & DP_INTERLANE_ALIGN_DONE) == 0) + return false; + for (lane = 0; lane < lane_count; lane++) { + lane_status = dp_get_lane_status(link_status, lane); + if ((lane_status & DP_CHANNEL_EQ_BITS) != DP_CHANNEL_EQ_BITS) + return false; + } + return true; +} + +bool drm_dp_clock_recovery_ok(u8 link_status[DP_LINK_STATUS_SIZE], + int lane_count) +{ + int lane; + u8 lane_status; + + for (lane = 0; lane < lane_count; lane++) { + lane_status = dp_get_lane_status(link_status, lane); + if ((lane_status & DP_LANE_CR_DONE) == 0) + return false; + } + return true; +} + +u8 drm_dp_get_adjust_request_voltage(u8 link_status[DP_LINK_STATUS_SIZE], + int lane) +{ + int i = DP_ADJUST_REQUEST_LANE0_1 + (lane >> 1); + int s = ((lane & 1) ? + DP_ADJUST_VOLTAGE_SWING_LANE1_SHIFT : + DP_ADJUST_VOLTAGE_SWING_LANE0_SHIFT); + u8 l = dp_link_status(link_status, i); + + return ((l >> s) & 0x3) << DP_TRAIN_VOLTAGE_SWING_SHIFT; +} + +u8 drm_dp_get_adjust_request_pre_emphasis(u8 link_status[DP_LINK_STATUS_SIZE], + int lane) +{ + int i = DP_ADJUST_REQUEST_LANE0_1 + (lane >> 1); + int s = ((lane & 1) ? + DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT : + DP_ADJUST_PRE_EMPHASIS_LANE0_SHIFT); *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201308251008.r7PA8x08092839>