mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 11:16:42 +07:00
Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6: drm/radeon/kms: add FireMV 2400 PCI ID. drm/radeon/kms: allow R500 regs VAP_ALT_NUM_VERTICES and VAP_INDEX_OFFSET drivers/gpu/radeon: Add MSPOS regs to safe list. drm/radeon/kms: disable the tv encoder when tv/cv is not in use drm/radeon/kms: adjust pll settings for tv drm/radeon/kms: fix tv dac conflict resolver drm/radeon/kms/evergreen: don't enable hdmi audio stuff drm/radeon/kms/atom: fix dual-link DVI on DCE3.2/4.0 drm/radeon/kms: fix rs600 tlb flush drm/radeon/kms: print GPU family and device id when loading drm/radeon/kms: fix calculation of mipmapped 3D texture sizes drm/radeon/kms: only change mode when coherent value changes. drm/radeon/kms: more atom parser fixes (v2)
This commit is contained in:
commit
73c6c7fbb7
@ -908,11 +908,16 @@ static void atom_op_shl(atom_exec_context *ctx, int *ptr, int arg)
|
||||
uint8_t attr = U8((*ptr)++), shift;
|
||||
uint32_t saved, dst;
|
||||
int dptr = *ptr;
|
||||
uint32_t dst_align = atom_dst_to_src[(attr >> 3) & 7][(attr >> 6) & 3];
|
||||
SDEBUG(" dst: ");
|
||||
dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
|
||||
/* op needs to full dst value */
|
||||
dst = saved;
|
||||
shift = atom_get_src(ctx, attr, ptr);
|
||||
SDEBUG(" shift: %d\n", shift);
|
||||
dst <<= shift;
|
||||
dst &= atom_arg_mask[dst_align];
|
||||
dst >>= atom_arg_shift[dst_align];
|
||||
SDEBUG(" dst: ");
|
||||
atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
|
||||
}
|
||||
@ -922,11 +927,16 @@ static void atom_op_shr(atom_exec_context *ctx, int *ptr, int arg)
|
||||
uint8_t attr = U8((*ptr)++), shift;
|
||||
uint32_t saved, dst;
|
||||
int dptr = *ptr;
|
||||
uint32_t dst_align = atom_dst_to_src[(attr >> 3) & 7][(attr >> 6) & 3];
|
||||
SDEBUG(" dst: ");
|
||||
dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
|
||||
/* op needs to full dst value */
|
||||
dst = saved;
|
||||
shift = atom_get_src(ctx, attr, ptr);
|
||||
SDEBUG(" shift: %d\n", shift);
|
||||
dst >>= shift;
|
||||
dst &= atom_arg_mask[dst_align];
|
||||
dst >>= atom_arg_shift[dst_align];
|
||||
SDEBUG(" dst: ");
|
||||
atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
|
||||
}
|
||||
|
@ -521,6 +521,10 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc,
|
||||
/* DVO wants 2x pixel clock if the DVO chip is in 12 bit mode */
|
||||
if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1)
|
||||
adjusted_clock = mode->clock * 2;
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) {
|
||||
pll->algo = PLL_ALGO_LEGACY;
|
||||
pll->flags |= RADEON_PLL_PREFER_CLOSEST_LOWER;
|
||||
}
|
||||
} else {
|
||||
if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
|
||||
pll->flags |= RADEON_PLL_NO_ODD_POST_DIV;
|
||||
|
@ -2891,7 +2891,7 @@ static int r100_cs_track_texture_check(struct radeon_device *rdev,
|
||||
{
|
||||
struct radeon_bo *robj;
|
||||
unsigned long size;
|
||||
unsigned u, i, w, h;
|
||||
unsigned u, i, w, h, d;
|
||||
int ret;
|
||||
|
||||
for (u = 0; u < track->num_texture; u++) {
|
||||
@ -2923,20 +2923,25 @@ static int r100_cs_track_texture_check(struct radeon_device *rdev,
|
||||
h = h / (1 << i);
|
||||
if (track->textures[u].roundup_h)
|
||||
h = roundup_pow_of_two(h);
|
||||
if (track->textures[u].tex_coord_type == 1) {
|
||||
d = (1 << track->textures[u].txdepth) / (1 << i);
|
||||
if (!d)
|
||||
d = 1;
|
||||
} else {
|
||||
d = 1;
|
||||
}
|
||||
if (track->textures[u].compress_format) {
|
||||
|
||||
size += r100_track_compress_size(track->textures[u].compress_format, w, h);
|
||||
size += r100_track_compress_size(track->textures[u].compress_format, w, h) * d;
|
||||
/* compressed textures are block based */
|
||||
} else
|
||||
size += w * h;
|
||||
size += w * h * d;
|
||||
}
|
||||
size *= track->textures[u].cpp;
|
||||
|
||||
switch (track->textures[u].tex_coord_type) {
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
size *= (1 << track->textures[u].txdepth);
|
||||
break;
|
||||
case 2:
|
||||
if (track->separate_cube) {
|
||||
@ -3007,7 +3012,11 @@ int r100_cs_track_check(struct radeon_device *rdev, struct r100_cs_track *track)
|
||||
}
|
||||
}
|
||||
prim_walk = (track->vap_vf_cntl >> 4) & 0x3;
|
||||
nverts = (track->vap_vf_cntl >> 16) & 0xFFFF;
|
||||
if (track->vap_vf_cntl & (1 << 14)) {
|
||||
nverts = track->vap_alt_nverts;
|
||||
} else {
|
||||
nverts = (track->vap_vf_cntl >> 16) & 0xFFFF;
|
||||
}
|
||||
switch (prim_walk) {
|
||||
case 1:
|
||||
for (i = 0; i < track->num_arrays; i++) {
|
||||
|
@ -64,6 +64,7 @@ struct r100_cs_track {
|
||||
unsigned maxy;
|
||||
unsigned vtx_size;
|
||||
unsigned vap_vf_cntl;
|
||||
unsigned vap_alt_nverts;
|
||||
unsigned immd_dwords;
|
||||
unsigned num_arrays;
|
||||
unsigned max_indx;
|
||||
|
@ -730,6 +730,12 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
/* VAP_VF_MAX_VTX_INDX */
|
||||
track->max_indx = idx_value & 0x00FFFFFFUL;
|
||||
break;
|
||||
case 0x2088:
|
||||
/* VAP_ALT_NUM_VERTICES - only valid on r500 */
|
||||
if (p->rdev->family < CHIP_RV515)
|
||||
goto fail;
|
||||
track->vap_alt_nverts = idx_value & 0xFFFFFF;
|
||||
break;
|
||||
case 0x43E4:
|
||||
/* SC_SCISSOR1 */
|
||||
track->maxy = ((idx_value >> 13) & 0x1FFF) + 1;
|
||||
@ -767,7 +773,6 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
tmp = idx_value & ~(0x7 << 16);
|
||||
tmp |= tile_flags;
|
||||
ib[idx] = tmp;
|
||||
|
||||
i = (reg - 0x4E38) >> 2;
|
||||
track->cb[i].pitch = idx_value & 0x3FFE;
|
||||
switch (((idx_value >> 21) & 0xF)) {
|
||||
@ -1052,11 +1057,13 @@ static int r300_packet0_check(struct radeon_cs_parser *p,
|
||||
break;
|
||||
/* fallthrough do not move */
|
||||
default:
|
||||
printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",
|
||||
reg, idx);
|
||||
return -EINVAL;
|
||||
goto fail;
|
||||
}
|
||||
return 0;
|
||||
fail:
|
||||
printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n",
|
||||
reg, idx);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int r300_packet3_check(struct radeon_cs_parser *p,
|
||||
|
@ -35,7 +35,7 @@
|
||||
*/
|
||||
static int r600_audio_chipset_supported(struct radeon_device *rdev)
|
||||
{
|
||||
return rdev->family >= CHIP_R600
|
||||
return (rdev->family >= CHIP_R600 && rdev->family < CHIP_CEDAR)
|
||||
|| rdev->family == CHIP_RS600
|
||||
|| rdev->family == CHIP_RS690
|
||||
|| rdev->family == CHIP_RS740;
|
||||
|
@ -314,6 +314,9 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
uint32_t offset = to_radeon_encoder(encoder)->hdmi_offset;
|
||||
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
return;
|
||||
|
||||
if (!offset)
|
||||
return;
|
||||
|
||||
@ -484,6 +487,9 @@ void r600_hdmi_enable(struct drm_encoder *encoder)
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
return;
|
||||
|
||||
if (!radeon_encoder->hdmi_offset) {
|
||||
r600_hdmi_assign_block(encoder);
|
||||
if (!radeon_encoder->hdmi_offset) {
|
||||
@ -525,6 +531,9 @@ void r600_hdmi_disable(struct drm_encoder *encoder)
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
|
||||
|
||||
if (ASIC_IS_DCE4(rdev))
|
||||
return;
|
||||
|
||||
if (!radeon_encoder->hdmi_offset) {
|
||||
dev_err(rdev->dev, "Disabling not enabled HDMI\n");
|
||||
return;
|
||||
|
@ -162,12 +162,14 @@ radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct drm_connector *conflict;
|
||||
struct radeon_connector *radeon_conflict;
|
||||
int i;
|
||||
|
||||
list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
|
||||
if (conflict == connector)
|
||||
continue;
|
||||
|
||||
radeon_conflict = to_radeon_connector(conflict);
|
||||
for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
|
||||
if (conflict->encoder_ids[i] == 0)
|
||||
break;
|
||||
@ -177,6 +179,9 @@ radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
|
||||
if (conflict->status != connector_status_connected)
|
||||
continue;
|
||||
|
||||
if (radeon_conflict->use_digital)
|
||||
continue;
|
||||
|
||||
if (priority == true) {
|
||||
DRM_INFO("1: conflicting encoders switching off %s\n", drm_get_connector_name(conflict));
|
||||
DRM_INFO("in favor of %s\n", drm_get_connector_name(connector));
|
||||
@ -287,6 +292,7 @@ int radeon_connector_set_property(struct drm_connector *connector, struct drm_pr
|
||||
|
||||
if (property == rdev->mode_info.coherent_mode_property) {
|
||||
struct radeon_encoder_atom_dig *dig;
|
||||
bool new_coherent_mode;
|
||||
|
||||
/* need to find digital encoder on connector */
|
||||
encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
|
||||
@ -299,8 +305,11 @@ int radeon_connector_set_property(struct drm_connector *connector, struct drm_pr
|
||||
return 0;
|
||||
|
||||
dig = radeon_encoder->enc_priv;
|
||||
dig->coherent_mode = val ? true : false;
|
||||
radeon_property_change_mode(&radeon_encoder->base);
|
||||
new_coherent_mode = val ? true : false;
|
||||
if (dig->coherent_mode != new_coherent_mode) {
|
||||
dig->coherent_mode = new_coherent_mode;
|
||||
radeon_property_change_mode(&radeon_encoder->base);
|
||||
}
|
||||
}
|
||||
|
||||
if (property == rdev->mode_info.tv_std_property) {
|
||||
|
@ -36,6 +36,54 @@
|
||||
#include "radeon.h"
|
||||
#include "atom.h"
|
||||
|
||||
static const char radeon_family_name[][16] = {
|
||||
"R100",
|
||||
"RV100",
|
||||
"RS100",
|
||||
"RV200",
|
||||
"RS200",
|
||||
"R200",
|
||||
"RV250",
|
||||
"RS300",
|
||||
"RV280",
|
||||
"R300",
|
||||
"R350",
|
||||
"RV350",
|
||||
"RV380",
|
||||
"R420",
|
||||
"R423",
|
||||
"RV410",
|
||||
"RS400",
|
||||
"RS480",
|
||||
"RS600",
|
||||
"RS690",
|
||||
"RS740",
|
||||
"RV515",
|
||||
"R520",
|
||||
"RV530",
|
||||
"RV560",
|
||||
"RV570",
|
||||
"R580",
|
||||
"R600",
|
||||
"RV610",
|
||||
"RV630",
|
||||
"RV670",
|
||||
"RV620",
|
||||
"RV635",
|
||||
"RS780",
|
||||
"RS880",
|
||||
"RV770",
|
||||
"RV730",
|
||||
"RV710",
|
||||
"RV740",
|
||||
"CEDAR",
|
||||
"REDWOOD",
|
||||
"JUNIPER",
|
||||
"CYPRESS",
|
||||
"HEMLOCK",
|
||||
"LAST",
|
||||
};
|
||||
|
||||
/*
|
||||
* Clear GPU surface registers.
|
||||
*/
|
||||
@ -526,7 +574,6 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||
int r;
|
||||
int dma_bits;
|
||||
|
||||
DRM_INFO("radeon: Initializing kernel modesetting.\n");
|
||||
rdev->shutdown = false;
|
||||
rdev->dev = &pdev->dev;
|
||||
rdev->ddev = ddev;
|
||||
@ -538,6 +585,10 @@ int radeon_device_init(struct radeon_device *rdev,
|
||||
rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
|
||||
rdev->gpu_lockup = false;
|
||||
rdev->accel_working = false;
|
||||
|
||||
DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X).\n",
|
||||
radeon_family_name[rdev->family], pdev->vendor, pdev->device);
|
||||
|
||||
/* mutex initialization are all done here so we
|
||||
* can recall function without having locking issues */
|
||||
mutex_init(&rdev->cs_mutex);
|
||||
|
@ -43,9 +43,10 @@
|
||||
* - 2.0.0 - initial interface
|
||||
* - 2.1.0 - add square tiling interface
|
||||
* - 2.2.0 - add r6xx/r7xx const buffer support
|
||||
* - 2.3.0 - add MSPOS + 3D texture + r500 VAP regs
|
||||
*/
|
||||
#define KMS_DRIVER_MAJOR 2
|
||||
#define KMS_DRIVER_MINOR 2
|
||||
#define KMS_DRIVER_MINOR 3
|
||||
#define KMS_DRIVER_PATCHLEVEL 0
|
||||
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);
|
||||
int radeon_driver_unload_kms(struct drm_device *dev);
|
||||
|
@ -865,6 +865,8 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
|
||||
if (dig->coherent_mode)
|
||||
args.v3.acConfig.fCoherentMode = 1;
|
||||
if (radeon_encoder->pixel_clock > 165000)
|
||||
args.v3.acConfig.fDualLinkConnector = 1;
|
||||
}
|
||||
} else if (ASIC_IS_DCE32(rdev)) {
|
||||
args.v2.acConfig.ucEncoderSel = dig->dig_encoder;
|
||||
@ -888,6 +890,8 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t
|
||||
else if (radeon_encoder->devices & (ATOM_DEVICE_DFP_SUPPORT)) {
|
||||
if (dig->coherent_mode)
|
||||
args.v2.acConfig.fCoherentMode = 1;
|
||||
if (radeon_encoder->pixel_clock > 165000)
|
||||
args.v2.acConfig.fDualLinkConnector = 1;
|
||||
}
|
||||
} else {
|
||||
args.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL;
|
||||
@ -1373,8 +1377,12 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder,
|
||||
case ENCODER_OBJECT_ID_INTERNAL_DAC2:
|
||||
case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2:
|
||||
atombios_dac_setup(encoder, ATOM_ENABLE);
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))
|
||||
atombios_tv_setup(encoder, ATOM_ENABLE);
|
||||
if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) {
|
||||
if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT))
|
||||
atombios_tv_setup(encoder, ATOM_ENABLE);
|
||||
else
|
||||
atombios_tv_setup(encoder, ATOM_DISABLE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
atombios_apply_encoder_quirks(encoder, adjusted_mode);
|
||||
|
@ -36,7 +36,7 @@
|
||||
* Radeon chip families
|
||||
*/
|
||||
enum radeon_family {
|
||||
CHIP_R100,
|
||||
CHIP_R100 = 0,
|
||||
CHIP_RV100,
|
||||
CHIP_RS100,
|
||||
CHIP_RV200,
|
||||
@ -99,4 +99,5 @@ enum radeon_chip_flags {
|
||||
RADEON_IS_PCI = 0x00800000UL,
|
||||
RADEON_IS_IGPGART = 0x01000000UL,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -125,6 +125,8 @@ r300 0x4f60
|
||||
0x4000 GB_VAP_RASTER_VTX_FMT_0
|
||||
0x4004 GB_VAP_RASTER_VTX_FMT_1
|
||||
0x4008 GB_ENABLE
|
||||
0x4010 GB_MSPOS0
|
||||
0x4014 GB_MSPOS1
|
||||
0x401C GB_SELECT
|
||||
0x4020 GB_AA_CONFIG
|
||||
0x4024 GB_FIFO_SIZE
|
||||
|
@ -125,6 +125,8 @@ r420 0x4f60
|
||||
0x4000 GB_VAP_RASTER_VTX_FMT_0
|
||||
0x4004 GB_VAP_RASTER_VTX_FMT_1
|
||||
0x4008 GB_ENABLE
|
||||
0x4010 GB_MSPOS0
|
||||
0x4014 GB_MSPOS1
|
||||
0x401C GB_SELECT
|
||||
0x4020 GB_AA_CONFIG
|
||||
0x4024 GB_FIFO_SIZE
|
||||
|
@ -125,6 +125,8 @@ rs600 0x6d40
|
||||
0x4000 GB_VAP_RASTER_VTX_FMT_0
|
||||
0x4004 GB_VAP_RASTER_VTX_FMT_1
|
||||
0x4008 GB_ENABLE
|
||||
0x4010 GB_MSPOS0
|
||||
0x4014 GB_MSPOS1
|
||||
0x401C GB_SELECT
|
||||
0x4020 GB_AA_CONFIG
|
||||
0x4024 GB_FIFO_SIZE
|
||||
|
@ -35,6 +35,7 @@ rv515 0x6d40
|
||||
0x1DA8 VAP_VPORT_ZSCALE
|
||||
0x1DAC VAP_VPORT_ZOFFSET
|
||||
0x2080 VAP_CNTL
|
||||
0x208C VAP_INDEX_OFFSET
|
||||
0x2090 VAP_OUT_VTX_FMT_0
|
||||
0x2094 VAP_OUT_VTX_FMT_1
|
||||
0x20B0 VAP_VTE_CNTL
|
||||
@ -158,6 +159,8 @@ rv515 0x6d40
|
||||
0x4000 GB_VAP_RASTER_VTX_FMT_0
|
||||
0x4004 GB_VAP_RASTER_VTX_FMT_1
|
||||
0x4008 GB_ENABLE
|
||||
0x4010 GB_MSPOS0
|
||||
0x4014 GB_MSPOS1
|
||||
0x401C GB_SELECT
|
||||
0x4020 GB_AA_CONFIG
|
||||
0x4024 GB_FIFO_SIZE
|
||||
|
@ -159,7 +159,7 @@ void rs600_gart_tlb_flush(struct radeon_device *rdev)
|
||||
WREG32_MC(R_000100_MC_PT0_CNTL, tmp);
|
||||
|
||||
tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
|
||||
tmp |= S_000100_INVALIDATE_ALL_L1_TLBS(1) & S_000100_INVALIDATE_L2_CACHE(1);
|
||||
tmp |= S_000100_INVALIDATE_ALL_L1_TLBS(1) | S_000100_INVALIDATE_L2_CACHE(1);
|
||||
WREG32_MC(R_000100_MC_PT0_CNTL, tmp);
|
||||
|
||||
tmp = RREG32_MC(R_000100_MC_PT0_CNTL);
|
||||
|
@ -6,6 +6,7 @@
|
||||
{0x1002, 0x3150, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \
|
||||
{0x1002, 0x3152, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x3154, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x3155, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x3E50, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x3E54, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \
|
||||
{0x1002, 0x4136, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS100|RADEON_IS_IGP}, \
|
||||
|
Loading…
Reference in New Issue
Block a user