radeon_connectors.c 67 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022
  1. /*
  2. * Copyright 2007-8 Advanced Micro Devices, Inc.
  3. * Copyright 2008 Red Hat Inc.
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a
  6. * copy of this software and associated documentation files (the "Software"),
  7. * to deal in the Software without restriction, including without limitation
  8. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. * and/or sell copies of the Software, and to permit persons to whom the
  10. * Software is furnished to do so, subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be included in
  13. * all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  19. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  20. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21. * OTHER DEALINGS IN THE SOFTWARE.
  22. *
  23. * Authors: Dave Airlie
  24. * Alex Deucher
  25. */
  26. #include "drmP.h"
  27. #include "drm_edid.h"
  28. #include "drm_crtc_helper.h"
  29. #include "drm_fb_helper.h"
  30. #include "radeon_drm.h"
  31. #include "radeon.h"
  32. #include "atom.h"
  33. extern void
  34. radeon_combios_connected_scratch_regs(struct drm_connector *connector,
  35. struct drm_encoder *encoder,
  36. bool connected);
  37. extern void
  38. radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
  39. struct drm_encoder *encoder,
  40. bool connected);
  41. extern void
  42. radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,
  43. struct drm_connector *drm_connector);
  44. void radeon_connector_hotplug(struct drm_connector *connector)
  45. {
  46. struct drm_device *dev = connector->dev;
  47. struct radeon_device *rdev = dev->dev_private;
  48. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  49. /* bail if the connector does not have hpd pin, e.g.,
  50. * VGA, TV, etc.
  51. */
  52. if (radeon_connector->hpd.hpd == RADEON_HPD_NONE)
  53. return;
  54. radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
  55. /* if the connector is already off, don't turn it back on */
  56. if (connector->dpms != DRM_MODE_DPMS_ON)
  57. return;
  58. /* just deal with DP (not eDP) here. */
  59. if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
  60. struct radeon_connector_atom_dig *dig_connector =
  61. radeon_connector->con_priv;
  62. /* if existing sink type was not DP no need to retrain */
  63. if (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_DISPLAYPORT)
  64. return;
  65. /* first get sink type as it may be reset after (un)plug */
  66. dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
  67. /* don't do anything if sink is not display port, i.e.,
  68. * passive dp->(dvi|hdmi) adaptor
  69. */
  70. if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
  71. int saved_dpms = connector->dpms;
  72. /* Only turn off the display if it's physically disconnected */
  73. if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
  74. drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
  75. } else if (radeon_dp_needs_link_train(radeon_connector)) {
  76. /* set it to OFF so that drm_helper_connector_dpms()
  77. * won't return immediately since the current state
  78. * is ON at this point.
  79. */
  80. connector->dpms = DRM_MODE_DPMS_OFF;
  81. drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
  82. }
  83. connector->dpms = saved_dpms;
  84. }
  85. }
  86. }
  87. static void radeon_property_change_mode(struct drm_encoder *encoder)
  88. {
  89. struct drm_crtc *crtc = encoder->crtc;
  90. if (crtc && crtc->enabled) {
  91. drm_crtc_helper_set_mode(crtc, &crtc->mode,
  92. crtc->x, crtc->y, crtc->fb);
  93. }
  94. }
  95. int radeon_get_monitor_bpc(struct drm_connector *connector)
  96. {
  97. struct drm_device *dev = connector->dev;
  98. struct radeon_device *rdev = dev->dev_private;
  99. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  100. struct radeon_connector_atom_dig *dig_connector;
  101. int bpc = 8;
  102. switch (connector->connector_type) {
  103. case DRM_MODE_CONNECTOR_DVII:
  104. case DRM_MODE_CONNECTOR_HDMIB:
  105. if (radeon_connector->use_digital) {
  106. if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
  107. if (connector->display_info.bpc)
  108. bpc = connector->display_info.bpc;
  109. }
  110. }
  111. break;
  112. case DRM_MODE_CONNECTOR_DVID:
  113. case DRM_MODE_CONNECTOR_HDMIA:
  114. if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
  115. if (connector->display_info.bpc)
  116. bpc = connector->display_info.bpc;
  117. }
  118. break;
  119. case DRM_MODE_CONNECTOR_DisplayPort:
  120. dig_connector = radeon_connector->con_priv;
  121. if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
  122. (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) ||
  123. drm_detect_hdmi_monitor(radeon_connector->edid)) {
  124. if (connector->display_info.bpc)
  125. bpc = connector->display_info.bpc;
  126. }
  127. break;
  128. case DRM_MODE_CONNECTOR_eDP:
  129. case DRM_MODE_CONNECTOR_LVDS:
  130. if (connector->display_info.bpc)
  131. bpc = connector->display_info.bpc;
  132. else if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {
  133. struct drm_connector_helper_funcs *connector_funcs =
  134. connector->helper_private;
  135. struct drm_encoder *encoder = connector_funcs->best_encoder(connector);
  136. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  137. struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
  138. if (dig->lcd_misc & ATOM_PANEL_MISC_V13_6BIT_PER_COLOR)
  139. bpc = 6;
  140. else if (dig->lcd_misc & ATOM_PANEL_MISC_V13_8BIT_PER_COLOR)
  141. bpc = 8;
  142. }
  143. break;
  144. }
  145. return bpc;
  146. }
  147. static void
  148. radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status)
  149. {
  150. struct drm_device *dev = connector->dev;
  151. struct radeon_device *rdev = dev->dev_private;
  152. struct drm_encoder *best_encoder = NULL;
  153. struct drm_encoder *encoder = NULL;
  154. struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
  155. struct drm_mode_object *obj;
  156. bool connected;
  157. int i;
  158. best_encoder = connector_funcs->best_encoder(connector);
  159. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  160. if (connector->encoder_ids[i] == 0)
  161. break;
  162. obj = drm_mode_object_find(connector->dev,
  163. connector->encoder_ids[i],
  164. DRM_MODE_OBJECT_ENCODER);
  165. if (!obj)
  166. continue;
  167. encoder = obj_to_encoder(obj);
  168. if ((encoder == best_encoder) && (status == connector_status_connected))
  169. connected = true;
  170. else
  171. connected = false;
  172. if (rdev->is_atom_bios)
  173. radeon_atombios_connected_scratch_regs(connector, encoder, connected);
  174. else
  175. radeon_combios_connected_scratch_regs(connector, encoder, connected);
  176. }
  177. }
  178. struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)
  179. {
  180. struct drm_mode_object *obj;
  181. struct drm_encoder *encoder;
  182. int i;
  183. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  184. if (connector->encoder_ids[i] == 0)
  185. break;
  186. obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
  187. if (!obj)
  188. continue;
  189. encoder = obj_to_encoder(obj);
  190. if (encoder->encoder_type == encoder_type)
  191. return encoder;
  192. }
  193. return NULL;
  194. }
  195. struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
  196. {
  197. int enc_id = connector->encoder_ids[0];
  198. struct drm_mode_object *obj;
  199. struct drm_encoder *encoder;
  200. /* pick the encoder ids */
  201. if (enc_id) {
  202. obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
  203. if (!obj)
  204. return NULL;
  205. encoder = obj_to_encoder(obj);
  206. return encoder;
  207. }
  208. return NULL;
  209. }
  210. /*
  211. * radeon_connector_analog_encoder_conflict_solve
  212. * - search for other connectors sharing this encoder
  213. * if priority is true, then set them disconnected if this is connected
  214. * if priority is false, set us disconnected if they are connected
  215. */
  216. static enum drm_connector_status
  217. radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
  218. struct drm_encoder *encoder,
  219. enum drm_connector_status current_status,
  220. bool priority)
  221. {
  222. struct drm_device *dev = connector->dev;
  223. struct drm_connector *conflict;
  224. struct radeon_connector *radeon_conflict;
  225. int i;
  226. list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
  227. if (conflict == connector)
  228. continue;
  229. radeon_conflict = to_radeon_connector(conflict);
  230. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  231. if (conflict->encoder_ids[i] == 0)
  232. break;
  233. /* if the IDs match */
  234. if (conflict->encoder_ids[i] == encoder->base.id) {
  235. if (conflict->status != connector_status_connected)
  236. continue;
  237. if (radeon_conflict->use_digital)
  238. continue;
  239. if (priority == true) {
  240. DRM_DEBUG_KMS("1: conflicting encoders switching off %s\n", drm_get_connector_name(conflict));
  241. DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(connector));
  242. conflict->status = connector_status_disconnected;
  243. radeon_connector_update_scratch_regs(conflict, connector_status_disconnected);
  244. } else {
  245. DRM_DEBUG_KMS("2: conflicting encoders switching off %s\n", drm_get_connector_name(connector));
  246. DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(conflict));
  247. current_status = connector_status_disconnected;
  248. }
  249. break;
  250. }
  251. }
  252. }
  253. return current_status;
  254. }
  255. static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encoder)
  256. {
  257. struct drm_device *dev = encoder->dev;
  258. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  259. struct drm_display_mode *mode = NULL;
  260. struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
  261. if (native_mode->hdisplay != 0 &&
  262. native_mode->vdisplay != 0 &&
  263. native_mode->clock != 0) {
  264. mode = drm_mode_duplicate(dev, native_mode);
  265. mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
  266. drm_mode_set_name(mode);
  267. DRM_DEBUG_KMS("Adding native panel mode %s\n", mode->name);
  268. } else if (native_mode->hdisplay != 0 &&
  269. native_mode->vdisplay != 0) {
  270. /* mac laptops without an edid */
  271. /* Note that this is not necessarily the exact panel mode,
  272. * but an approximation based on the cvt formula. For these
  273. * systems we should ideally read the mode info out of the
  274. * registers or add a mode table, but this works and is much
  275. * simpler.
  276. */
  277. mode = drm_cvt_mode(dev, native_mode->hdisplay, native_mode->vdisplay, 60, true, false, false);
  278. mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
  279. DRM_DEBUG_KMS("Adding cvt approximation of native panel mode %s\n", mode->name);
  280. }
  281. return mode;
  282. }
  283. static void radeon_add_common_modes(struct drm_encoder *encoder, struct drm_connector *connector)
  284. {
  285. struct drm_device *dev = encoder->dev;
  286. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  287. struct drm_display_mode *mode = NULL;
  288. struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
  289. int i;
  290. struct mode_size {
  291. int w;
  292. int h;
  293. } common_modes[17] = {
  294. { 640, 480},
  295. { 720, 480},
  296. { 800, 600},
  297. { 848, 480},
  298. {1024, 768},
  299. {1152, 768},
  300. {1280, 720},
  301. {1280, 800},
  302. {1280, 854},
  303. {1280, 960},
  304. {1280, 1024},
  305. {1440, 900},
  306. {1400, 1050},
  307. {1680, 1050},
  308. {1600, 1200},
  309. {1920, 1080},
  310. {1920, 1200}
  311. };
  312. for (i = 0; i < 17; i++) {
  313. if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT)) {
  314. if (common_modes[i].w > 1024 ||
  315. common_modes[i].h > 768)
  316. continue;
  317. }
  318. if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
  319. if (common_modes[i].w > native_mode->hdisplay ||
  320. common_modes[i].h > native_mode->vdisplay ||
  321. (common_modes[i].w == native_mode->hdisplay &&
  322. common_modes[i].h == native_mode->vdisplay))
  323. continue;
  324. }
  325. if (common_modes[i].w < 320 || common_modes[i].h < 200)
  326. continue;
  327. mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false);
  328. drm_mode_probed_add(connector, mode);
  329. }
  330. }
  331. int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property,
  332. uint64_t val)
  333. {
  334. struct drm_device *dev = connector->dev;
  335. struct radeon_device *rdev = dev->dev_private;
  336. struct drm_encoder *encoder;
  337. struct radeon_encoder *radeon_encoder;
  338. if (property == rdev->mode_info.coherent_mode_property) {
  339. struct radeon_encoder_atom_dig *dig;
  340. bool new_coherent_mode;
  341. /* need to find digital encoder on connector */
  342. encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
  343. if (!encoder)
  344. return 0;
  345. radeon_encoder = to_radeon_encoder(encoder);
  346. if (!radeon_encoder->enc_priv)
  347. return 0;
  348. dig = radeon_encoder->enc_priv;
  349. new_coherent_mode = val ? true : false;
  350. if (dig->coherent_mode != new_coherent_mode) {
  351. dig->coherent_mode = new_coherent_mode;
  352. radeon_property_change_mode(&radeon_encoder->base);
  353. }
  354. }
  355. if (property == rdev->mode_info.underscan_property) {
  356. /* need to find digital encoder on connector */
  357. encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
  358. if (!encoder)
  359. return 0;
  360. radeon_encoder = to_radeon_encoder(encoder);
  361. if (radeon_encoder->underscan_type != val) {
  362. radeon_encoder->underscan_type = val;
  363. radeon_property_change_mode(&radeon_encoder->base);
  364. }
  365. }
  366. if (property == rdev->mode_info.underscan_hborder_property) {
  367. /* need to find digital encoder on connector */
  368. encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
  369. if (!encoder)
  370. return 0;
  371. radeon_encoder = to_radeon_encoder(encoder);
  372. if (radeon_encoder->underscan_hborder != val) {
  373. radeon_encoder->underscan_hborder = val;
  374. radeon_property_change_mode(&radeon_encoder->base);
  375. }
  376. }
  377. if (property == rdev->mode_info.underscan_vborder_property) {
  378. /* need to find digital encoder on connector */
  379. encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
  380. if (!encoder)
  381. return 0;
  382. radeon_encoder = to_radeon_encoder(encoder);
  383. if (radeon_encoder->underscan_vborder != val) {
  384. radeon_encoder->underscan_vborder = val;
  385. radeon_property_change_mode(&radeon_encoder->base);
  386. }
  387. }
  388. if (property == rdev->mode_info.tv_std_property) {
  389. encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC);
  390. if (!encoder) {
  391. encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_DAC);
  392. }
  393. if (!encoder)
  394. return 0;
  395. radeon_encoder = to_radeon_encoder(encoder);
  396. if (!radeon_encoder->enc_priv)
  397. return 0;
  398. if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom) {
  399. struct radeon_encoder_atom_dac *dac_int;
  400. dac_int = radeon_encoder->enc_priv;
  401. dac_int->tv_std = val;
  402. } else {
  403. struct radeon_encoder_tv_dac *dac_int;
  404. dac_int = radeon_encoder->enc_priv;
  405. dac_int->tv_std = val;
  406. }
  407. radeon_property_change_mode(&radeon_encoder->base);
  408. }
  409. if (property == rdev->mode_info.load_detect_property) {
  410. struct radeon_connector *radeon_connector =
  411. to_radeon_connector(connector);
  412. if (val == 0)
  413. radeon_connector->dac_load_detect = false;
  414. else
  415. radeon_connector->dac_load_detect = true;
  416. }
  417. if (property == rdev->mode_info.tmds_pll_property) {
  418. struct radeon_encoder_int_tmds *tmds = NULL;
  419. bool ret = false;
  420. /* need to find digital encoder on connector */
  421. encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
  422. if (!encoder)
  423. return 0;
  424. radeon_encoder = to_radeon_encoder(encoder);
  425. tmds = radeon_encoder->enc_priv;
  426. if (!tmds)
  427. return 0;
  428. if (val == 0) {
  429. if (rdev->is_atom_bios)
  430. ret = radeon_atombios_get_tmds_info(radeon_encoder, tmds);
  431. else
  432. ret = radeon_legacy_get_tmds_info_from_combios(radeon_encoder, tmds);
  433. }
  434. if (val == 1 || ret == false) {
  435. radeon_legacy_get_tmds_info_from_table(radeon_encoder, tmds);
  436. }
  437. radeon_property_change_mode(&radeon_encoder->base);
  438. }
  439. return 0;
  440. }
  441. static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
  442. struct drm_connector *connector)
  443. {
  444. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  445. struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
  446. struct drm_display_mode *t, *mode;
  447. /* If the EDID preferred mode doesn't match the native mode, use it */
  448. list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
  449. if (mode->type & DRM_MODE_TYPE_PREFERRED) {
  450. if (mode->hdisplay != native_mode->hdisplay ||
  451. mode->vdisplay != native_mode->vdisplay)
  452. memcpy(native_mode, mode, sizeof(*mode));
  453. }
  454. }
  455. /* Try to get native mode details from EDID if necessary */
  456. if (!native_mode->clock) {
  457. list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
  458. if (mode->hdisplay == native_mode->hdisplay &&
  459. mode->vdisplay == native_mode->vdisplay) {
  460. *native_mode = *mode;
  461. drm_mode_set_crtcinfo(native_mode, CRTC_INTERLACE_HALVE_V);
  462. DRM_DEBUG_KMS("Determined LVDS native mode details from EDID\n");
  463. break;
  464. }
  465. }
  466. }
  467. if (!native_mode->clock) {
  468. DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n");
  469. radeon_encoder->rmx_type = RMX_OFF;
  470. }
  471. }
  472. static int radeon_lvds_get_modes(struct drm_connector *connector)
  473. {
  474. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  475. struct drm_encoder *encoder;
  476. int ret = 0;
  477. struct drm_display_mode *mode;
  478. if (radeon_connector->ddc_bus) {
  479. ret = radeon_ddc_get_modes(radeon_connector);
  480. if (ret > 0) {
  481. encoder = radeon_best_single_encoder(connector);
  482. if (encoder) {
  483. radeon_fixup_lvds_native_mode(encoder, connector);
  484. /* add scaled modes */
  485. radeon_add_common_modes(encoder, connector);
  486. }
  487. return ret;
  488. }
  489. }
  490. encoder = radeon_best_single_encoder(connector);
  491. if (!encoder)
  492. return 0;
  493. /* we have no EDID modes */
  494. mode = radeon_fp_native_mode(encoder);
  495. if (mode) {
  496. ret = 1;
  497. drm_mode_probed_add(connector, mode);
  498. /* add the width/height from vbios tables if available */
  499. connector->display_info.width_mm = mode->width_mm;
  500. connector->display_info.height_mm = mode->height_mm;
  501. /* add scaled modes */
  502. radeon_add_common_modes(encoder, connector);
  503. }
  504. return ret;
  505. }
  506. static int radeon_lvds_mode_valid(struct drm_connector *connector,
  507. struct drm_display_mode *mode)
  508. {
  509. struct drm_encoder *encoder = radeon_best_single_encoder(connector);
  510. if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
  511. return MODE_PANEL;
  512. if (encoder) {
  513. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  514. struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
  515. /* AVIVO hardware supports downscaling modes larger than the panel
  516. * to the panel size, but I'm not sure this is desirable.
  517. */
  518. if ((mode->hdisplay > native_mode->hdisplay) ||
  519. (mode->vdisplay > native_mode->vdisplay))
  520. return MODE_PANEL;
  521. /* if scaling is disabled, block non-native modes */
  522. if (radeon_encoder->rmx_type == RMX_OFF) {
  523. if ((mode->hdisplay != native_mode->hdisplay) ||
  524. (mode->vdisplay != native_mode->vdisplay))
  525. return MODE_PANEL;
  526. }
  527. }
  528. return MODE_OK;
  529. }
  530. static enum drm_connector_status
  531. radeon_lvds_detect(struct drm_connector *connector, bool force)
  532. {
  533. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  534. struct drm_encoder *encoder = radeon_best_single_encoder(connector);
  535. enum drm_connector_status ret = connector_status_disconnected;
  536. if (encoder) {
  537. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  538. struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
  539. /* check if panel is valid */
  540. if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
  541. ret = connector_status_connected;
  542. }
  543. /* check for edid as well */
  544. if (radeon_connector->edid)
  545. ret = connector_status_connected;
  546. else {
  547. if (radeon_connector->ddc_bus) {
  548. radeon_connector->edid = drm_get_edid(&radeon_connector->base,
  549. &radeon_connector->ddc_bus->adapter);
  550. if (radeon_connector->edid)
  551. ret = connector_status_connected;
  552. }
  553. }
  554. /* check acpi lid status ??? */
  555. radeon_connector_update_scratch_regs(connector, ret);
  556. return ret;
  557. }
  558. static void radeon_connector_destroy(struct drm_connector *connector)
  559. {
  560. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  561. if (radeon_connector->edid)
  562. kfree(radeon_connector->edid);
  563. kfree(radeon_connector->con_priv);
  564. drm_sysfs_connector_remove(connector);
  565. drm_connector_cleanup(connector);
  566. kfree(connector);
  567. }
  568. static int radeon_lvds_set_property(struct drm_connector *connector,
  569. struct drm_property *property,
  570. uint64_t value)
  571. {
  572. struct drm_device *dev = connector->dev;
  573. struct radeon_encoder *radeon_encoder;
  574. enum radeon_rmx_type rmx_type;
  575. DRM_DEBUG_KMS("\n");
  576. if (property != dev->mode_config.scaling_mode_property)
  577. return 0;
  578. if (connector->encoder)
  579. radeon_encoder = to_radeon_encoder(connector->encoder);
  580. else {
  581. struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
  582. radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
  583. }
  584. switch (value) {
  585. case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;
  586. case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;
  587. case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;
  588. default:
  589. case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;
  590. }
  591. if (radeon_encoder->rmx_type == rmx_type)
  592. return 0;
  593. radeon_encoder->rmx_type = rmx_type;
  594. radeon_property_change_mode(&radeon_encoder->base);
  595. return 0;
  596. }
  597. struct drm_connector_helper_funcs radeon_lvds_connector_helper_funcs = {
  598. .get_modes = radeon_lvds_get_modes,
  599. .mode_valid = radeon_lvds_mode_valid,
  600. .best_encoder = radeon_best_single_encoder,
  601. };
  602. struct drm_connector_funcs radeon_lvds_connector_funcs = {
  603. .dpms = drm_helper_connector_dpms,
  604. .detect = radeon_lvds_detect,
  605. .fill_modes = drm_helper_probe_single_connector_modes,
  606. .destroy = radeon_connector_destroy,
  607. .set_property = radeon_lvds_set_property,
  608. };
  609. static int radeon_vga_get_modes(struct drm_connector *connector)
  610. {
  611. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  612. int ret;
  613. ret = radeon_ddc_get_modes(radeon_connector);
  614. return ret;
  615. }
  616. static int radeon_vga_mode_valid(struct drm_connector *connector,
  617. struct drm_display_mode *mode)
  618. {
  619. struct drm_device *dev = connector->dev;
  620. struct radeon_device *rdev = dev->dev_private;
  621. /* XXX check mode bandwidth */
  622. if ((mode->clock / 10) > rdev->clock.max_pixel_clock)
  623. return MODE_CLOCK_HIGH;
  624. return MODE_OK;
  625. }
  626. static enum drm_connector_status
  627. radeon_vga_detect(struct drm_connector *connector, bool force)
  628. {
  629. struct drm_device *dev = connector->dev;
  630. struct radeon_device *rdev = dev->dev_private;
  631. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  632. struct drm_encoder *encoder;
  633. struct drm_encoder_helper_funcs *encoder_funcs;
  634. bool dret = false;
  635. enum drm_connector_status ret = connector_status_disconnected;
  636. encoder = radeon_best_single_encoder(connector);
  637. if (!encoder)
  638. ret = connector_status_disconnected;
  639. if (radeon_connector->ddc_bus)
  640. dret = radeon_ddc_probe(radeon_connector);
  641. if (dret) {
  642. radeon_connector->detected_by_load = false;
  643. if (radeon_connector->edid) {
  644. kfree(radeon_connector->edid);
  645. radeon_connector->edid = NULL;
  646. }
  647. radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
  648. if (!radeon_connector->edid) {
  649. DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
  650. drm_get_connector_name(connector));
  651. ret = connector_status_connected;
  652. } else {
  653. radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
  654. /* some oems have boards with separate digital and analog connectors
  655. * with a shared ddc line (often vga + hdmi)
  656. */
  657. if (radeon_connector->use_digital && radeon_connector->shared_ddc) {
  658. kfree(radeon_connector->edid);
  659. radeon_connector->edid = NULL;
  660. ret = connector_status_disconnected;
  661. } else
  662. ret = connector_status_connected;
  663. }
  664. } else {
  665. /* if we aren't forcing don't do destructive polling */
  666. if (!force) {
  667. /* only return the previous status if we last
  668. * detected a monitor via load.
  669. */
  670. if (radeon_connector->detected_by_load)
  671. return connector->status;
  672. else
  673. return ret;
  674. }
  675. if (radeon_connector->dac_load_detect && encoder) {
  676. encoder_funcs = encoder->helper_private;
  677. ret = encoder_funcs->detect(encoder, connector);
  678. if (ret != connector_status_disconnected)
  679. radeon_connector->detected_by_load = true;
  680. }
  681. }
  682. if (ret == connector_status_connected)
  683. ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
  684. /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
  685. * vbios to deal with KVMs. If we have one and are not able to detect a monitor
  686. * by other means, assume the CRT is connected and use that EDID.
  687. */
  688. if ((!rdev->is_atom_bios) &&
  689. (ret == connector_status_disconnected) &&
  690. rdev->mode_info.bios_hardcoded_edid_size) {
  691. ret = connector_status_connected;
  692. }
  693. radeon_connector_update_scratch_regs(connector, ret);
  694. return ret;
  695. }
  696. struct drm_connector_helper_funcs radeon_vga_connector_helper_funcs = {
  697. .get_modes = radeon_vga_get_modes,
  698. .mode_valid = radeon_vga_mode_valid,
  699. .best_encoder = radeon_best_single_encoder,
  700. };
  701. struct drm_connector_funcs radeon_vga_connector_funcs = {
  702. .dpms = drm_helper_connector_dpms,
  703. .detect = radeon_vga_detect,
  704. .fill_modes = drm_helper_probe_single_connector_modes,
  705. .destroy = radeon_connector_destroy,
  706. .set_property = radeon_connector_set_property,
  707. };
  708. static int radeon_tv_get_modes(struct drm_connector *connector)
  709. {
  710. struct drm_device *dev = connector->dev;
  711. struct radeon_device *rdev = dev->dev_private;
  712. struct drm_display_mode *tv_mode;
  713. struct drm_encoder *encoder;
  714. encoder = radeon_best_single_encoder(connector);
  715. if (!encoder)
  716. return 0;
  717. /* avivo chips can scale any mode */
  718. if (rdev->family >= CHIP_RS600)
  719. /* add scaled modes */
  720. radeon_add_common_modes(encoder, connector);
  721. else {
  722. /* only 800x600 is supported right now on pre-avivo chips */
  723. tv_mode = drm_cvt_mode(dev, 800, 600, 60, false, false, false);
  724. tv_mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
  725. drm_mode_probed_add(connector, tv_mode);
  726. }
  727. return 1;
  728. }
  729. static int radeon_tv_mode_valid(struct drm_connector *connector,
  730. struct drm_display_mode *mode)
  731. {
  732. if ((mode->hdisplay > 1024) || (mode->vdisplay > 768))
  733. return MODE_CLOCK_RANGE;
  734. return MODE_OK;
  735. }
  736. static enum drm_connector_status
  737. radeon_tv_detect(struct drm_connector *connector, bool force)
  738. {
  739. struct drm_encoder *encoder;
  740. struct drm_encoder_helper_funcs *encoder_funcs;
  741. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  742. enum drm_connector_status ret = connector_status_disconnected;
  743. if (!radeon_connector->dac_load_detect)
  744. return ret;
  745. encoder = radeon_best_single_encoder(connector);
  746. if (!encoder)
  747. ret = connector_status_disconnected;
  748. else {
  749. encoder_funcs = encoder->helper_private;
  750. ret = encoder_funcs->detect(encoder, connector);
  751. }
  752. if (ret == connector_status_connected)
  753. ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, false);
  754. radeon_connector_update_scratch_regs(connector, ret);
  755. return ret;
  756. }
  757. struct drm_connector_helper_funcs radeon_tv_connector_helper_funcs = {
  758. .get_modes = radeon_tv_get_modes,
  759. .mode_valid = radeon_tv_mode_valid,
  760. .best_encoder = radeon_best_single_encoder,
  761. };
  762. struct drm_connector_funcs radeon_tv_connector_funcs = {
  763. .dpms = drm_helper_connector_dpms,
  764. .detect = radeon_tv_detect,
  765. .fill_modes = drm_helper_probe_single_connector_modes,
  766. .destroy = radeon_connector_destroy,
  767. .set_property = radeon_connector_set_property,
  768. };
  769. static int radeon_dvi_get_modes(struct drm_connector *connector)
  770. {
  771. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  772. int ret;
  773. ret = radeon_ddc_get_modes(radeon_connector);
  774. return ret;
  775. }
  776. static bool radeon_check_hpd_status_unchanged(struct drm_connector *connector)
  777. {
  778. struct drm_device *dev = connector->dev;
  779. struct radeon_device *rdev = dev->dev_private;
  780. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  781. enum drm_connector_status status;
  782. /* We only trust HPD on R600 and newer ASICS. */
  783. if (rdev->family >= CHIP_R600
  784. && radeon_connector->hpd.hpd != RADEON_HPD_NONE) {
  785. if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
  786. status = connector_status_connected;
  787. else
  788. status = connector_status_disconnected;
  789. if (connector->status == status)
  790. return true;
  791. }
  792. return false;
  793. }
  794. /*
  795. * DVI is complicated
  796. * Do a DDC probe, if DDC probe passes, get the full EDID so
  797. * we can do analog/digital monitor detection at this point.
  798. * If the monitor is an analog monitor or we got no DDC,
  799. * we need to find the DAC encoder object for this connector.
  800. * If we got no DDC, we do load detection on the DAC encoder object.
  801. * If we got analog DDC or load detection passes on the DAC encoder
  802. * we have to check if this analog encoder is shared with anyone else (TV)
  803. * if its shared we have to set the other connector to disconnected.
  804. */
  805. static enum drm_connector_status
  806. radeon_dvi_detect(struct drm_connector *connector, bool force)
  807. {
  808. struct drm_device *dev = connector->dev;
  809. struct radeon_device *rdev = dev->dev_private;
  810. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  811. struct drm_encoder *encoder = NULL;
  812. struct drm_encoder_helper_funcs *encoder_funcs;
  813. struct drm_mode_object *obj;
  814. int i;
  815. enum drm_connector_status ret = connector_status_disconnected;
  816. bool dret = false;
  817. if (!force && radeon_check_hpd_status_unchanged(connector))
  818. return connector->status;
  819. if (radeon_connector->ddc_bus)
  820. dret = radeon_ddc_probe(radeon_connector);
  821. if (dret) {
  822. radeon_connector->detected_by_load = false;
  823. if (radeon_connector->edid) {
  824. kfree(radeon_connector->edid);
  825. radeon_connector->edid = NULL;
  826. }
  827. radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
  828. if (!radeon_connector->edid) {
  829. DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
  830. drm_get_connector_name(connector));
  831. /* rs690 seems to have a problem with connectors not existing and always
  832. * return a block of 0's. If we see this just stop polling on this output */
  833. if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) {
  834. ret = connector_status_disconnected;
  835. DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", drm_get_connector_name(connector));
  836. radeon_connector->ddc_bus = NULL;
  837. }
  838. } else {
  839. radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
  840. /* some oems have boards with separate digital and analog connectors
  841. * with a shared ddc line (often vga + hdmi)
  842. */
  843. if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) {
  844. kfree(radeon_connector->edid);
  845. radeon_connector->edid = NULL;
  846. ret = connector_status_disconnected;
  847. } else
  848. ret = connector_status_connected;
  849. /* This gets complicated. We have boards with VGA + HDMI with a
  850. * shared DDC line and we have boards with DVI-D + HDMI with a shared
  851. * DDC line. The latter is more complex because with DVI<->HDMI adapters
  852. * you don't really know what's connected to which port as both are digital.
  853. */
  854. if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {
  855. struct drm_connector *list_connector;
  856. struct radeon_connector *list_radeon_connector;
  857. list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
  858. if (connector == list_connector)
  859. continue;
  860. list_radeon_connector = to_radeon_connector(list_connector);
  861. if (list_radeon_connector->shared_ddc &&
  862. (list_radeon_connector->ddc_bus->rec.i2c_id ==
  863. radeon_connector->ddc_bus->rec.i2c_id)) {
  864. /* cases where both connectors are digital */
  865. if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {
  866. /* hpd is our only option in this case */
  867. if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
  868. kfree(radeon_connector->edid);
  869. radeon_connector->edid = NULL;
  870. ret = connector_status_disconnected;
  871. }
  872. }
  873. }
  874. }
  875. }
  876. }
  877. }
  878. if ((ret == connector_status_connected) && (radeon_connector->use_digital == true))
  879. goto out;
  880. /* DVI-D and HDMI-A are digital only */
  881. if ((connector->connector_type == DRM_MODE_CONNECTOR_DVID) ||
  882. (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA))
  883. goto out;
  884. /* if we aren't forcing don't do destructive polling */
  885. if (!force) {
  886. /* only return the previous status if we last
  887. * detected a monitor via load.
  888. */
  889. if (radeon_connector->detected_by_load)
  890. ret = connector->status;
  891. goto out;
  892. }
  893. /* find analog encoder */
  894. if (radeon_connector->dac_load_detect) {
  895. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  896. if (connector->encoder_ids[i] == 0)
  897. break;
  898. obj = drm_mode_object_find(connector->dev,
  899. connector->encoder_ids[i],
  900. DRM_MODE_OBJECT_ENCODER);
  901. if (!obj)
  902. continue;
  903. encoder = obj_to_encoder(obj);
  904. if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
  905. encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
  906. continue;
  907. encoder_funcs = encoder->helper_private;
  908. if (encoder_funcs->detect) {
  909. if (ret != connector_status_connected) {
  910. ret = encoder_funcs->detect(encoder, connector);
  911. if (ret == connector_status_connected) {
  912. radeon_connector->use_digital = false;
  913. }
  914. if (ret != connector_status_disconnected)
  915. radeon_connector->detected_by_load = true;
  916. }
  917. break;
  918. }
  919. }
  920. }
  921. if ((ret == connector_status_connected) && (radeon_connector->use_digital == false) &&
  922. encoder) {
  923. ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
  924. }
  925. /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
  926. * vbios to deal with KVMs. If we have one and are not able to detect a monitor
  927. * by other means, assume the DFP is connected and use that EDID. In most
  928. * cases the DVI port is actually a virtual KVM port connected to the service
  929. * processor.
  930. */
  931. out:
  932. if ((!rdev->is_atom_bios) &&
  933. (ret == connector_status_disconnected) &&
  934. rdev->mode_info.bios_hardcoded_edid_size) {
  935. radeon_connector->use_digital = true;
  936. ret = connector_status_connected;
  937. }
  938. /* updated in get modes as well since we need to know if it's analog or digital */
  939. radeon_connector_update_scratch_regs(connector, ret);
  940. return ret;
  941. }
  942. /* okay need to be smart in here about which encoder to pick */
  943. struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
  944. {
  945. int enc_id = connector->encoder_ids[0];
  946. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  947. struct drm_mode_object *obj;
  948. struct drm_encoder *encoder;
  949. int i;
  950. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  951. if (connector->encoder_ids[i] == 0)
  952. break;
  953. obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
  954. if (!obj)
  955. continue;
  956. encoder = obj_to_encoder(obj);
  957. if (radeon_connector->use_digital == true) {
  958. if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
  959. return encoder;
  960. } else {
  961. if (encoder->encoder_type == DRM_MODE_ENCODER_DAC ||
  962. encoder->encoder_type == DRM_MODE_ENCODER_TVDAC)
  963. return encoder;
  964. }
  965. }
  966. /* see if we have a default encoder TODO */
  967. /* then check use digitial */
  968. /* pick the first one */
  969. if (enc_id) {
  970. obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
  971. if (!obj)
  972. return NULL;
  973. encoder = obj_to_encoder(obj);
  974. return encoder;
  975. }
  976. return NULL;
  977. }
  978. static void radeon_dvi_force(struct drm_connector *connector)
  979. {
  980. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  981. if (connector->force == DRM_FORCE_ON)
  982. radeon_connector->use_digital = false;
  983. if (connector->force == DRM_FORCE_ON_DIGITAL)
  984. radeon_connector->use_digital = true;
  985. }
  986. static int radeon_dvi_mode_valid(struct drm_connector *connector,
  987. struct drm_display_mode *mode)
  988. {
  989. struct drm_device *dev = connector->dev;
  990. struct radeon_device *rdev = dev->dev_private;
  991. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  992. /* XXX check mode bandwidth */
  993. /* clocks over 135 MHz have heat issues with DVI on RV100 */
  994. if (radeon_connector->use_digital &&
  995. (rdev->family == CHIP_RV100) &&
  996. (mode->clock > 135000))
  997. return MODE_CLOCK_HIGH;
  998. if (radeon_connector->use_digital && (mode->clock > 165000)) {
  999. if ((radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) ||
  1000. (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
  1001. (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
  1002. return MODE_OK;
  1003. else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) {
  1004. if (ASIC_IS_DCE6(rdev)) {
  1005. /* HDMI 1.3+ supports max clock of 340 Mhz */
  1006. if (mode->clock > 340000)
  1007. return MODE_CLOCK_HIGH;
  1008. else
  1009. return MODE_OK;
  1010. } else
  1011. return MODE_CLOCK_HIGH;
  1012. } else
  1013. return MODE_CLOCK_HIGH;
  1014. }
  1015. /* check against the max pixel clock */
  1016. if ((mode->clock / 10) > rdev->clock.max_pixel_clock)
  1017. return MODE_CLOCK_HIGH;
  1018. return MODE_OK;
  1019. }
  1020. struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {
  1021. .get_modes = radeon_dvi_get_modes,
  1022. .mode_valid = radeon_dvi_mode_valid,
  1023. .best_encoder = radeon_dvi_encoder,
  1024. };
  1025. struct drm_connector_funcs radeon_dvi_connector_funcs = {
  1026. .dpms = drm_helper_connector_dpms,
  1027. .detect = radeon_dvi_detect,
  1028. .fill_modes = drm_helper_probe_single_connector_modes,
  1029. .set_property = radeon_connector_set_property,
  1030. .destroy = radeon_connector_destroy,
  1031. .force = radeon_dvi_force,
  1032. };
  1033. static void radeon_dp_connector_destroy(struct drm_connector *connector)
  1034. {
  1035. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  1036. struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
  1037. if (radeon_connector->edid)
  1038. kfree(radeon_connector->edid);
  1039. if (radeon_dig_connector->dp_i2c_bus)
  1040. radeon_i2c_destroy(radeon_dig_connector->dp_i2c_bus);
  1041. kfree(radeon_connector->con_priv);
  1042. drm_sysfs_connector_remove(connector);
  1043. drm_connector_cleanup(connector);
  1044. kfree(connector);
  1045. }
  1046. static int radeon_dp_get_modes(struct drm_connector *connector)
  1047. {
  1048. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  1049. struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
  1050. struct drm_encoder *encoder = radeon_best_single_encoder(connector);
  1051. int ret;
  1052. if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
  1053. (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
  1054. struct drm_display_mode *mode;
  1055. if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
  1056. if (!radeon_dig_connector->edp_on)
  1057. atombios_set_edp_panel_power(connector,
  1058. ATOM_TRANSMITTER_ACTION_POWER_ON);
  1059. ret = radeon_ddc_get_modes(radeon_connector);
  1060. if (!radeon_dig_connector->edp_on)
  1061. atombios_set_edp_panel_power(connector,
  1062. ATOM_TRANSMITTER_ACTION_POWER_OFF);
  1063. } else {
  1064. /* need to setup ddc on the bridge */
  1065. if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
  1066. ENCODER_OBJECT_ID_NONE) {
  1067. if (encoder)
  1068. radeon_atom_ext_encoder_setup_ddc(encoder);
  1069. }
  1070. ret = radeon_ddc_get_modes(radeon_connector);
  1071. }
  1072. if (ret > 0) {
  1073. if (encoder) {
  1074. radeon_fixup_lvds_native_mode(encoder, connector);
  1075. /* add scaled modes */
  1076. radeon_add_common_modes(encoder, connector);
  1077. }
  1078. return ret;
  1079. }
  1080. if (!encoder)
  1081. return 0;
  1082. /* we have no EDID modes */
  1083. mode = radeon_fp_native_mode(encoder);
  1084. if (mode) {
  1085. ret = 1;
  1086. drm_mode_probed_add(connector, mode);
  1087. /* add the width/height from vbios tables if available */
  1088. connector->display_info.width_mm = mode->width_mm;
  1089. connector->display_info.height_mm = mode->height_mm;
  1090. /* add scaled modes */
  1091. radeon_add_common_modes(encoder, connector);
  1092. }
  1093. } else {
  1094. /* need to setup ddc on the bridge */
  1095. if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
  1096. ENCODER_OBJECT_ID_NONE) {
  1097. if (encoder)
  1098. radeon_atom_ext_encoder_setup_ddc(encoder);
  1099. }
  1100. ret = radeon_ddc_get_modes(radeon_connector);
  1101. }
  1102. return ret;
  1103. }
  1104. u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector)
  1105. {
  1106. struct drm_mode_object *obj;
  1107. struct drm_encoder *encoder;
  1108. struct radeon_encoder *radeon_encoder;
  1109. int i;
  1110. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  1111. if (connector->encoder_ids[i] == 0)
  1112. break;
  1113. obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
  1114. if (!obj)
  1115. continue;
  1116. encoder = obj_to_encoder(obj);
  1117. radeon_encoder = to_radeon_encoder(encoder);
  1118. switch (radeon_encoder->encoder_id) {
  1119. case ENCODER_OBJECT_ID_TRAVIS:
  1120. case ENCODER_OBJECT_ID_NUTMEG:
  1121. return radeon_encoder->encoder_id;
  1122. default:
  1123. break;
  1124. }
  1125. }
  1126. return ENCODER_OBJECT_ID_NONE;
  1127. }
  1128. bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
  1129. {
  1130. struct drm_mode_object *obj;
  1131. struct drm_encoder *encoder;
  1132. struct radeon_encoder *radeon_encoder;
  1133. int i;
  1134. bool found = false;
  1135. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  1136. if (connector->encoder_ids[i] == 0)
  1137. break;
  1138. obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
  1139. if (!obj)
  1140. continue;
  1141. encoder = obj_to_encoder(obj);
  1142. radeon_encoder = to_radeon_encoder(encoder);
  1143. if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
  1144. found = true;
  1145. }
  1146. return found;
  1147. }
  1148. bool radeon_connector_is_dp12_capable(struct drm_connector *connector)
  1149. {
  1150. struct drm_device *dev = connector->dev;
  1151. struct radeon_device *rdev = dev->dev_private;
  1152. if (ASIC_IS_DCE5(rdev) &&
  1153. (rdev->clock.dp_extclk >= 53900) &&
  1154. radeon_connector_encoder_is_hbr2(connector)) {
  1155. return true;
  1156. }
  1157. return false;
  1158. }
  1159. static enum drm_connector_status
  1160. radeon_dp_detect(struct drm_connector *connector, bool force)
  1161. {
  1162. struct drm_device *dev = connector->dev;
  1163. struct radeon_device *rdev = dev->dev_private;
  1164. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  1165. enum drm_connector_status ret = connector_status_disconnected;
  1166. struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
  1167. struct drm_encoder *encoder = radeon_best_single_encoder(connector);
  1168. if (!force && radeon_check_hpd_status_unchanged(connector))
  1169. return connector->status;
  1170. if (radeon_connector->edid) {
  1171. kfree(radeon_connector->edid);
  1172. radeon_connector->edid = NULL;
  1173. }
  1174. if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
  1175. (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
  1176. if (encoder) {
  1177. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  1178. struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
  1179. /* check if panel is valid */
  1180. if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
  1181. ret = connector_status_connected;
  1182. }
  1183. /* eDP is always DP */
  1184. radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
  1185. if (!radeon_dig_connector->edp_on)
  1186. atombios_set_edp_panel_power(connector,
  1187. ATOM_TRANSMITTER_ACTION_POWER_ON);
  1188. if (radeon_dp_getdpcd(radeon_connector))
  1189. ret = connector_status_connected;
  1190. if (!radeon_dig_connector->edp_on)
  1191. atombios_set_edp_panel_power(connector,
  1192. ATOM_TRANSMITTER_ACTION_POWER_OFF);
  1193. } else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
  1194. ENCODER_OBJECT_ID_NONE) {
  1195. /* DP bridges are always DP */
  1196. radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
  1197. /* get the DPCD from the bridge */
  1198. radeon_dp_getdpcd(radeon_connector);
  1199. if (encoder) {
  1200. /* setup ddc on the bridge */
  1201. radeon_atom_ext_encoder_setup_ddc(encoder);
  1202. if (radeon_ddc_probe(radeon_connector)) /* try DDC */
  1203. ret = connector_status_connected;
  1204. else if (radeon_connector->dac_load_detect) { /* try load detection */
  1205. struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
  1206. ret = encoder_funcs->detect(encoder, connector);
  1207. }
  1208. }
  1209. } else {
  1210. radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
  1211. if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
  1212. ret = connector_status_connected;
  1213. if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT)
  1214. radeon_dp_getdpcd(radeon_connector);
  1215. } else {
  1216. if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
  1217. if (radeon_dp_getdpcd(radeon_connector))
  1218. ret = connector_status_connected;
  1219. } else {
  1220. if (radeon_ddc_probe(radeon_connector))
  1221. ret = connector_status_connected;
  1222. }
  1223. }
  1224. }
  1225. radeon_connector_update_scratch_regs(connector, ret);
  1226. return ret;
  1227. }
  1228. static int radeon_dp_mode_valid(struct drm_connector *connector,
  1229. struct drm_display_mode *mode)
  1230. {
  1231. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  1232. struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
  1233. /* XXX check mode bandwidth */
  1234. if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
  1235. (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
  1236. struct drm_encoder *encoder = radeon_best_single_encoder(connector);
  1237. if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
  1238. return MODE_PANEL;
  1239. if (encoder) {
  1240. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  1241. struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
  1242. /* AVIVO hardware supports downscaling modes larger than the panel
  1243. * to the panel size, but I'm not sure this is desirable.
  1244. */
  1245. if ((mode->hdisplay > native_mode->hdisplay) ||
  1246. (mode->vdisplay > native_mode->vdisplay))
  1247. return MODE_PANEL;
  1248. /* if scaling is disabled, block non-native modes */
  1249. if (radeon_encoder->rmx_type == RMX_OFF) {
  1250. if ((mode->hdisplay != native_mode->hdisplay) ||
  1251. (mode->vdisplay != native_mode->vdisplay))
  1252. return MODE_PANEL;
  1253. }
  1254. }
  1255. return MODE_OK;
  1256. } else {
  1257. if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
  1258. (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
  1259. return radeon_dp_mode_valid_helper(connector, mode);
  1260. else
  1261. return MODE_OK;
  1262. }
  1263. }
  1264. struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {
  1265. .get_modes = radeon_dp_get_modes,
  1266. .mode_valid = radeon_dp_mode_valid,
  1267. .best_encoder = radeon_dvi_encoder,
  1268. };
  1269. struct drm_connector_funcs radeon_dp_connector_funcs = {
  1270. .dpms = drm_helper_connector_dpms,
  1271. .detect = radeon_dp_detect,
  1272. .fill_modes = drm_helper_probe_single_connector_modes,
  1273. .set_property = radeon_connector_set_property,
  1274. .destroy = radeon_dp_connector_destroy,
  1275. .force = radeon_dvi_force,
  1276. };
  1277. void
  1278. radeon_add_atom_connector(struct drm_device *dev,
  1279. uint32_t connector_id,
  1280. uint32_t supported_device,
  1281. int connector_type,
  1282. struct radeon_i2c_bus_rec *i2c_bus,
  1283. uint32_t igp_lane_info,
  1284. uint16_t connector_object_id,
  1285. struct radeon_hpd *hpd,
  1286. struct radeon_router *router)
  1287. {
  1288. struct radeon_device *rdev = dev->dev_private;
  1289. struct drm_connector *connector;
  1290. struct radeon_connector *radeon_connector;
  1291. struct radeon_connector_atom_dig *radeon_dig_connector;
  1292. struct drm_encoder *encoder;
  1293. struct radeon_encoder *radeon_encoder;
  1294. uint32_t subpixel_order = SubPixelNone;
  1295. bool shared_ddc = false;
  1296. bool is_dp_bridge = false;
  1297. if (connector_type == DRM_MODE_CONNECTOR_Unknown)
  1298. return;
  1299. /* if the user selected tv=0 don't try and add the connector */
  1300. if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
  1301. (connector_type == DRM_MODE_CONNECTOR_Composite) ||
  1302. (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
  1303. (radeon_tv == 0))
  1304. return;
  1305. /* see if we already added it */
  1306. list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
  1307. radeon_connector = to_radeon_connector(connector);
  1308. if (radeon_connector->connector_id == connector_id) {
  1309. radeon_connector->devices |= supported_device;
  1310. return;
  1311. }
  1312. if (radeon_connector->ddc_bus && i2c_bus->valid) {
  1313. if (radeon_connector->ddc_bus->rec.i2c_id == i2c_bus->i2c_id) {
  1314. radeon_connector->shared_ddc = true;
  1315. shared_ddc = true;
  1316. }
  1317. if (radeon_connector->router_bus && router->ddc_valid &&
  1318. (radeon_connector->router.router_id == router->router_id)) {
  1319. radeon_connector->shared_ddc = false;
  1320. shared_ddc = false;
  1321. }
  1322. }
  1323. }
  1324. /* check if it's a dp bridge */
  1325. list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
  1326. radeon_encoder = to_radeon_encoder(encoder);
  1327. if (radeon_encoder->devices & supported_device) {
  1328. switch (radeon_encoder->encoder_id) {
  1329. case ENCODER_OBJECT_ID_TRAVIS:
  1330. case ENCODER_OBJECT_ID_NUTMEG:
  1331. is_dp_bridge = true;
  1332. break;
  1333. default:
  1334. break;
  1335. }
  1336. }
  1337. }
  1338. radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
  1339. if (!radeon_connector)
  1340. return;
  1341. connector = &radeon_connector->base;
  1342. radeon_connector->connector_id = connector_id;
  1343. radeon_connector->devices = supported_device;
  1344. radeon_connector->shared_ddc = shared_ddc;
  1345. radeon_connector->connector_object_id = connector_object_id;
  1346. radeon_connector->hpd = *hpd;
  1347. radeon_connector->router = *router;
  1348. if (router->ddc_valid || router->cd_valid) {
  1349. radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info);
  1350. if (!radeon_connector->router_bus)
  1351. DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n");
  1352. }
  1353. if (is_dp_bridge) {
  1354. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  1355. if (!radeon_dig_connector)
  1356. goto failed;
  1357. radeon_dig_connector->igp_lane_info = igp_lane_info;
  1358. radeon_connector->con_priv = radeon_dig_connector;
  1359. drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
  1360. drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
  1361. if (i2c_bus->valid) {
  1362. /* add DP i2c bus */
  1363. if (connector_type == DRM_MODE_CONNECTOR_eDP)
  1364. radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
  1365. else
  1366. radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
  1367. if (!radeon_dig_connector->dp_i2c_bus)
  1368. DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
  1369. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1370. if (!radeon_connector->ddc_bus)
  1371. DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1372. }
  1373. switch (connector_type) {
  1374. case DRM_MODE_CONNECTOR_VGA:
  1375. case DRM_MODE_CONNECTOR_DVIA:
  1376. default:
  1377. connector->interlace_allowed = true;
  1378. connector->doublescan_allowed = true;
  1379. radeon_connector->dac_load_detect = true;
  1380. drm_connector_attach_property(&radeon_connector->base,
  1381. rdev->mode_info.load_detect_property,
  1382. 1);
  1383. break;
  1384. case DRM_MODE_CONNECTOR_DVII:
  1385. case DRM_MODE_CONNECTOR_DVID:
  1386. case DRM_MODE_CONNECTOR_HDMIA:
  1387. case DRM_MODE_CONNECTOR_HDMIB:
  1388. case DRM_MODE_CONNECTOR_DisplayPort:
  1389. drm_connector_attach_property(&radeon_connector->base,
  1390. rdev->mode_info.underscan_property,
  1391. UNDERSCAN_OFF);
  1392. drm_connector_attach_property(&radeon_connector->base,
  1393. rdev->mode_info.underscan_hborder_property,
  1394. 0);
  1395. drm_connector_attach_property(&radeon_connector->base,
  1396. rdev->mode_info.underscan_vborder_property,
  1397. 0);
  1398. subpixel_order = SubPixelHorizontalRGB;
  1399. connector->interlace_allowed = true;
  1400. if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
  1401. connector->doublescan_allowed = true;
  1402. else
  1403. connector->doublescan_allowed = false;
  1404. if (connector_type == DRM_MODE_CONNECTOR_DVII) {
  1405. radeon_connector->dac_load_detect = true;
  1406. drm_connector_attach_property(&radeon_connector->base,
  1407. rdev->mode_info.load_detect_property,
  1408. 1);
  1409. }
  1410. break;
  1411. case DRM_MODE_CONNECTOR_LVDS:
  1412. case DRM_MODE_CONNECTOR_eDP:
  1413. drm_connector_attach_property(&radeon_connector->base,
  1414. dev->mode_config.scaling_mode_property,
  1415. DRM_MODE_SCALE_FULLSCREEN);
  1416. subpixel_order = SubPixelHorizontalRGB;
  1417. connector->interlace_allowed = false;
  1418. connector->doublescan_allowed = false;
  1419. break;
  1420. }
  1421. } else {
  1422. switch (connector_type) {
  1423. case DRM_MODE_CONNECTOR_VGA:
  1424. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  1425. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  1426. if (i2c_bus->valid) {
  1427. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1428. if (!radeon_connector->ddc_bus)
  1429. DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1430. }
  1431. radeon_connector->dac_load_detect = true;
  1432. drm_connector_attach_property(&radeon_connector->base,
  1433. rdev->mode_info.load_detect_property,
  1434. 1);
  1435. /* no HPD on analog connectors */
  1436. radeon_connector->hpd.hpd = RADEON_HPD_NONE;
  1437. connector->polled = DRM_CONNECTOR_POLL_CONNECT;
  1438. connector->interlace_allowed = true;
  1439. connector->doublescan_allowed = true;
  1440. break;
  1441. case DRM_MODE_CONNECTOR_DVIA:
  1442. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  1443. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  1444. if (i2c_bus->valid) {
  1445. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1446. if (!radeon_connector->ddc_bus)
  1447. DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1448. }
  1449. radeon_connector->dac_load_detect = true;
  1450. drm_connector_attach_property(&radeon_connector->base,
  1451. rdev->mode_info.load_detect_property,
  1452. 1);
  1453. /* no HPD on analog connectors */
  1454. radeon_connector->hpd.hpd = RADEON_HPD_NONE;
  1455. connector->interlace_allowed = true;
  1456. connector->doublescan_allowed = true;
  1457. break;
  1458. case DRM_MODE_CONNECTOR_DVII:
  1459. case DRM_MODE_CONNECTOR_DVID:
  1460. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  1461. if (!radeon_dig_connector)
  1462. goto failed;
  1463. radeon_dig_connector->igp_lane_info = igp_lane_info;
  1464. radeon_connector->con_priv = radeon_dig_connector;
  1465. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  1466. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  1467. if (i2c_bus->valid) {
  1468. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1469. if (!radeon_connector->ddc_bus)
  1470. DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1471. }
  1472. subpixel_order = SubPixelHorizontalRGB;
  1473. drm_connector_attach_property(&radeon_connector->base,
  1474. rdev->mode_info.coherent_mode_property,
  1475. 1);
  1476. if (ASIC_IS_AVIVO(rdev)) {
  1477. drm_connector_attach_property(&radeon_connector->base,
  1478. rdev->mode_info.underscan_property,
  1479. UNDERSCAN_OFF);
  1480. drm_connector_attach_property(&radeon_connector->base,
  1481. rdev->mode_info.underscan_hborder_property,
  1482. 0);
  1483. drm_connector_attach_property(&radeon_connector->base,
  1484. rdev->mode_info.underscan_vborder_property,
  1485. 0);
  1486. }
  1487. if (connector_type == DRM_MODE_CONNECTOR_DVII) {
  1488. radeon_connector->dac_load_detect = true;
  1489. drm_connector_attach_property(&radeon_connector->base,
  1490. rdev->mode_info.load_detect_property,
  1491. 1);
  1492. }
  1493. connector->interlace_allowed = true;
  1494. if (connector_type == DRM_MODE_CONNECTOR_DVII)
  1495. connector->doublescan_allowed = true;
  1496. else
  1497. connector->doublescan_allowed = false;
  1498. break;
  1499. case DRM_MODE_CONNECTOR_HDMIA:
  1500. case DRM_MODE_CONNECTOR_HDMIB:
  1501. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  1502. if (!radeon_dig_connector)
  1503. goto failed;
  1504. radeon_dig_connector->igp_lane_info = igp_lane_info;
  1505. radeon_connector->con_priv = radeon_dig_connector;
  1506. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  1507. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  1508. if (i2c_bus->valid) {
  1509. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1510. if (!radeon_connector->ddc_bus)
  1511. DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1512. }
  1513. drm_connector_attach_property(&radeon_connector->base,
  1514. rdev->mode_info.coherent_mode_property,
  1515. 1);
  1516. if (ASIC_IS_AVIVO(rdev)) {
  1517. drm_connector_attach_property(&radeon_connector->base,
  1518. rdev->mode_info.underscan_property,
  1519. UNDERSCAN_OFF);
  1520. drm_connector_attach_property(&radeon_connector->base,
  1521. rdev->mode_info.underscan_hborder_property,
  1522. 0);
  1523. drm_connector_attach_property(&radeon_connector->base,
  1524. rdev->mode_info.underscan_vborder_property,
  1525. 0);
  1526. }
  1527. subpixel_order = SubPixelHorizontalRGB;
  1528. connector->interlace_allowed = true;
  1529. if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
  1530. connector->doublescan_allowed = true;
  1531. else
  1532. connector->doublescan_allowed = false;
  1533. break;
  1534. case DRM_MODE_CONNECTOR_DisplayPort:
  1535. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  1536. if (!radeon_dig_connector)
  1537. goto failed;
  1538. radeon_dig_connector->igp_lane_info = igp_lane_info;
  1539. radeon_connector->con_priv = radeon_dig_connector;
  1540. drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
  1541. drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
  1542. if (i2c_bus->valid) {
  1543. /* add DP i2c bus */
  1544. radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
  1545. if (!radeon_dig_connector->dp_i2c_bus)
  1546. DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
  1547. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1548. if (!radeon_connector->ddc_bus)
  1549. DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1550. }
  1551. subpixel_order = SubPixelHorizontalRGB;
  1552. drm_connector_attach_property(&radeon_connector->base,
  1553. rdev->mode_info.coherent_mode_property,
  1554. 1);
  1555. if (ASIC_IS_AVIVO(rdev)) {
  1556. drm_connector_attach_property(&radeon_connector->base,
  1557. rdev->mode_info.underscan_property,
  1558. UNDERSCAN_OFF);
  1559. drm_connector_attach_property(&radeon_connector->base,
  1560. rdev->mode_info.underscan_hborder_property,
  1561. 0);
  1562. drm_connector_attach_property(&radeon_connector->base,
  1563. rdev->mode_info.underscan_vborder_property,
  1564. 0);
  1565. }
  1566. connector->interlace_allowed = true;
  1567. /* in theory with a DP to VGA converter... */
  1568. connector->doublescan_allowed = false;
  1569. break;
  1570. case DRM_MODE_CONNECTOR_eDP:
  1571. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  1572. if (!radeon_dig_connector)
  1573. goto failed;
  1574. radeon_dig_connector->igp_lane_info = igp_lane_info;
  1575. radeon_connector->con_priv = radeon_dig_connector;
  1576. drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
  1577. drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
  1578. if (i2c_bus->valid) {
  1579. /* add DP i2c bus */
  1580. radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
  1581. if (!radeon_dig_connector->dp_i2c_bus)
  1582. DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
  1583. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1584. if (!radeon_connector->ddc_bus)
  1585. DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1586. }
  1587. drm_connector_attach_property(&radeon_connector->base,
  1588. dev->mode_config.scaling_mode_property,
  1589. DRM_MODE_SCALE_FULLSCREEN);
  1590. subpixel_order = SubPixelHorizontalRGB;
  1591. connector->interlace_allowed = false;
  1592. connector->doublescan_allowed = false;
  1593. break;
  1594. case DRM_MODE_CONNECTOR_SVIDEO:
  1595. case DRM_MODE_CONNECTOR_Composite:
  1596. case DRM_MODE_CONNECTOR_9PinDIN:
  1597. drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
  1598. drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
  1599. radeon_connector->dac_load_detect = true;
  1600. drm_connector_attach_property(&radeon_connector->base,
  1601. rdev->mode_info.load_detect_property,
  1602. 1);
  1603. drm_connector_attach_property(&radeon_connector->base,
  1604. rdev->mode_info.tv_std_property,
  1605. radeon_atombios_get_tv_info(rdev));
  1606. /* no HPD on analog connectors */
  1607. radeon_connector->hpd.hpd = RADEON_HPD_NONE;
  1608. connector->interlace_allowed = false;
  1609. connector->doublescan_allowed = false;
  1610. break;
  1611. case DRM_MODE_CONNECTOR_LVDS:
  1612. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  1613. if (!radeon_dig_connector)
  1614. goto failed;
  1615. radeon_dig_connector->igp_lane_info = igp_lane_info;
  1616. radeon_connector->con_priv = radeon_dig_connector;
  1617. drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
  1618. drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
  1619. if (i2c_bus->valid) {
  1620. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1621. if (!radeon_connector->ddc_bus)
  1622. DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1623. }
  1624. drm_connector_attach_property(&radeon_connector->base,
  1625. dev->mode_config.scaling_mode_property,
  1626. DRM_MODE_SCALE_FULLSCREEN);
  1627. subpixel_order = SubPixelHorizontalRGB;
  1628. connector->interlace_allowed = false;
  1629. connector->doublescan_allowed = false;
  1630. break;
  1631. }
  1632. }
  1633. if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
  1634. if (i2c_bus->valid)
  1635. connector->polled = DRM_CONNECTOR_POLL_CONNECT;
  1636. } else
  1637. connector->polled = DRM_CONNECTOR_POLL_HPD;
  1638. connector->display_info.subpixel_order = subpixel_order;
  1639. drm_sysfs_connector_add(connector);
  1640. return;
  1641. failed:
  1642. drm_connector_cleanup(connector);
  1643. kfree(connector);
  1644. }
  1645. void
  1646. radeon_add_legacy_connector(struct drm_device *dev,
  1647. uint32_t connector_id,
  1648. uint32_t supported_device,
  1649. int connector_type,
  1650. struct radeon_i2c_bus_rec *i2c_bus,
  1651. uint16_t connector_object_id,
  1652. struct radeon_hpd *hpd)
  1653. {
  1654. struct radeon_device *rdev = dev->dev_private;
  1655. struct drm_connector *connector;
  1656. struct radeon_connector *radeon_connector;
  1657. uint32_t subpixel_order = SubPixelNone;
  1658. if (connector_type == DRM_MODE_CONNECTOR_Unknown)
  1659. return;
  1660. /* if the user selected tv=0 don't try and add the connector */
  1661. if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
  1662. (connector_type == DRM_MODE_CONNECTOR_Composite) ||
  1663. (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
  1664. (radeon_tv == 0))
  1665. return;
  1666. /* see if we already added it */
  1667. list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
  1668. radeon_connector = to_radeon_connector(connector);
  1669. if (radeon_connector->connector_id == connector_id) {
  1670. radeon_connector->devices |= supported_device;
  1671. return;
  1672. }
  1673. }
  1674. radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
  1675. if (!radeon_connector)
  1676. return;
  1677. connector = &radeon_connector->base;
  1678. radeon_connector->connector_id = connector_id;
  1679. radeon_connector->devices = supported_device;
  1680. radeon_connector->connector_object_id = connector_object_id;
  1681. radeon_connector->hpd = *hpd;
  1682. switch (connector_type) {
  1683. case DRM_MODE_CONNECTOR_VGA:
  1684. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  1685. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  1686. if (i2c_bus->valid) {
  1687. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1688. if (!radeon_connector->ddc_bus)
  1689. DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1690. }
  1691. radeon_connector->dac_load_detect = true;
  1692. drm_connector_attach_property(&radeon_connector->base,
  1693. rdev->mode_info.load_detect_property,
  1694. 1);
  1695. /* no HPD on analog connectors */
  1696. radeon_connector->hpd.hpd = RADEON_HPD_NONE;
  1697. connector->polled = DRM_CONNECTOR_POLL_CONNECT;
  1698. connector->interlace_allowed = true;
  1699. connector->doublescan_allowed = true;
  1700. break;
  1701. case DRM_MODE_CONNECTOR_DVIA:
  1702. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  1703. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  1704. if (i2c_bus->valid) {
  1705. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1706. if (!radeon_connector->ddc_bus)
  1707. DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1708. }
  1709. radeon_connector->dac_load_detect = true;
  1710. drm_connector_attach_property(&radeon_connector->base,
  1711. rdev->mode_info.load_detect_property,
  1712. 1);
  1713. /* no HPD on analog connectors */
  1714. radeon_connector->hpd.hpd = RADEON_HPD_NONE;
  1715. connector->interlace_allowed = true;
  1716. connector->doublescan_allowed = true;
  1717. break;
  1718. case DRM_MODE_CONNECTOR_DVII:
  1719. case DRM_MODE_CONNECTOR_DVID:
  1720. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  1721. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  1722. if (i2c_bus->valid) {
  1723. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1724. if (!radeon_connector->ddc_bus)
  1725. DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1726. }
  1727. if (connector_type == DRM_MODE_CONNECTOR_DVII) {
  1728. radeon_connector->dac_load_detect = true;
  1729. drm_connector_attach_property(&radeon_connector->base,
  1730. rdev->mode_info.load_detect_property,
  1731. 1);
  1732. }
  1733. subpixel_order = SubPixelHorizontalRGB;
  1734. connector->interlace_allowed = true;
  1735. if (connector_type == DRM_MODE_CONNECTOR_DVII)
  1736. connector->doublescan_allowed = true;
  1737. else
  1738. connector->doublescan_allowed = false;
  1739. break;
  1740. case DRM_MODE_CONNECTOR_SVIDEO:
  1741. case DRM_MODE_CONNECTOR_Composite:
  1742. case DRM_MODE_CONNECTOR_9PinDIN:
  1743. drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
  1744. drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
  1745. radeon_connector->dac_load_detect = true;
  1746. /* RS400,RC410,RS480 chipset seems to report a lot
  1747. * of false positive on load detect, we haven't yet
  1748. * found a way to make load detect reliable on those
  1749. * chipset, thus just disable it for TV.
  1750. */
  1751. if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480)
  1752. radeon_connector->dac_load_detect = false;
  1753. drm_connector_attach_property(&radeon_connector->base,
  1754. rdev->mode_info.load_detect_property,
  1755. radeon_connector->dac_load_detect);
  1756. drm_connector_attach_property(&radeon_connector->base,
  1757. rdev->mode_info.tv_std_property,
  1758. radeon_combios_get_tv_info(rdev));
  1759. /* no HPD on analog connectors */
  1760. radeon_connector->hpd.hpd = RADEON_HPD_NONE;
  1761. connector->interlace_allowed = false;
  1762. connector->doublescan_allowed = false;
  1763. break;
  1764. case DRM_MODE_CONNECTOR_LVDS:
  1765. drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
  1766. drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
  1767. if (i2c_bus->valid) {
  1768. radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
  1769. if (!radeon_connector->ddc_bus)
  1770. DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
  1771. }
  1772. drm_connector_attach_property(&radeon_connector->base,
  1773. dev->mode_config.scaling_mode_property,
  1774. DRM_MODE_SCALE_FULLSCREEN);
  1775. subpixel_order = SubPixelHorizontalRGB;
  1776. connector->interlace_allowed = false;
  1777. connector->doublescan_allowed = false;
  1778. break;
  1779. }
  1780. if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
  1781. if (i2c_bus->valid)
  1782. connector->polled = DRM_CONNECTOR_POLL_CONNECT;
  1783. } else
  1784. connector->polled = DRM_CONNECTOR_POLL_HPD;
  1785. connector->display_info.subpixel_order = subpixel_order;
  1786. drm_sysfs_connector_add(connector);
  1787. if (connector_type == DRM_MODE_CONNECTOR_LVDS) {
  1788. struct drm_encoder *drm_encoder;
  1789. list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) {
  1790. struct radeon_encoder *radeon_encoder;
  1791. radeon_encoder = to_radeon_encoder(drm_encoder);
  1792. if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_LVDS)
  1793. radeon_legacy_backlight_init(radeon_encoder, connector);
  1794. }
  1795. }
  1796. }