Unreachable code

File: drivers/gpu/drm/radeon/.tmp_radeon_encoders.o.preproc
Full description: The code is unreachable by any path. Superfluous semicolon, break or return statement.
Importance: 3
Checker: ReachabilityChecker
Trace:
line 607: This node is unreachable
line 607: This node is unreachable
This one is:
False positive index (the lower the better): 0
File contents (this file is distributed under the terms specified in the original file):
    1|extern int atom_debug;
    2|
    3|
    4|bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,
    5|    struct drm_display_mode *mode);
    6|
    7|static uint32_t radeon_encoder_clones(struct drm_encoder *encoder)
    8|{
    9| struct drm_device *dev = encoder->dev;
   10| struct radeon_device *rdev = dev->dev_private;
   11| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
   12| struct drm_encoder *clone_encoder;
   13| uint32_t index_mask = 0;
   14| int count;
   15|
   16|
   17| if (rdev->family >= CHIP_R600)
   18|  return index_mask;
   19|
   20| if (radeon_encoder->devices & ((0x1L << 0x00000001 ) | (0x1L << 0x00000005 )))
   21|  return index_mask;
   22|
   23| if (radeon_encoder->devices & (0x1L << 0x00000007 ))
   24|  return index_mask;
   25|
   26| count = -1;
   27| for (clone_encoder = ({ const typeof( ((typeof(*clone_encoder) *)0)->head ) *__mptr = ((&dev->mode_config.encoder_list)->next); (typeof(*clone_encoder) *)( (char *)__mptr - 1 );}); __builtin_prefetch(clone_encoder->head.next), &clone_encoder->head != (&dev->mode_config.encoder_list); clone_encoder = ({ const typeof( ((typeof(*clone_encoder) *)0)->head ) *__mptr = (clone_encoder->head.next); (typeof(*clone_encoder) *)( (char *)__mptr - 1 );})) {
   28|  struct radeon_encoder *radeon_clone = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (clone_encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
   29|  count++;
   30|
   31|  if (clone_encoder == encoder)
   32|   continue;
   33|  if (radeon_clone->devices & (((0x1L << 0x00000001 ) | (0x1L << 0x00000005 ))))
   34|   continue;
   35|  if (radeon_clone->devices & (0x1L << 0x00000007 ))
   36|   continue;
   37|  else
   38|   index_mask |= (1 << count);
   39| }
   40| return index_mask;
   41|}
   42|
   43|void radeon_setup_encoder_clones(struct drm_device *dev)
   44|{
   45| struct drm_encoder *encoder;
   46|
   47| for (encoder = ({ const typeof( ((typeof(*encoder) *)0)->head ) *__mptr = ((&dev->mode_config.encoder_list)->next); (typeof(*encoder) *)( (char *)__mptr - 1 );}); __builtin_prefetch(encoder->head.next), &encoder->head != (&dev->mode_config.encoder_list); encoder = ({ const typeof( ((typeof(*encoder) *)0)->head ) *__mptr = (encoder->head.next); (typeof(*encoder) *)( (char *)__mptr - 1 );})) {
   48|  encoder->possible_clones = radeon_encoder_clones(encoder);
   49| }
   50|}
   51|
   52|uint32_t
   53|radeon_get_encoder_enum(struct drm_device *dev, uint32_t supported_device, uint8_t dac)
   54|{
   55| struct radeon_device *rdev = dev->dev_private;
   56| uint32_t ret = 0;
   57|
   58| switch (supported_device) {
   59| case (0x1L << 0x00000000 ):
   60| case (0x1L << 0x00000002 ):
   61| case (0x1L << 0x00000006):
   62| case (0x1L << 0x00000004 ):
   63| case (0x1L << 0x00000008 ):
   64|  switch (dac) {
   65|  case 1:
   66|   if ((rdev->family == CHIP_RS300) ||
   67|       (rdev->family == CHIP_RS400) ||
   68|       (rdev->family == CHIP_RS480))
   69|    ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x05 << 0x00);
   70|   else if (((rdev->family >= CHIP_RS600)))
   71|    ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x15 << 0x00);
   72|   else
   73|    ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x04 << 0x00);
   74|   break;
   75|  case 2:
   76|   if (((rdev->family >= CHIP_RS600)))
   77|    ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x16 << 0x00);
   78|   else {
   79|
   80|
   81|
   82|    ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x05 << 0x00);
   83|   }
   84|   break;
   85|  case 3:
   86|   if (((rdev->family >= CHIP_RS600)))
   87|    ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x14 << 0x00);
   88|   else
   89|    ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x0B << 0x00);
   90|   break;
   91|  }
   92|  break;
   93| case (0x1L << 0x00000001 ):
   94|  if (((rdev->family >= CHIP_RS600)))
   95|   ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x0F << 0x00);
   96|  else
   97|   ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x01 << 0x00);
   98|  break;
   99| case (0x1L << 0x00000003 ):
  100|  if ((rdev->family == CHIP_RS300) ||
  101|      (rdev->family == CHIP_RS400) ||
  102|      (rdev->family == CHIP_RS480))
  103|   ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x0B << 0x00);
  104|  else if (((rdev->family >= CHIP_RS600)))
  105|   ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x13 << 0x00);
  106|  else
  107|   ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x02 << 0x00);
  108|  break;
  109| case (0x1L << 0x00000005 ):
  110| case (0x1L << 0x00000007 ):
  111|  if ((rdev->family == CHIP_RS600) ||
  112|      (rdev->family == CHIP_RS690) ||
  113|      (rdev->family == CHIP_RS740))
  114|   ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x19 << 0x00);
  115|  else if (((rdev->family >= CHIP_RS600)))
  116|   ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x14 << 0x00);
  117|  else
  118|   ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x0B << 0x00);
  119|  break;
  120| case (0x1L << 0x00000009 ):
  121|  ret = ( 0x2 << 0x0C | 0x01 << 0x08 | 0x0F << 0x00);
  122|  break;
  123| }
  124|
  125| return ret;
  126|}
  127|
  128|static inline bool radeon_encoder_is_digital(struct drm_encoder *encoder)
  129|{
  130| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  131| switch (radeon_encoder->encoder_id) {
  132| case 0x01:
  133| case 0x02:
  134| case 0x13:
  135| case 0x0F:
  136| case 0x0B:
  137| case 0x14:
  138| case 0x19:
  139| case 0x1E:
  140| case 0x1F:
  141| case 0x20:
  142| case 0x21:
  143|  return true;
  144| default:
  145|  return false;
  146| }
  147|}
  148|void
  149|radeon_link_encoder_connector(struct drm_device *dev)
  150|{
  151| struct drm_connector *connector;
  152| struct radeon_connector *radeon_connector;
  153| struct drm_encoder *encoder;
  154| struct radeon_encoder *radeon_encoder;
  155|
  156|
  157| for (connector = ({ const typeof( ((typeof(*connector) *)0)->head ) *__mptr = ((&dev->mode_config.connector_list)->next); (typeof(*connector) *)( (char *)__mptr - 1 );}); __builtin_prefetch(connector->head.next), &connector->head != (&dev->mode_config.connector_list); connector = ({ const typeof( ((typeof(*connector) *)0)->head ) *__mptr = (connector->head.next); (typeof(*connector) *)( (char *)__mptr - 1 );})) {
  158|  radeon_connector = ({ const typeof( ((struct radeon_connector *)0)->base ) *__mptr = (connector); (struct radeon_connector *)( (char *)__mptr - 1 );});
  159|  for (encoder = ({ const typeof( ((typeof(*encoder) *)0)->head ) *__mptr = ((&dev->mode_config.encoder_list)->next); (typeof(*encoder) *)( (char *)__mptr - 1 );}); __builtin_prefetch(encoder->head.next), &encoder->head != (&dev->mode_config.encoder_list); encoder = ({ const typeof( ((typeof(*encoder) *)0)->head ) *__mptr = (encoder->head.next); (typeof(*encoder) *)( (char *)__mptr - 1 );})) {
  160|   radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  161|   if (radeon_encoder->devices & radeon_connector->devices)
  162|    drm_mode_connector_attach_encoder(connector, encoder);
  163|  }
  164| }
  165|}
  166|
  167|void radeon_encoder_set_active_device(struct drm_encoder *encoder)
  168|{
  169| struct drm_device *dev = encoder->dev;
  170| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  171| struct drm_connector *connector;
  172|
  173| for (connector = ({ const typeof( ((typeof(*connector) *)0)->head ) *__mptr = ((&dev->mode_config.connector_list)->next); (typeof(*connector) *)( (char *)__mptr - 1 );}); __builtin_prefetch(connector->head.next), &connector->head != (&dev->mode_config.connector_list); connector = ({ const typeof( ((typeof(*connector) *)0)->head ) *__mptr = (connector->head.next); (typeof(*connector) *)( (char *)__mptr - 1 );})) {
  174|  if (connector->encoder == encoder) {
  175|   struct radeon_connector *radeon_connector = ({ const typeof( ((struct radeon_connector *)0)->base ) *__mptr = (connector); (struct radeon_connector *)( (char *)__mptr - 1 );});
  176|   radeon_encoder->active_device = radeon_encoder->devices & radeon_connector->devices;
  177|   do { drm_ut_debug_printk(0x04, "drm", __func__, "setting active device to %08x from %08x %08x for encoder %d\n", radeon_encoder->active_device, radeon_encoder->devices, radeon_connector->devices, encoder->encoder_type); } while (0)
  178|
  179|                                                       ;
  180|  }
  181| }
  182|}
  183|
  184|struct drm_connector *
  185|radeon_get_connector_for_encoder(struct drm_encoder *encoder)
  186|{
  187| struct drm_device *dev = encoder->dev;
  188| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  189| struct drm_connector *connector;
  190| struct radeon_connector *radeon_connector;
  191|
  192| for (connector = ({ const typeof( ((typeof(*connector) *)0)->head ) *__mptr = ((&dev->mode_config.connector_list)->next); (typeof(*connector) *)( (char *)__mptr - 1 );}); __builtin_prefetch(connector->head.next), &connector->head != (&dev->mode_config.connector_list); connector = ({ const typeof( ((typeof(*connector) *)0)->head ) *__mptr = (connector->head.next); (typeof(*connector) *)( (char *)__mptr - 1 );})) {
  193|  radeon_connector = ({ const typeof( ((struct radeon_connector *)0)->base ) *__mptr = (connector); (struct radeon_connector *)( (char *)__mptr - 1 );});
  194|  if (radeon_encoder->active_device & radeon_connector->devices)
  195|   return connector;
  196| }
  197| return ((void *)0);
  198|}
  199|
  200|void radeon_panel_mode_fixup(struct drm_encoder *encoder,
  201|        struct drm_display_mode *adjusted_mode)
  202|{
  203| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  204| struct drm_device *dev = encoder->dev;
  205| struct radeon_device *rdev = dev->dev_private;
  206| struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
  207| unsigned hblank = native_mode->htotal - native_mode->hdisplay;
  208| unsigned vblank = native_mode->vtotal - native_mode->vdisplay;
  209| unsigned hover = native_mode->hsync_start - native_mode->hdisplay;
  210| unsigned vover = native_mode->vsync_start - native_mode->vdisplay;
  211| unsigned hsync_width = native_mode->hsync_end - native_mode->hsync_start;
  212| unsigned vsync_width = native_mode->vsync_end - native_mode->vsync_start;
  213|
  214| adjusted_mode->clock = native_mode->clock;
  215| adjusted_mode->flags = native_mode->flags;
  216|
  217| if (((rdev->family >= CHIP_RS600))) {
  218|  adjusted_mode->hdisplay = native_mode->hdisplay;
  219|  adjusted_mode->vdisplay = native_mode->vdisplay;
  220| }
  221|
  222| adjusted_mode->htotal = native_mode->hdisplay + hblank;
  223| adjusted_mode->hsync_start = native_mode->hdisplay + hover;
  224| adjusted_mode->hsync_end = adjusted_mode->hsync_start + hsync_width;
  225|
  226| adjusted_mode->vtotal = native_mode->vdisplay + vblank;
  227| adjusted_mode->vsync_start = native_mode->vdisplay + vover;
  228| adjusted_mode->vsync_end = adjusted_mode->vsync_start + vsync_width;
  229|
  230| drm_mode_set_crtcinfo(adjusted_mode, 0x1);
  231|
  232| if (((rdev->family >= CHIP_RS600))) {
  233|  adjusted_mode->crtc_hdisplay = native_mode->hdisplay;
  234|  adjusted_mode->crtc_vdisplay = native_mode->vdisplay;
  235| }
  236|
  237| adjusted_mode->crtc_htotal = adjusted_mode->crtc_hdisplay + hblank;
  238| adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hdisplay + hover;
  239| adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_start + hsync_width;
  240|
  241| adjusted_mode->crtc_vtotal = adjusted_mode->crtc_vdisplay + vblank;
  242| adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + vover;
  243| adjusted_mode->crtc_vsync_end = adjusted_mode->crtc_vsync_start + vsync_width;
  244|
  245|}
  246|
  247|static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
  248|       struct drm_display_mode *mode,
  249|       struct drm_display_mode *adjusted_mode)
  250|{
  251| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  252| struct drm_device *dev = encoder->dev;
  253| struct radeon_device *rdev = dev->dev_private;
  254|
  255|
  256| radeon_encoder_set_active_device(encoder);
  257| drm_mode_set_crtcinfo(adjusted_mode, 0);
  258|
  259|
  260| if ((mode->flags & (1<<4))
  261|     && (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
  262|  adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
  263|
  264|
  265| if (radeon_encoder->active_device & (((0x1L << 0x00000001 ) | (0x1L << 0x00000005 ))))
  266|  radeon_panel_mode_fixup(encoder, adjusted_mode);
  267|
  268|
  269| if (radeon_encoder->active_device & (((0x1L << 0x00000002 )))) {
  270|  struct radeon_encoder_atom_dac *tv_dac = radeon_encoder->enc_priv;
  271|  if (tv_dac) {
  272|   if (tv_dac->tv_std == TV_STD_NTSC ||
  273|       tv_dac->tv_std == TV_STD_NTSC_J ||
  274|       tv_dac->tv_std == TV_STD_PAL_M)
  275|    radeon_atom_get_tv_timings(rdev, 0, adjusted_mode);
  276|   else
  277|    radeon_atom_get_tv_timings(rdev, 1, adjusted_mode);
  278|  }
  279| }
  280|
  281| if (((rdev->family >= CHIP_RV620)) &&
  282|     (radeon_encoder->active_device & (((0x1L << 0x00000003 ) | (0x1L << 0x00000007 ) | (0x1L << 0x00000009 ) | (0x1L << 0x0000000A ) | (0x1L << 0x0000000B ) | (0x1L << 0x00000006 )) | ((0x1L << 0x00000001 ) | (0x1L << 0x00000005 ))))) {
  283|  struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
  284|  radeon_dp_set_link_config(connector, mode);
  285| }
  286|
  287| return true;
  288|}
  289|
  290|static void
  291|atombios_dac_setup(struct drm_encoder *encoder, int action)
  292|{
  293| struct drm_device *dev = encoder->dev;
  294| struct radeon_device *rdev = dev->dev_private;
  295| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  296| DAC_ENCODER_CONTROL_PARAMETERS args;
  297| int index = 0;
  298| struct radeon_encoder_atom_dac *dac_info = radeon_encoder->enc_priv;
  299|
  300| __st_memset_st__(&args, 0, sizeof(args));
  301|
  302| switch (radeon_encoder->encoder_id) {
  303| case 0x04:
  304| case 0x15:
  305|  index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DAC1EncoderControl)-(char*)0)/sizeof(USHORT));
  306|  break;
  307| case 0x05:
  308| case 0x16:
  309|  index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DAC2EncoderControl)-(char*)0)/sizeof(USHORT));
  310|  break;
  311| }
  312|
  313| args.ucAction = action;
  314|
  315| if (radeon_encoder->active_device & (((0x1L << 0x00000000 ) | (0x1L << 0x00000004 ))))
  316|  args.ucDacStandard = 1;
  317| else if (radeon_encoder->active_device & ((0x1L << 0x00000008 )))
  318|  args.ucDacStandard = 2;
  319| else {
  320|  switch (dac_info->tv_std) {
  321|  case TV_STD_PAL:
  322|  case TV_STD_PAL_M:
  323|  case TV_STD_SCART_PAL:
  324|  case TV_STD_SECAM:
  325|  case TV_STD_PAL_CN:
  326|   args.ucDacStandard = 4;
  327|   break;
  328|  case TV_STD_NTSC:
  329|  case TV_STD_NTSC_J:
  330|  case TV_STD_PAL_60:
  331|  default:
  332|   args.ucDacStandard = 3;
  333|   break;
  334|  }
  335| }
  336| args.usPixelClock = (( __le16)(__u16)(radeon_encoder->pixel_clock / 10));
  337|
  338| atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
  339|
  340|}
  341|
  342|static void
  343|atombios_tv_setup(struct drm_encoder *encoder, int action)
  344|{
  345| struct drm_device *dev = encoder->dev;
  346| struct radeon_device *rdev = dev->dev_private;
  347| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  348| TV_ENCODER_CONTROL_PS_ALLOCATION args;
  349| int index = 0;
  350| struct radeon_encoder_atom_dac *dac_info = radeon_encoder->enc_priv;
  351|
  352| __st_memset_st__(&args, 0, sizeof(args));
  353|
  354| index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->TVEncoderControl)-(char*)0)/sizeof(USHORT));
  355|
  356| args.sTVEncoder.ucAction = action;
  357|
  358| if (radeon_encoder->active_device & ((0x1L << 0x00000008 )))
  359|  args.sTVEncoder.ucTvStandard = 16;
  360| else {
  361|  switch (dac_info->tv_std) {
  362|  case TV_STD_NTSC:
  363|   args.sTVEncoder.ucTvStandard = 1;
  364|   break;
  365|  case TV_STD_PAL:
  366|   args.sTVEncoder.ucTvStandard = 3;
  367|   break;
  368|  case TV_STD_PAL_M:
  369|   args.sTVEncoder.ucTvStandard = 4;
  370|   break;
  371|  case TV_STD_PAL_60:
  372|   args.sTVEncoder.ucTvStandard = 7;
  373|   break;
  374|  case TV_STD_NTSC_J:
  375|   args.sTVEncoder.ucTvStandard = 2;
  376|   break;
  377|  case TV_STD_SCART_PAL:
  378|   args.sTVEncoder.ucTvStandard = 3;
  379|   break;
  380|  case TV_STD_SECAM:
  381|   args.sTVEncoder.ucTvStandard = 8;
  382|   break;
  383|  case TV_STD_PAL_CN:
  384|   args.sTVEncoder.ucTvStandard = 5;
  385|   break;
  386|  default:
  387|   args.sTVEncoder.ucTvStandard = 1;
  388|   break;
  389|  }
  390| }
  391|
  392| args.sTVEncoder.usPixelClock = (( __le16)(__u16)(radeon_encoder->pixel_clock / 10));
  393|
  394| atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
  395|
  396|}
  397|
  398|void
  399|atombios_external_tmds_setup(struct drm_encoder *encoder, int action)
  400|{
  401| struct drm_device *dev = encoder->dev;
  402| struct radeon_device *rdev = dev->dev_private;
  403| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  404| ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION args;
  405| int index = 0;
  406|
  407| __st_memset_st__(&args, 0, sizeof(args));
  408|
  409| index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DVOEncoderControl)-(char*)0)/sizeof(USHORT));
  410|
  411| args.sXTmdsEncoder.ucEnable = action;
  412|
  413| if (radeon_encoder->pixel_clock > 165000)
  414|  args.sXTmdsEncoder.ucMisc = 0x01;
  415|
  416|
  417| args.sXTmdsEncoder.ucMisc |= (1 << 1);
  418|
  419| atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
  420|
  421|}
  422|
  423|static void
  424|atombios_ddia_setup(struct drm_encoder *encoder, int action)
  425|{
  426| struct drm_device *dev = encoder->dev;
  427| struct radeon_device *rdev = dev->dev_private;
  428| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  429| DVO_ENCODER_CONTROL_PS_ALLOCATION args;
  430| int index = 0;
  431|
  432| __st_memset_st__(&args, 0, sizeof(args));
  433|
  434| index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DVOEncoderControl)-(char*)0)/sizeof(USHORT));
  435|
  436| args.sDVOEncoder.ucAction = action;
  437| args.sDVOEncoder.usPixelClock = (( __le16)(__u16)(radeon_encoder->pixel_clock / 10));
  438|
  439| if (radeon_encoder->pixel_clock > 165000)
  440|  args.sDVOEncoder.usDevAttr.sDigAttrib.ucAttribute = 0x01;
  441|
  442| atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
  443|
  444|}
  445|
  446|union lvds_encoder_control {
  447| LVDS_ENCODER_CONTROL_PARAMETERS v1;
  448| LVDS_ENCODER_CONTROL_PARAMETERS_V2 v2;
  449|};
  450|
  451|void
  452|atombios_digital_setup(struct drm_encoder *encoder, int action)
  453|{
  454| struct drm_device *dev = encoder->dev;
  455| struct radeon_device *rdev = dev->dev_private;
  456| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  457| struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
  458| union lvds_encoder_control args;
  459| int index = 0;
  460| int hdmi_detected = 0;
  461| uint8_t frev, crev;
  462|
  463| if (!dig)
  464|  return;
  465|
  466| if (atombios_get_encoder_mode(encoder) == 3)
  467|  hdmi_detected = 1;
  468|
  469| __st_memset_st__(&args, 0, sizeof(args));
  470|
  471| switch (radeon_encoder->encoder_id) {
  472| case 0x01:
  473|  index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->LVDSEncoderControl)-(char*)0)/sizeof(USHORT));
  474|  break;
  475| case 0x02:
  476| case 0x13:
  477|  index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->TMDSAEncoderControl)-(char*)0)/sizeof(USHORT));
  478|  break;
  479| case 0x0F:
  480|  if (radeon_encoder->devices & (((0x1L << 0x00000001 ) | (0x1L << 0x00000005 ))))
  481|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->LVDSEncoderControl)-(char*)0)/sizeof(USHORT));
  482|  else
  483|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->LVTMAEncoderControl)-(char*)0)/sizeof(USHORT));
  484|  break;
  485| }
  486|
  487| if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
  488|  return;
  489|
  490| switch (frev) {
  491| case 1:
  492| case 2:
  493|  switch (crev) {
  494|  case 1:
  495|   args.v1.ucMisc = 0;
  496|   args.v1.ucAction = action;
  497|   if (hdmi_detected)
  498|    args.v1.ucMisc |= 0x08;
  499|   args.v1.usPixelClock = (( __le16)(__u16)(radeon_encoder->pixel_clock / 10));
  500|   if (radeon_encoder->devices & (((0x1L << 0x00000001 ) | (0x1L << 0x00000005 )))) {
  501|    if (dig->lcd_misc & 0x00000001)
  502|     args.v1.ucMisc |= 0x01;
  503|    if (dig->lcd_misc & 0x00000002)
  504|     args.v1.ucMisc |= (1 << 1);
  505|   } else {
  506|    if (dig->linkb)
  507|     args.v1.ucMisc |= 0x04;
  508|    if (radeon_encoder->pixel_clock > 165000)
  509|     args.v1.ucMisc |= 0x01;
  510|
  511|    args.v1.ucMisc |= (1 << 1);
  512|   }
  513|   break;
  514|  case 2:
  515|  case 3:
  516|   args.v2.ucMisc = 0;
  517|   args.v2.ucAction = action;
  518|   if (crev == 3) {
  519|    if (dig->coherent_mode)
  520|     args.v2.ucMisc |= 0x02;
  521|   }
  522|   if (hdmi_detected)
  523|    args.v2.ucMisc |= 0x08;
  524|   args.v2.usPixelClock = (( __le16)(__u16)(radeon_encoder->pixel_clock / 10));
  525|   args.v2.ucTruncate = 0;
  526|   args.v2.ucSpatial = 0;
  527|   args.v2.ucTemporal = 0;
  528|   args.v2.ucFRC = 0;
  529|   if (radeon_encoder->devices & (((0x1L << 0x00000001 ) | (0x1L << 0x00000005 )))) {
  530|    if (dig->lcd_misc & 0x00000001)
  531|     args.v2.ucMisc |= 0x01;
  532|    if (dig->lcd_misc & 0x00000020) {
  533|     args.v2.ucSpatial = 0x01;
  534|     if (dig->lcd_misc & 0x00000002)
  535|      args.v2.ucSpatial |= 0x10;
  536|    }
  537|    if (dig->lcd_misc & 0x00000040) {
  538|     args.v2.ucTemporal = 0x01;
  539|     if (dig->lcd_misc & 0x00000002)
  540|      args.v2.ucTemporal |= 0x10;
  541|     if (((dig->lcd_misc >> 2) & 0x3) == 2)
  542|      args.v2.ucTemporal |= 0x20;
  543|    }
  544|   } else {
  545|    if (dig->linkb)
  546|     args.v2.ucMisc |= 0x04;
  547|    if (radeon_encoder->pixel_clock > 165000)
  548|     args.v2.ucMisc |= 0x01;
  549|   }
  550|   break;
  551|  default:
  552|   printk("<3>" "[" "drm" ":%s] *ERROR* " "Unknown table version %d, %d\n" , __func__ , frev, crev);
  553|   break;
  554|  }
  555|  break;
  556| default:
  557|  printk("<3>" "[" "drm" ":%s] *ERROR* " "Unknown table version %d, %d\n" , __func__ , frev, crev);
  558|  break;
  559| }
  560|
  561| atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
  562|}
  563|
  564|int
  565|atombios_get_encoder_mode(struct drm_encoder *encoder)
  566|{
  567| struct drm_device *dev = encoder->dev;
  568| struct radeon_device *rdev = dev->dev_private;
  569| struct drm_connector *connector;
  570| struct radeon_connector *radeon_connector;
  571| struct radeon_connector_atom_dig *dig_connector;
  572|
  573| connector = radeon_get_connector_for_encoder(encoder);
  574| if (!connector)
  575|  return 0;
  576|
  577| radeon_connector = ({ const typeof( ((struct radeon_connector *)0)->base ) *__mptr = (connector); (struct radeon_connector *)( (char *)__mptr - 1 );});
  578|
  579| switch (connector->connector_type) {
  580| case 2:
  581| case 12:
  582|  if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
  583|
  584|   if (((rdev->family >= CHIP_CEDAR)))
  585|    return 2;
  586|   else
  587|    return 3;
  588|  } else if (radeon_connector->use_digital)
  589|   return 2;
  590|  else
  591|   return 15;
  592|  break;
  593| case 3:
  594| case 11:
  595| default:
  596|  if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
  597|
  598|   if (((rdev->family >= CHIP_CEDAR)))
  599|    return 2;
  600|   else
  601|    return 3;
  602|  } else
  603|   return 2;
  604|  break;
  605| case 7:
  606|  return 1;
  607|  break;
     |This node is unreachable prev next
  608| case 10:
  609| case 14:
  610|  dig_connector = radeon_connector->con_priv;
  611|  if ((dig_connector->dp_sink_type == 0x13) ||
  612|      (dig_connector->dp_sink_type == 0x14))
  613|   return 0;
  614|  else if (drm_detect_hdmi_monitor(radeon_connector->edid)) {
  615|
  616|   if (((rdev->family >= CHIP_CEDAR)))
  617|    return 2;
  618|   else
  619|    return 3;
  620|  } else
  621|   return 2;
  622|  break;
  623| case 4:
  624| case 1:
  625|  return 15;
  626|  break;
  627| case 5:
  628| case 6:
  629| case 9:
  630|
  631|  return 13;
  632|
  633|  break;
  634| }
  635|}
  636|union dig_encoder_control {
  637| DIG_ENCODER_CONTROL_PARAMETERS v1;
  638| DIG_ENCODER_CONTROL_PARAMETERS_V2 v2;
  639| DIG_ENCODER_CONTROL_PARAMETERS_V3 v3;
  640|};
  641|
  642|void
  643|atombios_dig_encoder_setup(struct drm_encoder *encoder, int action)
  644|{
  645| struct drm_device *dev = encoder->dev;
  646| struct radeon_device *rdev = dev->dev_private;
  647| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  648| struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
  649| struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
  650| union dig_encoder_control args;
  651| int index = 0;
  652| uint8_t frev, crev;
  653| int dp_clock = 0;
  654| int dp_lane_count = 0;
  655|
  656| if (connector) {
  657|  struct radeon_connector *radeon_connector = ({ const typeof( ((struct radeon_connector *)0)->base ) *__mptr = (connector); (struct radeon_connector *)( (char *)__mptr - 1 );});
  658|  struct radeon_connector_atom_dig *dig_connector =
  659|   radeon_connector->con_priv;
  660|
  661|  dp_clock = dig_connector->dp_clock;
  662|  dp_lane_count = dig_connector->dp_lane_count;
  663| }
  664|
  665|
  666| if (dig->dig_encoder == -1)
  667|  return;
  668|
  669| __st_memset_st__(&args, 0, sizeof(args));
  670|
  671| if (((rdev->family >= CHIP_CEDAR)))
  672|  index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DIGxEncoderControl)-(char*)0)/sizeof(USHORT));
  673| else {
  674|  if (dig->dig_encoder)
  675|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DIG2EncoderControl)-(char*)0)/sizeof(USHORT));
  676|  else
  677|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DIG1EncoderControl)-(char*)0)/sizeof(USHORT));
  678| }
  679|
  680| if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
  681|  return;
  682|
  683| args.v1.ucAction = action;
  684| args.v1.usPixelClock = (( __le16)(__u16)(radeon_encoder->pixel_clock / 10));
  685| args.v1.ucEncoderMode = atombios_get_encoder_mode(encoder);
  686|
  687| if (args.v1.ucEncoderMode == 0) {
  688|  if (dp_clock == 270000)
  689|   args.v1.ucConfig |= 0x01;
  690|  args.v1.ucLaneNum = dp_lane_count;
  691| } else if (radeon_encoder->pixel_clock > 165000)
  692|  args.v1.ucLaneNum = 8;
  693| else
  694|  args.v1.ucLaneNum = 4;
  695|
  696| if (((rdev->family >= CHIP_CEDAR))) {
  697|  args.v3.acConfig.ucDigSel = dig->dig_encoder;
  698|  args.v3.ucBitPerColor = 0x02;
  699| } else {
  700|  switch (radeon_encoder->encoder_id) {
  701|  case 0x1E:
  702|   args.v1.ucConfig = 0x00;
  703|   break;
  704|  case 0x20:
  705|  case 0x1F:
  706|   args.v1.ucConfig = 0x08;
  707|   break;
  708|  case 0x21:
  709|   args.v1.ucConfig = 0x10;
  710|   break;
  711|  }
  712|  if (dig->linkb)
  713|   args.v1.ucConfig |= 0x04;
  714|  else
  715|   args.v1.ucConfig |= 0x00;
  716| }
  717|
  718| atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
  719|
  720|}
  721|
  722|union dig_transmitter_control {
  723| DIG_TRANSMITTER_CONTROL_PARAMETERS v1;
  724| DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2;
  725| DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3;
  726|};
  727|
  728|void
  729|atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t lane_num, uint8_t lane_set)
  730|{
  731| struct drm_device *dev = encoder->dev;
  732| struct radeon_device *rdev = dev->dev_private;
  733| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  734| struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
  735| struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
  736| union dig_transmitter_control args;
  737| int index = 0;
  738| uint8_t frev, crev;
  739| bool is_dp = false;
  740| int pll_id = 0;
  741| int dp_clock = 0;
  742| int dp_lane_count = 0;
  743| int connector_object_id = 0;
  744| int igp_lane_info = 0;
  745|
  746| if (connector) {
  747|  struct radeon_connector *radeon_connector = ({ const typeof( ((struct radeon_connector *)0)->base ) *__mptr = (connector); (struct radeon_connector *)( (char *)__mptr - 1 );});
  748|  struct radeon_connector_atom_dig *dig_connector =
  749|   radeon_connector->con_priv;
  750|
  751|  dp_clock = dig_connector->dp_clock;
  752|  dp_lane_count = dig_connector->dp_lane_count;
  753|  connector_object_id =
  754|   (radeon_connector->connector_object_id & 0x00FF) >> 0x00;
  755|  igp_lane_info = dig_connector->igp_lane_info;
  756| }
  757|
  758|
  759| if (dig->dig_encoder == -1)
  760|  return;
  761|
  762| if (atombios_get_encoder_mode(encoder) == 0)
  763|  is_dp = true;
  764|
  765| __st_memset_st__(&args, 0, sizeof(args));
  766|
  767| switch (radeon_encoder->encoder_id) {
  768| case 0x1E:
  769| case 0x20:
  770| case 0x21:
  771|  index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DIG1TransmitterControl)-(char*)0)/sizeof(USHORT));
  772|  break;
  773| case 0x1F:
  774|  index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DIG2TransmitterControl)-(char*)0)/sizeof(USHORT));
  775|  break;
  776| }
  777|
  778| if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
  779|  return;
  780|
  781| args.v1.ucAction = action;
  782| if (action == 7) {
  783|  args.v1.usInitInfo = connector_object_id;
  784| } else if (action == 11) {
  785|  args.v1.asMode.ucLaneSel = lane_num;
  786|  args.v1.asMode.ucLaneSet = lane_set;
  787| } else {
  788|  if (is_dp)
  789|   args.v1.usPixelClock =
  790|    (( __le16)(__u16)(dp_clock / 10));
  791|  else if (radeon_encoder->pixel_clock > 165000)
  792|   args.v1.usPixelClock = (( __le16)(__u16)((radeon_encoder->pixel_clock / 2) / 10));
  793|  else
  794|   args.v1.usPixelClock = (( __le16)(__u16)(radeon_encoder->pixel_clock / 10));
  795| }
  796| if (((rdev->family >= CHIP_CEDAR))) {
  797|  if (is_dp)
  798|   args.v3.ucLaneNum = dp_lane_count;
  799|  else if (radeon_encoder->pixel_clock > 165000)
  800|   args.v3.ucLaneNum = 8;
  801|  else
  802|   args.v3.ucLaneNum = 4;
  803|
  804|  if (dig->linkb) {
  805|   args.v3.acConfig.ucLinkSel = 1;
  806|   args.v3.acConfig.ucEncoderSel = 1;
  807|  }
  808|
  809|
  810|
  811|
  812|
  813|  if (encoder->crtc) {
  814|   struct radeon_crtc *radeon_crtc = ({ const typeof( ((struct radeon_crtc *)0)->base ) *__mptr = (encoder->crtc); (struct radeon_crtc *)( (char *)__mptr - 1 );});
  815|   pll_id = radeon_crtc->pll_id;
  816|  }
  817|  if (is_dp && rdev->clock.dp_extclk)
  818|   args.v3.acConfig.ucRefClkSource = 2;
  819|  else
  820|   args.v3.acConfig.ucRefClkSource = pll_id;
  821|
  822|  switch (radeon_encoder->encoder_id) {
  823|  case 0x1E:
  824|   args.v3.acConfig.ucTransmitterSel = 0;
  825|   break;
  826|  case 0x20:
  827|   args.v3.acConfig.ucTransmitterSel = 1;
  828|   break;
  829|  case 0x21:
  830|   args.v3.acConfig.ucTransmitterSel = 2;
  831|   break;
  832|  }
  833|
  834|  if (is_dp)
  835|   args.v3.acConfig.fCoherentMode = 1;
  836|  else if (radeon_encoder->devices & (((0x1L << 0x00000003 ) | (0x1L << 0x00000007 ) | (0x1L << 0x00000009 ) | (0x1L << 0x0000000A ) | (0x1L << 0x0000000B ) | (0x1L << 0x00000006 )))) {
  837|   if (dig->coherent_mode)
  838|    args.v3.acConfig.fCoherentMode = 1;
  839|   if (radeon_encoder->pixel_clock > 165000)
  840|    args.v3.acConfig.fDualLinkConnector = 1;
  841|  }
  842| } else if (((rdev->family >= CHIP_RV730))) {
  843|  args.v2.acConfig.ucEncoderSel = dig->dig_encoder;
  844|  if (dig->linkb)
  845|   args.v2.acConfig.ucLinkSel = 1;
  846|
  847|  switch (radeon_encoder->encoder_id) {
  848|  case 0x1E:
  849|   args.v2.acConfig.ucTransmitterSel = 0;
  850|   break;
  851|  case 0x20:
  852|   args.v2.acConfig.ucTransmitterSel = 1;
  853|   break;
  854|  case 0x21:
  855|   args.v2.acConfig.ucTransmitterSel = 2;
  856|   break;
  857|  }
  858|
  859|  if (is_dp)
  860|   args.v2.acConfig.fCoherentMode = 1;
  861|  else if (radeon_encoder->devices & (((0x1L << 0x00000003 ) | (0x1L << 0x00000007 ) | (0x1L << 0x00000009 ) | (0x1L << 0x0000000A ) | (0x1L << 0x0000000B ) | (0x1L << 0x00000006 )))) {
  862|   if (dig->coherent_mode)
  863|    args.v2.acConfig.fCoherentMode = 1;
  864|   if (radeon_encoder->pixel_clock > 165000)
  865|    args.v2.acConfig.fDualLinkConnector = 1;
  866|  }
  867| } else {
  868|  args.v1.ucConfig = 0x00;
  869|
  870|  if (dig->dig_encoder)
  871|   args.v1.ucConfig |= 0x08;
  872|  else
  873|   args.v1.ucConfig |= 0x00;
  874|
  875|  if ((rdev->flags & RADEON_IS_IGP) &&
  876|      (radeon_encoder->encoder_id == 0x1E)) {
  877|   if (is_dp || (radeon_encoder->pixel_clock <= 165000)) {
  878|    if (igp_lane_info & 0x1)
  879|     args.v1.ucConfig |= 0x00;
  880|    else if (igp_lane_info & 0x2)
  881|     args.v1.ucConfig |= 0x40;
  882|    else if (igp_lane_info & 0x4)
  883|     args.v1.ucConfig |= 0x80;
  884|    else if (igp_lane_info & 0x8)
  885|     args.v1.ucConfig |= 0xc0;
  886|   } else {
  887|    if (igp_lane_info & 0x3)
  888|     args.v1.ucConfig |= 0x00;
  889|    else if (igp_lane_info & 0xc)
  890|     args.v1.ucConfig |= 0x80;
  891|   }
  892|  }
  893|
  894|  if (dig->linkb)
  895|   args.v1.ucConfig |= 0x04;
  896|  else
  897|   args.v1.ucConfig |= 0x00;
  898|
  899|  if (is_dp)
  900|   args.v1.ucConfig |= 0x02;
  901|  else if (radeon_encoder->devices & (((0x1L << 0x00000003 ) | (0x1L << 0x00000007 ) | (0x1L << 0x00000009 ) | (0x1L << 0x0000000A ) | (0x1L << 0x0000000B ) | (0x1L << 0x00000006 )))) {
  902|   if (dig->coherent_mode)
  903|    args.v1.ucConfig |= 0x02;
  904|   if (radeon_encoder->pixel_clock > 165000)
  905|    args.v1.ucConfig |= 0x01;
  906|  }
  907| }
  908|
  909| atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
  910|}
  911|
  912|static void
  913|atombios_yuv_setup(struct drm_encoder *encoder, bool enable)
  914|{
  915| struct drm_device *dev = encoder->dev;
  916| struct radeon_device *rdev = dev->dev_private;
  917| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  918| struct radeon_crtc *radeon_crtc = ({ const typeof( ((struct radeon_crtc *)0)->base ) *__mptr = (encoder->crtc); (struct radeon_crtc *)( (char *)__mptr - 1 );});
  919| ENABLE_YUV_PARAMETERS args;
  920| int index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->EnableYUV)-(char*)0)/sizeof(USHORT));
  921| uint32_t temp, reg;
  922|
  923| __st_memset_st__(&args, 0, sizeof(args));
  924|
  925| if (rdev->family >= CHIP_R600)
  926|  reg = 0x1730;
  927| else
  928|  reg = 0x001c;
  929|
  930|
  931| temp = r100_mm_rreg(rdev, (reg));
  932| if (radeon_encoder->active_device & (((0x1L << 0x00000002 ))))
  933|  r100_mm_wreg(rdev, (reg), ((0x00000004L | (radeon_crtc->crtc_id << 18))))
  934|                                      ;
  935| else if (radeon_encoder->active_device & ((0x1L << 0x00000008 )))
  936|  r100_mm_wreg(rdev, (reg), ((0x00000100L | (radeon_crtc->crtc_id << 24))));
  937| else
  938|  r100_mm_wreg(rdev, (reg), (0));
  939|
  940| if (enable)
  941|  args.ucEnable = 1;
  942| args.ucCRTC = radeon_crtc->crtc_id;
  943|
  944| atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
  945|
  946| r100_mm_wreg(rdev, (reg), (temp));
  947|}
  948|
  949|static void
  950|radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)
  951|{
  952| struct drm_device *dev = encoder->dev;
  953| struct radeon_device *rdev = dev->dev_private;
  954| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
  955| DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS args;
  956| int index = 0;
  957| bool is_dig = false;
  958|
  959| __st_memset_st__(&args, 0, sizeof(args));
  960|
  961| do { drm_ut_debug_printk(0x04, "drm", __func__, "encoder dpms %d to mode %d, devices %08x, active_devices %08x\n", radeon_encoder->encoder_id, mode, radeon_encoder->devices, radeon_encoder->active_device); } while (0)
  962|
  963|                                  ;
  964| switch (radeon_encoder->encoder_id) {
  965| case 0x02:
  966| case 0x13:
  967|  index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->TMDSAOutputControl)-(char*)0)/sizeof(USHORT));
  968|  break;
  969| case 0x1E:
  970| case 0x20:
  971| case 0x21:
  972| case 0x1F:
  973|  is_dig = true;
  974|  break;
  975| case 0x0B:
  976| case 0x19:
  977| case 0x14:
  978|  index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DVOOutputControl)-(char*)0)/sizeof(USHORT));
  979|  break;
  980| case 0x01:
  981|  index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->LCD1OutputControl)-(char*)0)/sizeof(USHORT));
  982|  break;
  983| case 0x0F:
  984|  if (radeon_encoder->devices & (((0x1L << 0x00000001 ) | (0x1L << 0x00000005 ))))
  985|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->LCD1OutputControl)-(char*)0)/sizeof(USHORT));
  986|  else
  987|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->LVTMAOutputControl)-(char*)0)/sizeof(USHORT));
  988|  break;
  989| case 0x04:
  990| case 0x15:
  991|  if (radeon_encoder->active_device & (((0x1L << 0x00000002 ))))
  992|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->TV1OutputControl)-(char*)0)/sizeof(USHORT));
  993|  else if (radeon_encoder->active_device & ((0x1L << 0x00000008 )))
  994|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->CV1OutputControl)-(char*)0)/sizeof(USHORT));
  995|  else
  996|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DAC1OutputControl)-(char*)0)/sizeof(USHORT));
  997|  break;
  998| case 0x05:
  999| case 0x16:
 1000|  if (radeon_encoder->active_device & (((0x1L << 0x00000002 ))))
 1001|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->TV1OutputControl)-(char*)0)/sizeof(USHORT));
 1002|  else if (radeon_encoder->active_device & ((0x1L << 0x00000008 )))
 1003|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->CV1OutputControl)-(char*)0)/sizeof(USHORT));
 1004|  else
 1005|   index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DAC2OutputControl)-(char*)0)/sizeof(USHORT));
 1006|  break;
 1007| }
 1008|
 1009| if (is_dig) {
 1010|  switch (mode) {
 1011|  case 0:
 1012|   atombios_dig_transmitter_setup(encoder, 9, 0, 0);
 1013|   if (atombios_get_encoder_mode(encoder) == 0) {
 1014|    struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
 1015|
 1016|    dp_link_train(encoder, connector);
 1017|    if (((rdev->family >= CHIP_CEDAR)))
 1018|     atombios_dig_encoder_setup(encoder, 0x0d);
 1019|   }
 1020|   break;
 1021|  case 1:
 1022|  case 2:
 1023|  case 3:
 1024|   atombios_dig_transmitter_setup(encoder, 8, 0, 0);
 1025|   if (atombios_get_encoder_mode(encoder) == 0) {
 1026|    if (((rdev->family >= CHIP_CEDAR)))
 1027|     atombios_dig_encoder_setup(encoder, 0x0c);
 1028|   }
 1029|   break;
 1030|  }
 1031| } else {
 1032|  switch (mode) {
 1033|  case 0:
 1034|   args.ucAction = 1;
 1035|   break;
 1036|  case 1:
 1037|  case 2:
 1038|  case 3:
 1039|   args.ucAction = 0;
 1040|   break;
 1041|  }
 1042|  atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
 1043| }
 1044| radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == 0) ? true : false);
 1045|
 1046|}
 1047|
 1048|union crtc_source_param {
 1049| SELECT_CRTC_SOURCE_PARAMETERS v1;
 1050| SELECT_CRTC_SOURCE_PARAMETERS_V2 v2;
 1051|};
 1052|
 1053|static void
 1054|atombios_set_encoder_crtc_source(struct drm_encoder *encoder)
 1055|{
 1056| struct drm_device *dev = encoder->dev;
 1057| struct radeon_device *rdev = dev->dev_private;
 1058| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1059| struct radeon_crtc *radeon_crtc = ({ const typeof( ((struct radeon_crtc *)0)->base ) *__mptr = (encoder->crtc); (struct radeon_crtc *)( (char *)__mptr - 1 );});
 1060| union crtc_source_param args;
 1061| int index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->SelectCRTC_Source)-(char*)0)/sizeof(USHORT));
 1062| uint8_t frev, crev;
 1063| struct radeon_encoder_atom_dig *dig;
 1064|
 1065| __st_memset_st__(&args, 0, sizeof(args));
 1066|
 1067| if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
 1068|  return;
 1069|
 1070| switch (frev) {
 1071| case 1:
 1072|  switch (crev) {
 1073|  case 1:
 1074|  default:
 1075|   if (((rdev->family >= CHIP_RS600)))
 1076|    args.v1.ucCRTC = radeon_crtc->crtc_id;
 1077|   else {
 1078|    if (radeon_encoder->encoder_id == 0x04) {
 1079|     args.v1.ucCRTC = radeon_crtc->crtc_id;
 1080|    } else {
 1081|     args.v1.ucCRTC = radeon_crtc->crtc_id << 2;
 1082|    }
 1083|   }
 1084|   switch (radeon_encoder->encoder_id) {
 1085|   case 0x02:
 1086|   case 0x13:
 1087|    args.v1.ucDevice = 0x00000003;
 1088|    break;
 1089|   case 0x01:
 1090|   case 0x0F:
 1091|    if (radeon_encoder->devices & (0x1L << 0x00000001 ))
 1092|     args.v1.ucDevice = 0x00000001;
 1093|    else
 1094|     args.v1.ucDevice = 0x00000009;
 1095|    break;
 1096|   case 0x0B:
 1097|   case 0x19:
 1098|   case 0x14:
 1099|    args.v1.ucDevice = 0x00000007;
 1100|    break;
 1101|   case 0x04:
 1102|   case 0x15:
 1103|    if (radeon_encoder->active_device & (((0x1L << 0x00000002 ))))
 1104|     args.v1.ucDevice = 0x00000002;
 1105|    else if (radeon_encoder->active_device & ((0x1L << 0x00000008 )))
 1106|     args.v1.ucDevice = 0x00000008;
 1107|    else
 1108|     args.v1.ucDevice = 0x00000000;
 1109|    break;
 1110|   case 0x05:
 1111|   case 0x16:
 1112|    if (radeon_encoder->active_device & (((0x1L << 0x00000002 ))))
 1113|     args.v1.ucDevice = 0x00000002;
 1114|    else if (radeon_encoder->active_device & ((0x1L << 0x00000008 )))
 1115|     args.v1.ucDevice = 0x00000008;
 1116|    else
 1117|     args.v1.ucDevice = 0x00000004;
 1118|    break;
 1119|   }
 1120|   break;
 1121|  case 2:
 1122|   args.v2.ucCRTC = radeon_crtc->crtc_id;
 1123|   args.v2.ucEncodeMode = atombios_get_encoder_mode(encoder);
 1124|   switch (radeon_encoder->encoder_id) {
 1125|   case 0x1E:
 1126|   case 0x20:
 1127|   case 0x21:
 1128|   case 0x1F:
 1129|    dig = radeon_encoder->enc_priv;
 1130|    switch (dig->dig_encoder) {
 1131|    case 0:
 1132|     args.v2.ucEncoderID = 0x03;
 1133|     break;
 1134|    case 1:
 1135|     args.v2.ucEncoderID = 0x09;
 1136|     break;
 1137|    case 2:
 1138|     args.v2.ucEncoderID = 0x0a;
 1139|     break;
 1140|    case 3:
 1141|     args.v2.ucEncoderID = 0x0b;
 1142|     break;
 1143|    case 4:
 1144|     args.v2.ucEncoderID = 0x0c;
 1145|     break;
 1146|    case 5:
 1147|     args.v2.ucEncoderID = 0x0d;
 1148|     break;
 1149|    }
 1150|    break;
 1151|   case 0x14:
 1152|    args.v2.ucEncoderID = 0x07;
 1153|    break;
 1154|   case 0x15:
 1155|    if (radeon_encoder->active_device & (((0x1L << 0x00000002 ))))
 1156|     args.v2.ucEncoderID = 0x02;
 1157|    else if (radeon_encoder->active_device & ((0x1L << 0x00000008 )))
 1158|     args.v2.ucEncoderID = 0x02;
 1159|    else
 1160|     args.v2.ucEncoderID = 0x00;
 1161|    break;
 1162|   case 0x16:
 1163|    if (radeon_encoder->active_device & (((0x1L << 0x00000002 ))))
 1164|     args.v2.ucEncoderID = 0x02;
 1165|    else if (radeon_encoder->active_device & ((0x1L << 0x00000008 )))
 1166|     args.v2.ucEncoderID = 0x02;
 1167|    else
 1168|     args.v2.ucEncoderID = 0x04;
 1169|    break;
 1170|   }
 1171|   break;
 1172|  }
 1173|  break;
 1174| default:
 1175|  printk("<3>" "[" "drm" ":%s] *ERROR* " "Unknown table version: %d, %d\n" , __func__ , frev, crev);
 1176|  break;
 1177| }
 1178|
 1179| atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
 1180|
 1181|
 1182| radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id);
 1183|}
 1184|
 1185|static void
 1186|atombios_apply_encoder_quirks(struct drm_encoder *encoder,
 1187|         struct drm_display_mode *mode)
 1188|{
 1189| struct drm_device *dev = encoder->dev;
 1190| struct radeon_device *rdev = dev->dev_private;
 1191| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1192| struct radeon_crtc *radeon_crtc = ({ const typeof( ((struct radeon_crtc *)0)->base ) *__mptr = (encoder->crtc); (struct radeon_crtc *)( (char *)__mptr - 1 );});
 1193|
 1194|
 1195| if ((dev->pdev->device == 0x71C5) &&
 1196|     (dev->pdev->subsystem_vendor == 0x106b) &&
 1197|     (dev->pdev->subsystem_device == 0x0080)) {
 1198|  if (radeon_encoder->devices & (0x1L << 0x00000001 )) {
 1199|   uint32_t lvtma_bit_depth_control = r100_mm_rreg(rdev, (0x7a94));
 1200|
 1201|   lvtma_bit_depth_control &= ~(1 << 0);
 1202|   lvtma_bit_depth_control &= ~(1 << 8);
 1203|
 1204|   r100_mm_wreg(rdev, (0x7a94), (lvtma_bit_depth_control));
 1205|  }
 1206| }
 1207|
 1208|
 1209|
 1210| if (!(radeon_encoder->active_device & (((0x1L << 0x00000002 ))))) {
 1211|  if (((rdev->family >= CHIP_RS600)) && (mode->flags & (1<<4)))
 1212|   r100_mm_wreg(rdev, (0x6528 + radeon_crtc->crtc_offset), ((1 << 0)))
 1213|                                     ;
 1214| }
 1215|}
 1216|
 1217|static int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder)
 1218|{
 1219| struct drm_device *dev = encoder->dev;
 1220| struct radeon_device *rdev = dev->dev_private;
 1221| struct radeon_crtc *radeon_crtc = ({ const typeof( ((struct radeon_crtc *)0)->base ) *__mptr = (encoder->crtc); (struct radeon_crtc *)( (char *)__mptr - 1 );});
 1222| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1223| struct drm_encoder *test_encoder;
 1224| struct radeon_encoder_atom_dig *dig;
 1225| uint32_t dig_enc_in_use = 0;
 1226|
 1227| if (((rdev->family >= CHIP_CEDAR))) {
 1228|  dig = radeon_encoder->enc_priv;
 1229|  switch (radeon_encoder->encoder_id) {
 1230|  case 0x1E:
 1231|   if (dig->linkb)
 1232|    return 1;
 1233|   else
 1234|    return 0;
 1235|   break;
 1236|  case 0x20:
 1237|   if (dig->linkb)
 1238|    return 3;
 1239|   else
 1240|    return 2;
 1241|   break;
 1242|  case 0x21:
 1243|   if (dig->linkb)
 1244|    return 5;
 1245|   else
 1246|    return 4;
 1247|   break;
 1248|  }
 1249| }
 1250|
 1251|
 1252| if (((rdev->family >= CHIP_RV730))) {
 1253|  return radeon_crtc->crtc_id;
 1254| }
 1255|
 1256|
 1257| for (test_encoder = ({ const typeof( ((typeof(*test_encoder) *)0)->head ) *__mptr = ((&dev->mode_config.encoder_list)->next); (typeof(*test_encoder) *)( (char *)__mptr - 1 );}); __builtin_prefetch(test_encoder->head.next), &test_encoder->head != (&dev->mode_config.encoder_list); test_encoder = ({ const typeof( ((typeof(*test_encoder) *)0)->head ) *__mptr = (test_encoder->head.next); (typeof(*test_encoder) *)( (char *)__mptr - 1 );})) {
 1258|  struct radeon_encoder *radeon_test_encoder;
 1259|
 1260|  if (encoder == test_encoder)
 1261|   continue;
 1262|
 1263|  if (!radeon_encoder_is_digital(test_encoder))
 1264|   continue;
 1265|
 1266|  radeon_test_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (test_encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1267|  dig = radeon_test_encoder->enc_priv;
 1268|
 1269|  if (dig->dig_encoder >= 0)
 1270|   dig_enc_in_use |= (1 << dig->dig_encoder);
 1271| }
 1272|
 1273| if (radeon_encoder->encoder_id == 0x1F) {
 1274|  if (dig_enc_in_use & 0x2)
 1275|   printk("<3>" "[" "drm" ":%s] *ERROR* " "LVDS required digital encoder 2 but it was in use - stealing\n" , __func__);
 1276|  return 1;
 1277| }
 1278| if (!(dig_enc_in_use & 1))
 1279|  return 0;
 1280| return 1;
 1281|}
 1282|
 1283|static void
 1284|radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
 1285|        struct drm_display_mode *mode,
 1286|        struct drm_display_mode *adjusted_mode)
 1287|{
 1288| struct drm_device *dev = encoder->dev;
 1289| struct radeon_device *rdev = dev->dev_private;
 1290| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1291|
 1292| radeon_encoder->pixel_clock = adjusted_mode->clock;
 1293|
 1294| if (((rdev->family >= CHIP_RS600)) && !((rdev->family >= CHIP_CEDAR))) {
 1295|  if (radeon_encoder->active_device & ((0x1L << 0x00000008 ) | ((0x1L << 0x00000002 ))))
 1296|   atombios_yuv_setup(encoder, true);
 1297|  else
 1298|   atombios_yuv_setup(encoder, false);
 1299| }
 1300|
 1301| switch (radeon_encoder->encoder_id) {
 1302| case 0x02:
 1303| case 0x13:
 1304| case 0x01:
 1305| case 0x0F:
 1306|  atombios_digital_setup(encoder, 1);
 1307|  break;
 1308| case 0x1E:
 1309| case 0x20:
 1310| case 0x21:
 1311| case 0x1F:
 1312|  if (((rdev->family >= CHIP_CEDAR))) {
 1313|
 1314|   atombios_dig_transmitter_setup(encoder, 0, 0, 0);
 1315|
 1316|   atombios_dig_encoder_setup(encoder, 0x0f);
 1317|
 1318|
 1319|   atombios_dig_transmitter_setup(encoder, 7, 0, 0);
 1320|   atombios_dig_transmitter_setup(encoder, 1, 0, 0);
 1321|  } else {
 1322|
 1323|   atombios_dig_transmitter_setup(encoder, 0, 0, 0);
 1324|   atombios_dig_encoder_setup(encoder, 0);
 1325|
 1326|
 1327|   atombios_dig_encoder_setup(encoder, 1);
 1328|   atombios_dig_transmitter_setup(encoder, 7, 0, 0);
 1329|   atombios_dig_transmitter_setup(encoder, 10, 0, 0);
 1330|   atombios_dig_transmitter_setup(encoder, 1, 0, 0);
 1331|  }
 1332|  break;
 1333| case 0x19:
 1334|  atombios_ddia_setup(encoder, 1);
 1335|  break;
 1336| case 0x0B:
 1337| case 0x14:
 1338|  atombios_external_tmds_setup(encoder, 1);
 1339|  break;
 1340| case 0x04:
 1341| case 0x15:
 1342| case 0x05:
 1343| case 0x16:
 1344|  atombios_dac_setup(encoder, 1);
 1345|  if (radeon_encoder->devices & (((0x1L << 0x00000002 )) | (0x1L << 0x00000008 ))) {
 1346|   if (radeon_encoder->active_device & (((0x1L << 0x00000002 )) | (0x1L << 0x00000008 )))
 1347|    atombios_tv_setup(encoder, 1);
 1348|   else
 1349|    atombios_tv_setup(encoder, 0);
 1350|  }
 1351|  break;
 1352| }
 1353| atombios_apply_encoder_quirks(encoder, adjusted_mode);
 1354|
 1355| if (atombios_get_encoder_mode(encoder) == 3) {
 1356|  r600_hdmi_enable(encoder);
 1357|  r600_hdmi_setmode(encoder, adjusted_mode);
 1358| }
 1359|}
 1360|
 1361|static bool
 1362|atombios_dac_load_detect(struct drm_encoder *encoder, struct drm_connector *connector)
 1363|{
 1364| struct drm_device *dev = encoder->dev;
 1365| struct radeon_device *rdev = dev->dev_private;
 1366| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1367| struct radeon_connector *radeon_connector = ({ const typeof( ((struct radeon_connector *)0)->base ) *__mptr = (connector); (struct radeon_connector *)( (char *)__mptr - 1 );});
 1368|
 1369| if (radeon_encoder->devices & (((0x1L << 0x00000002 )) |
 1370|           (0x1L << 0x00000008 ) |
 1371|           ((0x1L << 0x00000000 ) | (0x1L << 0x00000004 )))) {
 1372|  DAC_LOAD_DETECTION_PS_ALLOCATION args;
 1373|  int index = (((char*)(&((ATOM_MASTER_LIST_OF_COMMAND_TABLES*)0)->DAC_LoadDetection)-(char*)0)/sizeof(USHORT));
 1374|  uint8_t frev, crev;
 1375|
 1376|  __st_memset_st__(&args, 0, sizeof(args));
 1377|
 1378|  if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev))
 1379|   return false;
 1380|
 1381|  args.sDacload.ucMisc = 0;
 1382|
 1383|  if ((radeon_encoder->encoder_id == 0x04) ||
 1384|      (radeon_encoder->encoder_id == 0x15))
 1385|   args.sDacload.ucDacType = 0;
 1386|  else
 1387|   args.sDacload.ucDacType = 1;
 1388|
 1389|  if (radeon_connector->devices & (0x1L << 0x00000000 ))
 1390|   args.sDacload.usDeviceID = (( __le16)(__u16)((0x1L << 0x00000000 )));
 1391|  else if (radeon_connector->devices & (0x1L << 0x00000004 ))
 1392|   args.sDacload.usDeviceID = (( __le16)(__u16)((0x1L << 0x00000004 )));
 1393|  else if (radeon_connector->devices & (0x1L << 0x00000008 )) {
 1394|   args.sDacload.usDeviceID = (( __le16)(__u16)((0x1L << 0x00000008 )));
 1395|   if (crev >= 3)
 1396|    args.sDacload.ucMisc = 0x01;
 1397|  } else if (radeon_connector->devices & (0x1L << 0x00000002 )) {
 1398|   args.sDacload.usDeviceID = (( __le16)(__u16)((0x1L << 0x00000002 )));
 1399|   if (crev >= 3)
 1400|    args.sDacload.ucMisc = 0x01;
 1401|  }
 1402|
 1403|  atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);
 1404|
 1405|  return true;
 1406| } else
 1407|  return false;
 1408|}
 1409|
 1410|static enum drm_connector_status
 1411|radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connector)
 1412|{
 1413| struct drm_device *dev = encoder->dev;
 1414| struct radeon_device *rdev = dev->dev_private;
 1415| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1416| struct radeon_connector *radeon_connector = ({ const typeof( ((struct radeon_connector *)0)->base ) *__mptr = (connector); (struct radeon_connector *)( (char *)__mptr - 1 );});
 1417| uint32_t bios_0_scratch;
 1418|
 1419| if (!atombios_dac_load_detect(encoder, connector)) {
 1420|  do { drm_ut_debug_printk(0x04, "drm", __func__, "detect returned false \n"); } while (0);
 1421|  return connector_status_unknown;
 1422| }
 1423|
 1424| if (rdev->family >= CHIP_R600)
 1425|  bios_0_scratch = r100_mm_rreg(rdev, (0x1724));
 1426| else
 1427|  bios_0_scratch = r100_mm_rreg(rdev, (0x0010));
 1428|
 1429| do { drm_ut_debug_printk(0x04, "drm", __func__, "Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices); } while (0);
 1430| if (radeon_connector->devices & (0x1L << 0x00000000 )) {
 1431|  if (bios_0_scratch & (0x00000001L +0x00000002L))
 1432|   return connector_status_connected;
 1433| }
 1434| if (radeon_connector->devices & (0x1L << 0x00000004 )) {
 1435|  if (bios_0_scratch & (0x00000100L +0x00000200L))
 1436|   return connector_status_connected;
 1437| }
 1438| if (radeon_connector->devices & (0x1L << 0x00000008 )) {
 1439|  if (bios_0_scratch & ((0x00001000L +0x00002000L)|(0x00000010L +0x00000020L)))
 1440|   return connector_status_connected;
 1441| }
 1442| if (radeon_connector->devices & (0x1L << 0x00000002 )) {
 1443|  if (bios_0_scratch & (0x00000400L | 0x00000004L))
 1444|   return connector_status_connected;
 1445|  else if (bios_0_scratch & (0x00000800L | 0x00000008L))
 1446|   return connector_status_connected;
 1447| }
 1448| return connector_status_disconnected;
 1449|}
 1450|
 1451|static void radeon_atom_encoder_prepare(struct drm_encoder *encoder)
 1452|{
 1453| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1454| struct drm_connector *connector = radeon_get_connector_for_encoder(encoder);
 1455|
 1456| if (radeon_encoder->active_device &
 1457|     (((0x1L << 0x00000003 ) | (0x1L << 0x00000007 ) | (0x1L << 0x00000009 ) | (0x1L << 0x0000000A ) | (0x1L << 0x0000000B ) | (0x1L << 0x00000006 )) | ((0x1L << 0x00000001 ) | (0x1L << 0x00000005 )))) {
 1458|  struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;
 1459|  if (dig)
 1460|   dig->dig_encoder = radeon_atom_pick_dig_encoder(encoder);
 1461| }
 1462|
 1463| radeon_atom_output_lock(encoder, true);
 1464| radeon_atom_encoder_dpms(encoder, 3);
 1465|
 1466|
 1467| if (connector) {
 1468|  struct radeon_connector *radeon_connector = ({ const typeof( ((struct radeon_connector *)0)->base ) *__mptr = (connector); (struct radeon_connector *)( (char *)__mptr - 1 );});
 1469|  if (radeon_connector->router.cd_valid)
 1470|   radeon_router_select_cd_port(radeon_connector);
 1471| }
 1472|
 1473|
 1474| atombios_set_encoder_crtc_source(encoder);
 1475|}
 1476|
 1477|static void radeon_atom_encoder_commit(struct drm_encoder *encoder)
 1478|{
 1479| radeon_atom_encoder_dpms(encoder, 0);
 1480| radeon_atom_output_lock(encoder, false);
 1481|}
 1482|
 1483|static void radeon_atom_encoder_disable(struct drm_encoder *encoder)
 1484|{
 1485| struct drm_device *dev = encoder->dev;
 1486| struct radeon_device *rdev = dev->dev_private;
 1487| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1488| struct radeon_encoder_atom_dig *dig;
 1489|
 1490|
 1491|
 1492|
 1493|
 1494| if (!((rdev->family >= CHIP_RV620))) {
 1495|  struct drm_encoder *other_encoder;
 1496|  struct radeon_encoder *other_radeon_encoder;
 1497|
 1498|  for (other_encoder = ({ const typeof( ((typeof(*other_encoder) *)0)->head ) *__mptr = ((&dev->mode_config.encoder_list)->next); (typeof(*other_encoder) *)( (char *)__mptr - 1 );}); __builtin_prefetch(other_encoder->head.next), &other_encoder->head != (&dev->mode_config.encoder_list); other_encoder = ({ const typeof( ((typeof(*other_encoder) *)0)->head ) *__mptr = (other_encoder->head.next); (typeof(*other_encoder) *)( (char *)__mptr - 1 );})) {
 1499|   other_radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (other_encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1500|   if ((radeon_encoder->encoder_id == other_radeon_encoder->encoder_id) &&
 1501|       drm_helper_encoder_in_use(other_encoder))
 1502|    goto disable_done;
 1503|  }
 1504| }
 1505|
 1506| radeon_atom_encoder_dpms(encoder, 3);
 1507|
 1508| switch (radeon_encoder->encoder_id) {
 1509| case 0x02:
 1510| case 0x13:
 1511| case 0x01:
 1512| case 0x0F:
 1513|  atombios_digital_setup(encoder, 0);
 1514|  break;
 1515| case 0x1E:
 1516| case 0x20:
 1517| case 0x21:
 1518| case 0x1F:
 1519|  if (((rdev->family >= CHIP_CEDAR)))
 1520|
 1521|   atombios_dig_transmitter_setup(encoder, 0, 0, 0);
 1522|  else {
 1523|
 1524|   atombios_dig_transmitter_setup(encoder, 0, 0, 0);
 1525|   atombios_dig_encoder_setup(encoder, 0);
 1526|  }
 1527|  break;
 1528| case 0x19:
 1529|  atombios_ddia_setup(encoder, 0);
 1530|  break;
 1531| case 0x0B:
 1532| case 0x14:
 1533|  atombios_external_tmds_setup(encoder, 0);
 1534|  break;
 1535| case 0x04:
 1536| case 0x15:
 1537| case 0x05:
 1538| case 0x16:
 1539|  atombios_dac_setup(encoder, 0);
 1540|  if (radeon_encoder->devices & (((0x1L << 0x00000002 )) | (0x1L << 0x00000008 )))
 1541|   atombios_tv_setup(encoder, 0);
 1542|  break;
 1543| }
 1544|
 1545|disable_done:
 1546| if (radeon_encoder_is_digital(encoder)) {
 1547|  if (atombios_get_encoder_mode(encoder) == 3)
 1548|   r600_hdmi_disable(encoder);
 1549|  dig = radeon_encoder->enc_priv;
 1550|  dig->dig_encoder = -1;
 1551| }
 1552| radeon_encoder->active_device = 0;
 1553|}
 1554|
 1555|static const struct drm_encoder_helper_funcs radeon_atom_dig_helper_funcs = {
 1556| .dpms = radeon_atom_encoder_dpms,
 1557| .mode_fixup = radeon_atom_mode_fixup,
 1558| .prepare = radeon_atom_encoder_prepare,
 1559| .mode_set = radeon_atom_encoder_mode_set,
 1560| .commit = radeon_atom_encoder_commit,
 1561| .disable = radeon_atom_encoder_disable,
 1562|
 1563|};
 1564|
 1565|static const struct drm_encoder_helper_funcs radeon_atom_dac_helper_funcs = {
 1566| .dpms = radeon_atom_encoder_dpms,
 1567| .mode_fixup = radeon_atom_mode_fixup,
 1568| .prepare = radeon_atom_encoder_prepare,
 1569| .mode_set = radeon_atom_encoder_mode_set,
 1570| .commit = radeon_atom_encoder_commit,
 1571| .detect = radeon_atom_dac_detect,
 1572|};
 1573|
 1574|void radeon_enc_destroy(struct drm_encoder *encoder)
 1575|{
 1576| struct radeon_encoder *radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1577| kfree(radeon_encoder->enc_priv);
 1578| drm_encoder_cleanup(encoder);
 1579| kfree(radeon_encoder);
 1580|}
 1581|
 1582|static const struct drm_encoder_funcs radeon_atom_enc_funcs = {
 1583| .destroy = radeon_enc_destroy,
 1584|};
 1585|
 1586|struct radeon_encoder_atom_dac *
 1587|radeon_atombios_set_dac_info(struct radeon_encoder *radeon_encoder)
 1588|{
 1589| struct drm_device *dev = radeon_encoder->base.dev;
 1590| struct radeon_device *rdev = dev->dev_private;
 1591| struct radeon_encoder_atom_dac *dac = kzalloc(sizeof(struct radeon_encoder_atom_dac), __st_GFP_KERNEL_st__);
 1592|
 1593| if (!dac)
 1594|  return ((void *)0);
 1595|
 1596| dac->tv_std = radeon_atombios_get_tv_info(rdev);
 1597| return dac;
 1598|}
 1599|
 1600|struct radeon_encoder_atom_dig *
 1601|radeon_atombios_set_dig_info(struct radeon_encoder *radeon_encoder)
 1602|{
 1603| int encoder_enum = (radeon_encoder->encoder_enum & 0x0700) >> 0x08;
 1604| struct radeon_encoder_atom_dig *dig = kzalloc(sizeof(struct radeon_encoder_atom_dig), __st_GFP_KERNEL_st__);
 1605|
 1606| if (!dig)
 1607|  return ((void *)0);
 1608|
 1609|
 1610| dig->coherent_mode = true;
 1611| dig->dig_encoder = -1;
 1612|
 1613| if (encoder_enum == 2)
 1614|  dig->linkb = true;
 1615| else
 1616|  dig->linkb = false;
 1617|
 1618| return dig;
 1619|}
 1620|
 1621|void
 1622|radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum, uint32_t supported_device)
 1623|{
 1624| struct radeon_device *rdev = dev->dev_private;
 1625| struct drm_encoder *encoder;
 1626| struct radeon_encoder *radeon_encoder;
 1627|
 1628|
 1629| for (encoder = ({ const typeof( ((typeof(*encoder) *)0)->head ) *__mptr = ((&dev->mode_config.encoder_list)->next); (typeof(*encoder) *)( (char *)__mptr - 1 );}); __builtin_prefetch(encoder->head.next), &encoder->head != (&dev->mode_config.encoder_list); encoder = ({ const typeof( ((typeof(*encoder) *)0)->head ) *__mptr = (encoder->head.next); (typeof(*encoder) *)( (char *)__mptr - 1 );})) {
 1630|  radeon_encoder = ({ const typeof( ((struct radeon_encoder *)0)->base ) *__mptr = (encoder); (struct radeon_encoder *)( (char *)__mptr - 1 );});
 1631|  if (radeon_encoder->encoder_enum == encoder_enum) {
 1632|   radeon_encoder->devices |= supported_device;
 1633|   return;
 1634|  }
 1635|
 1636| }
 1637|
 1638|
 1639| radeon_encoder = kzalloc(sizeof(struct radeon_encoder), __st_GFP_KERNEL_st__);
 1640| if (!radeon_encoder)
 1641|  return;
 1642|
 1643| encoder = &radeon_encoder->base;
 1644| switch (rdev->num_crtc) {
 1645| case 1:
 1646|  encoder->possible_crtcs = 0x1;
 1647|  break;
 1648| case 2:
 1649| default:
 1650|  encoder->possible_crtcs = 0x3;
 1651|  break;
 1652| case 6:
 1653|  encoder->possible_crtcs = 0x3f;
 1654|  break;
 1655| }
 1656|
 1657| radeon_encoder->enc_priv = ((void *)0);
 1658|
 1659| radeon_encoder->encoder_enum = encoder_enum;
 1660| radeon_encoder->encoder_id = (encoder_enum & 0x00FF) >> 0x00;
 1661| radeon_encoder->devices = supported_device;
 1662| radeon_encoder->rmx_type = RMX_OFF;
 1663| radeon_encoder->underscan_type = UNDERSCAN_OFF;
 1664|
 1665| switch (radeon_encoder->encoder_id) {
 1666| case 0x01:
 1667| case 0x02:
 1668| case 0x13:
 1669| case 0x0F:
 1670|  if (radeon_encoder->devices & (((0x1L << 0x00000001 ) | (0x1L << 0x00000005 )))) {
 1671|   radeon_encoder->rmx_type = RMX_FULL;
 1672|   drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 3);
 1673|   radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder);
 1674|  } else {
 1675|   drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2);
 1676|   radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
 1677|   if (((rdev->family >= CHIP_RS600)))
 1678|    radeon_encoder->underscan_type = UNDERSCAN_AUTO;
 1679|  }
 1680|  drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);
 1681|  break;
 1682| case 0x04:
 1683|  drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 1);
 1684|  radeon_encoder->enc_priv = radeon_atombios_set_dac_info(radeon_encoder);
 1685|  drm_encoder_helper_add(encoder, &radeon_atom_dac_helper_funcs);
 1686|  break;
 1687| case 0x05:
 1688| case 0x15:
 1689| case 0x16:
 1690|  drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 4);
 1691|  radeon_encoder->enc_priv = radeon_atombios_set_dac_info(radeon_encoder);
 1692|  drm_encoder_helper_add(encoder, &radeon_atom_dac_helper_funcs);
 1693|  break;
 1694| case 0x0B:
 1695| case 0x14:
 1696| case 0x19:
 1697| case 0x1E:
 1698| case 0x1F:
 1699| case 0x20:
 1700| case 0x21:
 1701|  if (radeon_encoder->devices & (((0x1L << 0x00000001 ) | (0x1L << 0x00000005 )))) {
 1702|   radeon_encoder->rmx_type = RMX_FULL;
 1703|   drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 3);
 1704|   radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder);
 1705|  } else {
 1706|   drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, 2);
 1707|   radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder);
 1708|   if (((rdev->family >= CHIP_RS600)))
 1709|    radeon_encoder->underscan_type = UNDERSCAN_AUTO;
 1710|  }
 1711|  drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);
 1712|  break;
 1713| }
 1714|}