Merge linux 6.6.50
Conflicts: drivers/hwmon/k10temp.c Signed-off-by: Jianping Liu <frankjpliu@tencent.com>
This commit is contained in:
commit
ff6757ace4
|
@ -85,6 +85,17 @@ is already free).
|
|||
|
||||
Should be called from a process context (might sleep).
|
||||
|
||||
::
|
||||
|
||||
int hwspin_lock_bust(struct hwspinlock *hwlock, unsigned int id);
|
||||
|
||||
After verifying the owner of the hwspinlock, release a previously acquired
|
||||
hwspinlock; returns 0 on success, or an appropriate error code on failure
|
||||
(e.g. -EOPNOTSUPP if the bust operation is not defined for the specific
|
||||
hwspinlock).
|
||||
|
||||
Should be called from a process context (might sleep).
|
||||
|
||||
::
|
||||
|
||||
int hwspin_lock_timeout(struct hwspinlock *hwlock, unsigned int timeout);
|
||||
|
|
2
Makefile
2
Makefile
|
@ -8,7 +8,7 @@ else
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 49
|
||||
SUBLEVEL = 50
|
||||
EXTRAVERSION =
|
||||
NAME = Hurr durr I'ma ninja sloth
|
||||
|
||||
|
|
|
@ -396,8 +396,6 @@ void blk_integrity_unregister(struct gendisk *disk)
|
|||
if (!bi->profile)
|
||||
return;
|
||||
|
||||
/* ensure all bios are off the integrity workqueue */
|
||||
blk_flush_integrity();
|
||||
blk_queue_flag_clear(QUEUE_FLAG_STABLE_WRITES, disk->queue);
|
||||
memset(bi, 0, sizeof(*bi));
|
||||
}
|
||||
|
|
|
@ -122,8 +122,7 @@ static const struct regmap_bus *regmap_get_spi_bus(struct spi_device *spi,
|
|||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
max_msg_size = spi_max_message_size(spi);
|
||||
reg_reserve_size = config->reg_bits / BITS_PER_BYTE
|
||||
+ config->pad_bits / BITS_PER_BYTE;
|
||||
reg_reserve_size = (config->reg_bits + config->pad_bits) / BITS_PER_BYTE;
|
||||
if (max_size + reg_reserve_size > max_msg_size)
|
||||
max_size -= reg_reserve_size;
|
||||
|
||||
|
|
|
@ -62,9 +62,9 @@ static unsigned int scmi_cpufreq_fast_switch(struct cpufreq_policy *policy,
|
|||
unsigned int target_freq)
|
||||
{
|
||||
struct scmi_data *priv = policy->driver_data;
|
||||
unsigned long freq = target_freq;
|
||||
|
||||
if (!perf_ops->freq_set(ph, priv->domain_id,
|
||||
target_freq * 1000, true))
|
||||
if (!perf_ops->freq_set(ph, priv->domain_id, freq * 1000, true))
|
||||
return target_freq;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <crypto/internal/des.h>
|
||||
#include <crypto/internal/skcipher.h>
|
||||
#include <crypto/scatterwalk.h>
|
||||
#include <linux/bottom_half.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
|
@ -1665,8 +1666,11 @@ static irqreturn_t stm32_cryp_irq_thread(int irq, void *arg)
|
|||
it_mask &= ~IMSCR_OUT;
|
||||
stm32_cryp_write(cryp, cryp->caps->imsc, it_mask);
|
||||
|
||||
if (!cryp->payload_in && !cryp->header_in && !cryp->payload_out)
|
||||
if (!cryp->payload_in && !cryp->header_in && !cryp->payload_out) {
|
||||
local_bh_disable();
|
||||
stm32_cryp_finish_req(cryp, 0);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
|
@ -233,7 +233,7 @@ static void msgdma_free_descriptor(struct msgdma_device *mdev,
|
|||
struct msgdma_sw_desc *child, *next;
|
||||
|
||||
mdev->desc_free_cnt++;
|
||||
list_add_tail(&desc->node, &mdev->free_list);
|
||||
list_move_tail(&desc->node, &mdev->free_list);
|
||||
list_for_each_entry_safe(child, next, &desc->tx_list, node) {
|
||||
mdev->desc_free_cnt++;
|
||||
list_move_tail(&child->node, &mdev->free_list);
|
||||
|
@ -583,17 +583,16 @@ static void msgdma_issue_pending(struct dma_chan *chan)
|
|||
static void msgdma_chan_desc_cleanup(struct msgdma_device *mdev)
|
||||
{
|
||||
struct msgdma_sw_desc *desc, *next;
|
||||
unsigned long irqflags;
|
||||
|
||||
list_for_each_entry_safe(desc, next, &mdev->done_list, node) {
|
||||
struct dmaengine_desc_callback cb;
|
||||
|
||||
list_del(&desc->node);
|
||||
|
||||
dmaengine_desc_get_callback(&desc->async_tx, &cb);
|
||||
if (dmaengine_desc_callback_valid(&cb)) {
|
||||
spin_unlock(&mdev->lock);
|
||||
spin_unlock_irqrestore(&mdev->lock, irqflags);
|
||||
dmaengine_desc_callback_invoke(&cb, NULL);
|
||||
spin_lock(&mdev->lock);
|
||||
spin_lock_irqsave(&mdev->lock, irqflags);
|
||||
}
|
||||
|
||||
/* Run any dependencies, then free the descriptor */
|
||||
|
|
|
@ -100,6 +100,7 @@ struct amdgpu_afmt_acr amdgpu_afmt_acr(uint32_t clock)
|
|||
amdgpu_afmt_calc_cts(clock, &res.cts_32khz, &res.n_32khz, 32000);
|
||||
amdgpu_afmt_calc_cts(clock, &res.cts_44_1khz, &res.n_44_1khz, 44100);
|
||||
amdgpu_afmt_calc_cts(clock, &res.cts_48khz, &res.n_48khz, 48000);
|
||||
res.clock = clock;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -407,6 +407,10 @@ static int amdgpu_amdkfd_bo_validate(struct amdgpu_bo *bo, uint32_t domain,
|
|||
"Called with userptr BO"))
|
||||
return -EINVAL;
|
||||
|
||||
/* bo has been pinned, not need validate it */
|
||||
if (bo->tbo.pin_count)
|
||||
return 0;
|
||||
|
||||
amdgpu_bo_placement_from_domain(bo, domain);
|
||||
|
||||
ret = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
|
||||
|
@ -2631,7 +2635,7 @@ static int confirm_valid_user_pages_locked(struct amdkfd_process_info *process_i
|
|||
|
||||
/* keep mem without hmm range at userptr_inval_list */
|
||||
if (!mem->range)
|
||||
continue;
|
||||
continue;
|
||||
|
||||
/* Only check mem with hmm range associated */
|
||||
valid = amdgpu_ttm_tt_get_user_pages_done(
|
||||
|
@ -2848,9 +2852,6 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info, struct dma_fence **ef)
|
|||
if (!attachment->is_mapped)
|
||||
continue;
|
||||
|
||||
if (attachment->bo_va->base.bo->tbo.pin_count)
|
||||
continue;
|
||||
|
||||
kfd_mem_dmaunmap_attachment(mem, attachment);
|
||||
ret = update_gpuvm_pte(mem, attachment, &sync_obj);
|
||||
if (ret) {
|
||||
|
|
|
@ -1476,6 +1476,8 @@ int amdgpu_atombios_init_mc_reg_table(struct amdgpu_device *adev,
|
|||
(u32)le32_to_cpu(*((u32 *)reg_data + j));
|
||||
j++;
|
||||
} else if ((reg_table->mc_reg_address[i].pre_reg_data & LOW_NIBBLE_MASK) == DATA_EQU_PREV) {
|
||||
if (i == 0)
|
||||
continue;
|
||||
reg_table->mc_reg_table_entry[num_ranges].mc_data[i] =
|
||||
reg_table->mc_reg_table_entry[num_ranges].mc_data[i - 1];
|
||||
}
|
||||
|
|
|
@ -213,6 +213,9 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
|
|||
struct amdgpu_firmware_info *ucode;
|
||||
|
||||
id = fw_type_convert(cgs_device, type);
|
||||
if (id >= AMDGPU_UCODE_ID_MAXIMUM)
|
||||
return -EINVAL;
|
||||
|
||||
ucode = &adev->firmware.ucode[id];
|
||||
if (ucode->fw == NULL)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -4480,7 +4480,8 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev)
|
|||
shadow = vmbo->shadow;
|
||||
|
||||
/* No need to recover an evicted BO */
|
||||
if (shadow->tbo.resource->mem_type != TTM_PL_TT ||
|
||||
if (!shadow->tbo.resource ||
|
||||
shadow->tbo.resource->mem_type != TTM_PL_TT ||
|
||||
shadow->tbo.resource->start == AMDGPU_BO_INVALID_OFFSET ||
|
||||
shadow->parent->tbo.resource->mem_type != TTM_PL_VRAM)
|
||||
continue;
|
||||
|
@ -5235,7 +5236,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
|
|||
* to put adev in the 1st position.
|
||||
*/
|
||||
INIT_LIST_HEAD(&device_list);
|
||||
if (!amdgpu_sriov_vf(adev) && (adev->gmc.xgmi.num_physical_nodes > 1)) {
|
||||
if (!amdgpu_sriov_vf(adev) && (adev->gmc.xgmi.num_physical_nodes > 1) && hive) {
|
||||
list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) {
|
||||
list_add_tail(&tmp_adev->reset_list, &device_list);
|
||||
if (gpu_reset_for_dev_remove && adev->shutdown)
|
||||
|
|
|
@ -1550,7 +1550,7 @@ static int amdgpu_discovery_get_mall_info(struct amdgpu_device *adev)
|
|||
break;
|
||||
case 2:
|
||||
mall_size_per_umc = le32_to_cpu(mall_info->v2.mall_size_per_umc);
|
||||
adev->gmc.mall_size = mall_size_per_umc * adev->gmc.num_umc;
|
||||
adev->gmc.mall_size = (uint64_t)mall_size_per_umc * adev->gmc.num_umc;
|
||||
break;
|
||||
default:
|
||||
dev_err(adev->dev,
|
||||
|
|
|
@ -179,7 +179,7 @@ static int __amdgpu_eeprom_xfer(struct i2c_adapter *i2c_adap, u32 eeprom_addr,
|
|||
* Returns the number of bytes read/written; -errno on error.
|
||||
*/
|
||||
static int amdgpu_eeprom_xfer(struct i2c_adapter *i2c_adap, u32 eeprom_addr,
|
||||
u8 *eeprom_buf, u16 buf_size, bool read)
|
||||
u8 *eeprom_buf, u32 buf_size, bool read)
|
||||
{
|
||||
const struct i2c_adapter_quirks *quirks = i2c_adap->quirks;
|
||||
u16 limit;
|
||||
|
@ -225,7 +225,7 @@ static int amdgpu_eeprom_xfer(struct i2c_adapter *i2c_adap, u32 eeprom_addr,
|
|||
|
||||
int amdgpu_eeprom_read(struct i2c_adapter *i2c_adap,
|
||||
u32 eeprom_addr, u8 *eeprom_buf,
|
||||
u16 bytes)
|
||||
u32 bytes)
|
||||
{
|
||||
return amdgpu_eeprom_xfer(i2c_adap, eeprom_addr, eeprom_buf, bytes,
|
||||
true);
|
||||
|
@ -233,7 +233,7 @@ int amdgpu_eeprom_read(struct i2c_adapter *i2c_adap,
|
|||
|
||||
int amdgpu_eeprom_write(struct i2c_adapter *i2c_adap,
|
||||
u32 eeprom_addr, u8 *eeprom_buf,
|
||||
u16 bytes)
|
||||
u32 bytes)
|
||||
{
|
||||
return amdgpu_eeprom_xfer(i2c_adap, eeprom_addr, eeprom_buf, bytes,
|
||||
false);
|
||||
|
|
|
@ -28,10 +28,10 @@
|
|||
|
||||
int amdgpu_eeprom_read(struct i2c_adapter *i2c_adap,
|
||||
u32 eeprom_addr, u8 *eeprom_buf,
|
||||
u16 bytes);
|
||||
u32 bytes);
|
||||
|
||||
int amdgpu_eeprom_write(struct i2c_adapter *i2c_adap,
|
||||
u32 eeprom_addr, u8 *eeprom_buf,
|
||||
u16 bytes);
|
||||
u32 bytes);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <asm/set_memory.h>
|
||||
#endif
|
||||
#include "amdgpu.h"
|
||||
#include "amdgpu_reset.h"
|
||||
#include <drm/drm_drv.h>
|
||||
#include <drm/ttm/ttm_tt.h>
|
||||
|
||||
|
@ -400,7 +401,10 @@ void amdgpu_gart_invalidate_tlb(struct amdgpu_device *adev)
|
|||
return;
|
||||
|
||||
mb();
|
||||
amdgpu_device_flush_hdp(adev, NULL);
|
||||
if (down_read_trylock(&adev->reset_domain->sem)) {
|
||||
amdgpu_device_flush_hdp(adev, NULL);
|
||||
up_read(&adev->reset_domain->sem);
|
||||
}
|
||||
for_each_set_bit(i, adev->vmhubs_mask, AMDGPU_MAX_VMHUBS)
|
||||
amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0);
|
||||
}
|
||||
|
|
|
@ -1336,6 +1336,9 @@ static void psp_xgmi_reflect_topology_info(struct psp_context *psp,
|
|||
uint8_t dst_num_links = node_info.num_links;
|
||||
|
||||
hive = amdgpu_get_xgmi_hive(psp->adev);
|
||||
if (WARN_ON(!hive))
|
||||
return;
|
||||
|
||||
list_for_each_entry(mirror_adev, &hive->device_list, gmc.xgmi.head) {
|
||||
struct psp_xgmi_topology_info *mirror_top_info;
|
||||
int j;
|
||||
|
|
|
@ -352,7 +352,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
|
|||
ring->max_dw = max_dw;
|
||||
ring->hw_prio = hw_prio;
|
||||
|
||||
if (!ring->no_scheduler) {
|
||||
if (!ring->no_scheduler && ring->funcs->type < AMDGPU_HW_IP_NUM) {
|
||||
hw_ip = ring->funcs->type;
|
||||
num_sched = &adev->gpu_sched[hw_ip][hw_prio].num_scheds;
|
||||
adev->gpu_sched[hw_ip][hw_prio].sched[(*num_sched)++] =
|
||||
|
@ -469,8 +469,9 @@ static ssize_t amdgpu_debugfs_ring_read(struct file *f, char __user *buf,
|
|||
size_t size, loff_t *pos)
|
||||
{
|
||||
struct amdgpu_ring *ring = file_inode(f)->i_private;
|
||||
int r, i;
|
||||
uint32_t value, result, early[3];
|
||||
loff_t i;
|
||||
int r;
|
||||
|
||||
if (*pos & 3 || size & 3)
|
||||
return -EINVAL;
|
||||
|
|
|
@ -135,6 +135,10 @@ static ssize_t amdgpu_securedisplay_debugfs_write(struct file *f, const char __u
|
|||
mutex_unlock(&psp->securedisplay_context.mutex);
|
||||
break;
|
||||
case 2:
|
||||
if (size < 3 || phy_id >= TA_SECUREDISPLAY_MAX_PHY) {
|
||||
dev_err(adev->dev, "Invalid input: %s\n", str);
|
||||
return -EINVAL;
|
||||
}
|
||||
mutex_lock(&psp->securedisplay_context.mutex);
|
||||
psp_prep_securedisplay_cmd_buf(psp, &securedisplay_cmd,
|
||||
TA_SECUREDISPLAY_COMMAND__SEND_ROI_CRC);
|
||||
|
|
|
@ -615,7 +615,7 @@ static int amdgpu_virt_write_vf2pf_data(struct amdgpu_device *adev)
|
|||
vf2pf_info->dummy_page_addr = (uint64_t)adev->dummy_page_addr;
|
||||
vf2pf_info->checksum =
|
||||
amd_sriov_msg_checksum(
|
||||
vf2pf_info, vf2pf_info->header.size, 0, 0);
|
||||
vf2pf_info, sizeof(*vf2pf_info), 0, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -998,6 +998,9 @@ static u32 amdgpu_virt_rlcg_reg_rw(struct amdgpu_device *adev, u32 offset, u32 v
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (amdgpu_device_skip_hw_access(adev))
|
||||
return 0;
|
||||
|
||||
reg_access_ctrl = &adev->gfx.rlc.reg_access_ctrl[xcc_id];
|
||||
scratch_reg0 = (void __iomem *)adev->rmmio + 4 * reg_access_ctrl->scratch_reg0;
|
||||
scratch_reg1 = (void __iomem *)adev->rmmio + 4 * reg_access_ctrl->scratch_reg1;
|
||||
|
@ -1073,6 +1076,9 @@ void amdgpu_sriov_wreg(struct amdgpu_device *adev,
|
|||
{
|
||||
u32 rlcg_flag;
|
||||
|
||||
if (amdgpu_device_skip_hw_access(adev))
|
||||
return;
|
||||
|
||||
if (!amdgpu_sriov_runtime(adev) &&
|
||||
amdgpu_virt_get_rlcg_reg_access_flag(adev, acc_flags, hwip, true, &rlcg_flag)) {
|
||||
amdgpu_virt_rlcg_reg_rw(adev, offset, value, rlcg_flag, xcc_id);
|
||||
|
@ -1090,6 +1096,9 @@ u32 amdgpu_sriov_rreg(struct amdgpu_device *adev,
|
|||
{
|
||||
u32 rlcg_flag;
|
||||
|
||||
if (amdgpu_device_skip_hw_access(adev))
|
||||
return 0;
|
||||
|
||||
if (!amdgpu_sriov_runtime(adev) &&
|
||||
amdgpu_virt_get_rlcg_reg_access_flag(adev, acc_flags, hwip, false, &rlcg_flag))
|
||||
return amdgpu_virt_rlcg_reg_rw(adev, offset, 0, rlcg_flag, xcc_id);
|
||||
|
|
|
@ -500,6 +500,12 @@ static int aqua_vanjaram_switch_partition_mode(struct amdgpu_xcp_mgr *xcp_mgr,
|
|||
|
||||
if (mode == AMDGPU_AUTO_COMPUTE_PARTITION_MODE) {
|
||||
mode = __aqua_vanjaram_get_auto_mode(xcp_mgr);
|
||||
if (mode == AMDGPU_UNKNOWN_COMPUTE_PARTITION_MODE) {
|
||||
dev_err(adev->dev,
|
||||
"Invalid config, no compatible compute partition mode found, available memory partitions: %d",
|
||||
adev->gmc.num_mem_partitions);
|
||||
return -EINVAL;
|
||||
}
|
||||
} else if (!__aqua_vanjaram_is_valid_mode(xcp_mgr, mode)) {
|
||||
dev_err(adev->dev,
|
||||
"Invalid compute partition mode requested, requested: %s, available memory partitions: %d",
|
||||
|
|
|
@ -70,6 +70,8 @@ static u32 df_v1_7_get_hbm_channel_number(struct amdgpu_device *adev)
|
|||
int fb_channel_number;
|
||||
|
||||
fb_channel_number = adev->df.funcs->get_fb_channel_number(adev);
|
||||
if (fb_channel_number >= ARRAY_SIZE(df_v1_7_channel_number))
|
||||
fb_channel_number = 0;
|
||||
|
||||
return df_v1_7_channel_number[fb_channel_number];
|
||||
}
|
||||
|
|
|
@ -384,7 +384,7 @@ static void nbio_v7_4_handle_ras_controller_intr_no_bifring(struct amdgpu_device
|
|||
else
|
||||
WREG32_SOC15(NBIO, 0, mmBIF_DOORBELL_INT_CNTL, bif_doorbell_intr_cntl);
|
||||
|
||||
if (!ras->disable_ras_err_cnt_harvest) {
|
||||
if (ras && !ras->disable_ras_err_cnt_harvest && obj) {
|
||||
/*
|
||||
* clear error status after ras_controller_intr
|
||||
* according to hw team and count ue number
|
||||
|
|
|
@ -42,8 +42,6 @@
|
|||
#define CRAT_OEMTABLEID_LENGTH 8
|
||||
#define CRAT_RESERVED_LENGTH 6
|
||||
|
||||
#define CRAT_OEMID_64BIT_MASK ((1ULL << (CRAT_OEMID_LENGTH * 8)) - 1)
|
||||
|
||||
/* Compute Unit flags */
|
||||
#define COMPUTE_UNIT_CPU (1 << 0) /* Create Virtual CRAT for CPU */
|
||||
#define COMPUTE_UNIT_GPU (1 << 1) /* Create Virtual CRAT for GPU */
|
||||
|
|
|
@ -103,7 +103,8 @@ void debug_event_write_work_handler(struct work_struct *work)
|
|||
struct kfd_process,
|
||||
debug_event_workarea);
|
||||
|
||||
kernel_write(process->dbg_ev_file, &write_data, 1, &pos);
|
||||
if (process->debug_trap_enabled && process->dbg_ev_file)
|
||||
kernel_write(process->dbg_ev_file, &write_data, 1, &pos);
|
||||
}
|
||||
|
||||
/* update process/device/queue exception status, write to descriptor
|
||||
|
@ -645,6 +646,7 @@ int kfd_dbg_trap_disable(struct kfd_process *target)
|
|||
else if (target->runtime_info.runtime_state != DEBUG_RUNTIME_STATE_DISABLED)
|
||||
target->runtime_info.runtime_state = DEBUG_RUNTIME_STATE_ENABLED;
|
||||
|
||||
cancel_work_sync(&target->debug_event_workarea);
|
||||
fput(target->dbg_ev_file);
|
||||
target->dbg_ev_file = NULL;
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include "kfd_priv.h"
|
||||
#include "kfd_kernel_queue.h"
|
||||
#include "amdgpu_amdkfd.h"
|
||||
#include "amdgpu_reset.h"
|
||||
|
||||
static inline struct process_queue_node *get_queue_by_qid(
|
||||
struct process_queue_manager *pqm, unsigned int qid)
|
||||
|
@ -87,8 +88,12 @@ void kfd_process_dequeue_from_device(struct kfd_process_device *pdd)
|
|||
return;
|
||||
|
||||
dev->dqm->ops.process_termination(dev->dqm, &pdd->qpd);
|
||||
if (dev->kfd->shared_resources.enable_mes)
|
||||
amdgpu_mes_flush_shader_debugger(dev->adev, pdd->proc_ctx_gpu_addr);
|
||||
if (dev->kfd->shared_resources.enable_mes &&
|
||||
down_read_trylock(&dev->adev->reset_domain->sem)) {
|
||||
amdgpu_mes_flush_shader_debugger(dev->adev,
|
||||
pdd->proc_ctx_gpu_addr);
|
||||
up_read(&dev->adev->reset_domain->sem);
|
||||
}
|
||||
pdd->already_dequeued = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -958,8 +958,7 @@ static void kfd_update_system_properties(void)
|
|||
dev = list_last_entry(&topology_device_list,
|
||||
struct kfd_topology_device, list);
|
||||
if (dev) {
|
||||
sys_props.platform_id =
|
||||
(*((uint64_t *)dev->oem_id)) & CRAT_OEMID_64BIT_MASK;
|
||||
sys_props.platform_id = dev->oem_id64;
|
||||
sys_props.platform_oem = *((uint64_t *)dev->oem_table_id);
|
||||
sys_props.platform_rev = dev->oem_revision;
|
||||
}
|
||||
|
|
|
@ -154,7 +154,10 @@ struct kfd_topology_device {
|
|||
struct attribute attr_gpuid;
|
||||
struct attribute attr_name;
|
||||
struct attribute attr_props;
|
||||
uint8_t oem_id[CRAT_OEMID_LENGTH];
|
||||
union {
|
||||
uint8_t oem_id[CRAT_OEMID_LENGTH];
|
||||
uint64_t oem_id64;
|
||||
};
|
||||
uint8_t oem_table_id[CRAT_OEMTABLEID_LENGTH];
|
||||
uint32_t oem_revision;
|
||||
};
|
||||
|
|
|
@ -4357,7 +4357,10 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
|
|||
|
||||
/* There is one primary plane per CRTC */
|
||||
primary_planes = dm->dc->caps.max_streams;
|
||||
ASSERT(primary_planes <= AMDGPU_MAX_PLANES);
|
||||
if (primary_planes > AMDGPU_MAX_PLANES) {
|
||||
DRM_ERROR("DM: Plane nums out of 6 planes\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize primary planes, implicit planes for legacy IOCTLS.
|
||||
|
@ -8283,15 +8286,13 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
|
|||
bundle->stream_update.vrr_infopacket =
|
||||
&acrtc_state->stream->vrr_infopacket;
|
||||
}
|
||||
} else if (cursor_update && acrtc_state->active_planes > 0 &&
|
||||
acrtc_attach->base.state->event) {
|
||||
drm_crtc_vblank_get(pcrtc);
|
||||
|
||||
} else if (cursor_update && acrtc_state->active_planes > 0) {
|
||||
spin_lock_irqsave(&pcrtc->dev->event_lock, flags);
|
||||
|
||||
acrtc_attach->event = acrtc_attach->base.state->event;
|
||||
acrtc_attach->base.state->event = NULL;
|
||||
|
||||
if (acrtc_attach->base.state->event) {
|
||||
drm_crtc_vblank_get(pcrtc);
|
||||
acrtc_attach->event = acrtc_attach->base.state->event;
|
||||
acrtc_attach->base.state->event = NULL;
|
||||
}
|
||||
spin_unlock_irqrestore(&pcrtc->dev->event_lock, flags);
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@
|
|||
|
||||
#define AMDGPU_DM_MAX_NUM_EDP 2
|
||||
|
||||
#define AMDGPU_DMUB_NOTIFICATION_MAX 5
|
||||
#define AMDGPU_DMUB_NOTIFICATION_MAX 6
|
||||
|
||||
#define HDMI_AMD_VENDOR_SPECIFIC_DATA_BLOCK_IEEE_REGISTRATION_ID 0x00001A
|
||||
#define AMD_VSDB_VERSION_3_FEATURECAP_REPLAYMODE 0x40
|
||||
|
|
|
@ -667,6 +667,9 @@ static enum bp_result get_ss_info_v3_1(
|
|||
ss_table_header_include = ((ATOM_ASIC_INTERNAL_SS_INFO_V3 *) bios_get_image(&bp->base,
|
||||
DATA_TABLES(ASIC_InternalSS_Info),
|
||||
struct_size(ss_table_header_include, asSpreadSpectrum, 1)));
|
||||
if (!ss_table_header_include)
|
||||
return BP_RESULT_UNSUPPORTED;
|
||||
|
||||
table_size =
|
||||
(le16_to_cpu(ss_table_header_include->sHeader.usStructureSize)
|
||||
- sizeof(ATOM_COMMON_TABLE_HEADER))
|
||||
|
@ -1036,6 +1039,8 @@ static enum bp_result get_ss_info_from_internal_ss_info_tbl_V2_1(
|
|||
&bp->base,
|
||||
DATA_TABLES(ASIC_InternalSS_Info),
|
||||
struct_size(header, asSpreadSpectrum, 1)));
|
||||
if (!header)
|
||||
return result;
|
||||
|
||||
memset(info, 0, sizeof(struct spread_spectrum_info));
|
||||
|
||||
|
@ -1109,6 +1114,8 @@ static enum bp_result get_ss_info_from_ss_info_table(
|
|||
get_atom_data_table_revision(header, &revision);
|
||||
|
||||
tbl = GET_IMAGE(ATOM_SPREAD_SPECTRUM_INFO, DATA_TABLES(SS_Info));
|
||||
if (!tbl)
|
||||
return result;
|
||||
|
||||
if (1 != revision.major || 2 > revision.minor)
|
||||
return result;
|
||||
|
@ -1636,6 +1643,8 @@ static uint32_t get_ss_entry_number_from_ss_info_tbl(
|
|||
|
||||
tbl = GET_IMAGE(ATOM_SPREAD_SPECTRUM_INFO,
|
||||
DATA_TABLES(SS_Info));
|
||||
if (!tbl)
|
||||
return number;
|
||||
|
||||
if (1 != revision.major || 2 > revision.minor)
|
||||
return number;
|
||||
|
@ -1718,6 +1727,8 @@ static uint32_t get_ss_entry_number_from_internal_ss_info_tbl_v2_1(
|
|||
&bp->base,
|
||||
DATA_TABLES(ASIC_InternalSS_Info),
|
||||
struct_size(header_include, asSpreadSpectrum, 1)));
|
||||
if (!header_include)
|
||||
return 0;
|
||||
|
||||
size = (le16_to_cpu(header_include->sHeader.usStructureSize)
|
||||
- sizeof(ATOM_COMMON_TABLE_HEADER))
|
||||
|
@ -1756,6 +1767,9 @@ static uint32_t get_ss_entry_number_from_internal_ss_info_tbl_V3_1(
|
|||
header_include = ((ATOM_ASIC_INTERNAL_SS_INFO_V3 *) bios_get_image(&bp->base,
|
||||
DATA_TABLES(ASIC_InternalSS_Info),
|
||||
struct_size(header_include, asSpreadSpectrum, 1)));
|
||||
if (!header_include)
|
||||
return number;
|
||||
|
||||
size = (le16_to_cpu(header_include->sHeader.usStructureSize) -
|
||||
sizeof(ATOM_COMMON_TABLE_HEADER)) /
|
||||
sizeof(ATOM_ASIC_SS_ASSIGNMENT_V3);
|
||||
|
@ -2552,8 +2566,8 @@ static enum bp_result construct_integrated_info(
|
|||
|
||||
/* Sort voltage table from low to high*/
|
||||
if (result == BP_RESULT_OK) {
|
||||
uint32_t i;
|
||||
uint32_t j;
|
||||
int32_t i;
|
||||
int32_t j;
|
||||
|
||||
for (i = 1; i < NUMBER_OF_DISP_CLK_VOLTAGE; ++i) {
|
||||
for (j = i; j > 0; --j) {
|
||||
|
|
|
@ -2935,8 +2935,11 @@ static enum bp_result construct_integrated_info(
|
|||
struct atom_common_table_header *header;
|
||||
struct atom_data_revision revision;
|
||||
|
||||
uint32_t i;
|
||||
uint32_t j;
|
||||
int32_t i;
|
||||
int32_t j;
|
||||
|
||||
if (!info)
|
||||
return result;
|
||||
|
||||
if (info && DATA_TABLES(integratedsysteminfo)) {
|
||||
header = GET_IMAGE(struct atom_common_table_header,
|
||||
|
|
|
@ -484,7 +484,8 @@ static void build_watermark_ranges(struct clk_bw_params *bw_params, struct pp_sm
|
|||
ranges->reader_wm_sets[num_valid_sets].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
|
||||
|
||||
/* Modify previous watermark range to cover up to max */
|
||||
ranges->reader_wm_sets[num_valid_sets - 1].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
|
||||
if (num_valid_sets > 0)
|
||||
ranges->reader_wm_sets[num_valid_sets - 1].max_fill_clk_mhz = PP_SMU_WM_SET_RANGE_CLK_UNCONSTRAINED_MAX;
|
||||
}
|
||||
num_valid_sets++;
|
||||
}
|
||||
|
|
|
@ -1298,6 +1298,7 @@ struct dc *dc_create(const struct dc_init_data *init_params)
|
|||
return NULL;
|
||||
|
||||
if (init_params->dce_environment == DCE_ENV_VIRTUAL_HW) {
|
||||
dc->caps.linear_pitch_alignment = 64;
|
||||
if (!dc_construct_ctx(dc, init_params))
|
||||
goto destruct_dc;
|
||||
} else {
|
||||
|
|
|
@ -3927,6 +3927,9 @@ void resource_build_bit_depth_reduction_params(struct dc_stream_state *stream,
|
|||
|
||||
enum dc_status dc_validate_stream(struct dc *dc, struct dc_stream_state *stream)
|
||||
{
|
||||
if (dc == NULL || stream == NULL)
|
||||
return DC_ERROR_UNEXPECTED;
|
||||
|
||||
struct dc_link *link = stream->link;
|
||||
struct timing_generator *tg = dc->res_pool->timing_generators[0];
|
||||
enum dc_status res = DC_OK;
|
||||
|
|
|
@ -102,7 +102,8 @@ static void dmub_replay_enable(struct dmub_replay *dmub, bool enable, bool wait,
|
|||
break;
|
||||
}
|
||||
|
||||
fsleep(500);
|
||||
/* must *not* be fsleep - this can be called from high irq levels */
|
||||
udelay(500);
|
||||
}
|
||||
|
||||
/* assert if max retry hit */
|
||||
|
|
|
@ -690,6 +690,9 @@ static void wbscl_set_scaler_filter(
|
|||
int pair;
|
||||
uint16_t odd_coef, even_coef;
|
||||
|
||||
if (!filter)
|
||||
return;
|
||||
|
||||
for (phase = 0; phase < (NUM_PHASES / 2 + 1); phase++) {
|
||||
for (pair = 0; pair < tap_pairs; pair++) {
|
||||
even_coef = filter[phase * taps + 2 * pair];
|
||||
|
|
|
@ -1453,10 +1453,9 @@ void dcn_bw_update_from_pplib_fclks(
|
|||
ASSERT(fclks->num_levels);
|
||||
|
||||
vmin0p65_idx = 0;
|
||||
vmid0p72_idx = fclks->num_levels -
|
||||
(fclks->num_levels > 2 ? 3 : (fclks->num_levels > 1 ? 2 : 1));
|
||||
vnom0p8_idx = fclks->num_levels - (fclks->num_levels > 1 ? 2 : 1);
|
||||
vmax0p9_idx = fclks->num_levels - 1;
|
||||
vmid0p72_idx = fclks->num_levels > 2 ? fclks->num_levels - 3 : 0;
|
||||
vnom0p8_idx = fclks->num_levels > 1 ? fclks->num_levels - 2 : 0;
|
||||
vmax0p9_idx = fclks->num_levels > 0 ? fclks->num_levels - 1 : 0;
|
||||
|
||||
dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 =
|
||||
32 * (fclks->data[vmin0p65_idx].clocks_in_khz / 1000.0) / 1000.0;
|
||||
|
|
|
@ -304,6 +304,16 @@ void dcn302_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_p
|
|||
dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
|
||||
}
|
||||
|
||||
/* bw_params->clk_table.entries[MAX_NUM_DPM_LVL].
|
||||
* MAX_NUM_DPM_LVL is 8.
|
||||
* dcn3_02_soc.clock_limits[DC__VOLTAGE_STATES].
|
||||
* DC__VOLTAGE_STATES is 40.
|
||||
*/
|
||||
if (num_states > MAX_NUM_DPM_LVL) {
|
||||
ASSERT(0);
|
||||
return;
|
||||
}
|
||||
|
||||
dcn3_02_soc.num_states = num_states;
|
||||
for (i = 0; i < dcn3_02_soc.num_states; i++) {
|
||||
dcn3_02_soc.clock_limits[i].state = i;
|
||||
|
|
|
@ -299,6 +299,16 @@ void dcn303_fpu_update_bw_bounding_box(struct dc *dc, struct clk_bw_params *bw_p
|
|||
dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
|
||||
}
|
||||
|
||||
/* bw_params->clk_table.entries[MAX_NUM_DPM_LVL].
|
||||
* MAX_NUM_DPM_LVL is 8.
|
||||
* dcn3_02_soc.clock_limits[DC__VOLTAGE_STATES].
|
||||
* DC__VOLTAGE_STATES is 40.
|
||||
*/
|
||||
if (num_states > MAX_NUM_DPM_LVL) {
|
||||
ASSERT(0);
|
||||
return;
|
||||
}
|
||||
|
||||
dcn3_03_soc.num_states = num_states;
|
||||
for (i = 0; i < dcn3_03_soc.num_states; i++) {
|
||||
dcn3_03_soc.clock_limits[i].state = i;
|
||||
|
|
|
@ -2885,6 +2885,16 @@ void dcn32_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_pa
|
|||
dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
|
||||
}
|
||||
|
||||
/* bw_params->clk_table.entries[MAX_NUM_DPM_LVL].
|
||||
* MAX_NUM_DPM_LVL is 8.
|
||||
* dcn3_02_soc.clock_limits[DC__VOLTAGE_STATES].
|
||||
* DC__VOLTAGE_STATES is 40.
|
||||
*/
|
||||
if (num_states > MAX_NUM_DPM_LVL) {
|
||||
ASSERT(0);
|
||||
return;
|
||||
}
|
||||
|
||||
dcn3_2_soc.num_states = num_states;
|
||||
for (i = 0; i < dcn3_2_soc.num_states; i++) {
|
||||
dcn3_2_soc.clock_limits[i].state = i;
|
||||
|
|
|
@ -789,6 +789,16 @@ void dcn321_update_bw_bounding_box_fpu(struct dc *dc, struct clk_bw_params *bw_p
|
|||
dram_speed_mts[num_states++] = bw_params->clk_table.entries[j++].memclk_mhz * 16;
|
||||
}
|
||||
|
||||
/* bw_params->clk_table.entries[MAX_NUM_DPM_LVL].
|
||||
* MAX_NUM_DPM_LVL is 8.
|
||||
* dcn3_02_soc.clock_limits[DC__VOLTAGE_STATES].
|
||||
* DC__VOLTAGE_STATES is 40.
|
||||
*/
|
||||
if (num_states > MAX_NUM_DPM_LVL) {
|
||||
ASSERT(0);
|
||||
return;
|
||||
}
|
||||
|
||||
dcn3_21_soc.num_states = num_states;
|
||||
for (i = 0; i < dcn3_21_soc.num_states; i++) {
|
||||
dcn3_21_soc.clock_limits[i].state = i;
|
||||
|
|
|
@ -1099,8 +1099,13 @@ void ModeSupportAndSystemConfiguration(struct display_mode_lib *mode_lib)
|
|||
|
||||
// Total Available Pipes Support Check
|
||||
for (k = 0; k < mode_lib->vba.NumberOfActivePlanes; ++k) {
|
||||
total_pipes += mode_lib->vba.DPPPerPlane[k];
|
||||
pipe_idx = get_pipe_idx(mode_lib, k);
|
||||
if (pipe_idx == -1) {
|
||||
ASSERT(0);
|
||||
continue; // skip inactive planes
|
||||
}
|
||||
total_pipes += mode_lib->vba.DPPPerPlane[k];
|
||||
|
||||
if (mode_lib->vba.cache_pipes[pipe_idx].clks_cfg.dppclk_mhz > 0.0)
|
||||
mode_lib->vba.DPPCLK[k] = mode_lib->vba.cache_pipes[pipe_idx].clks_cfg.dppclk_mhz;
|
||||
else
|
||||
|
|
|
@ -56,7 +56,7 @@ struct gpio_service *dal_gpio_service_create(
|
|||
struct dc_context *ctx)
|
||||
{
|
||||
struct gpio_service *service;
|
||||
uint32_t index_of_id;
|
||||
int32_t index_of_id;
|
||||
|
||||
service = kzalloc(sizeof(struct gpio_service), GFP_KERNEL);
|
||||
|
||||
|
@ -112,7 +112,7 @@ struct gpio_service *dal_gpio_service_create(
|
|||
return service;
|
||||
|
||||
failure_2:
|
||||
while (index_of_id) {
|
||||
while (index_of_id > 0) {
|
||||
--index_of_id;
|
||||
kfree(service->busyness[index_of_id]);
|
||||
}
|
||||
|
@ -239,6 +239,9 @@ static bool is_pin_busy(
|
|||
enum gpio_id id,
|
||||
uint32_t en)
|
||||
{
|
||||
if (id == GPIO_ID_UNKNOWN)
|
||||
return false;
|
||||
|
||||
return service->busyness[id][en];
|
||||
}
|
||||
|
||||
|
@ -247,6 +250,9 @@ static void set_pin_busy(
|
|||
enum gpio_id id,
|
||||
uint32_t en)
|
||||
{
|
||||
if (id == GPIO_ID_UNKNOWN)
|
||||
return;
|
||||
|
||||
service->busyness[id][en] = true;
|
||||
}
|
||||
|
||||
|
@ -255,6 +261,9 @@ static void set_pin_free(
|
|||
enum gpio_id id,
|
||||
uint32_t en)
|
||||
{
|
||||
if (id == GPIO_ID_UNKNOWN)
|
||||
return;
|
||||
|
||||
service->busyness[id][en] = false;
|
||||
}
|
||||
|
||||
|
@ -263,7 +272,7 @@ enum gpio_result dal_gpio_service_lock(
|
|||
enum gpio_id id,
|
||||
uint32_t en)
|
||||
{
|
||||
if (!service->busyness[id]) {
|
||||
if (id != GPIO_ID_UNKNOWN && !service->busyness[id]) {
|
||||
ASSERT_CRITICAL(false);
|
||||
return GPIO_RESULT_OPEN_FAILED;
|
||||
}
|
||||
|
@ -277,7 +286,7 @@ enum gpio_result dal_gpio_service_unlock(
|
|||
enum gpio_id id,
|
||||
uint32_t en)
|
||||
{
|
||||
if (!service->busyness[id]) {
|
||||
if (id != GPIO_ID_UNKNOWN && !service->busyness[id]) {
|
||||
ASSERT_CRITICAL(false);
|
||||
return GPIO_RESULT_OPEN_FAILED;
|
||||
}
|
||||
|
|
|
@ -130,13 +130,21 @@ static bool hdmi_14_process_transaction(
|
|||
const uint8_t hdcp_i2c_addr_link_primary = 0x3a; /* 0x74 >> 1*/
|
||||
const uint8_t hdcp_i2c_addr_link_secondary = 0x3b; /* 0x76 >> 1*/
|
||||
struct i2c_command i2c_command;
|
||||
uint8_t offset = hdcp_i2c_offsets[message_info->msg_id];
|
||||
uint8_t offset;
|
||||
struct i2c_payload i2c_payloads[] = {
|
||||
{ true, 0, 1, &offset },
|
||||
{ true, 0, 1, 0 },
|
||||
/* actual hdcp payload, will be filled later, zeroed for now*/
|
||||
{ 0 }
|
||||
};
|
||||
|
||||
if (message_info->msg_id == HDCP_MESSAGE_ID_INVALID) {
|
||||
DC_LOG_ERROR("%s: Invalid message_info msg_id - %d\n", __func__, message_info->msg_id);
|
||||
return false;
|
||||
}
|
||||
|
||||
offset = hdcp_i2c_offsets[message_info->msg_id];
|
||||
i2c_payloads[0].data = &offset;
|
||||
|
||||
switch (message_info->link) {
|
||||
case HDCP_LINK_SECONDARY:
|
||||
i2c_payloads[0].address = hdcp_i2c_addr_link_secondary;
|
||||
|
@ -310,6 +318,11 @@ static bool dp_11_process_transaction(
|
|||
struct dc_link *link,
|
||||
struct hdcp_protection_message *message_info)
|
||||
{
|
||||
if (message_info->msg_id == HDCP_MESSAGE_ID_INVALID) {
|
||||
DC_LOG_ERROR("%s: Invalid message_info msg_id - %d\n", __func__, message_info->msg_id);
|
||||
return false;
|
||||
}
|
||||
|
||||
return dpcd_access_helper(
|
||||
link,
|
||||
message_info->length,
|
||||
|
|
|
@ -528,7 +528,7 @@ static bool decide_fallback_link_setting_max_bw_policy(
|
|||
struct dc_link_settings *cur,
|
||||
enum link_training_result training_result)
|
||||
{
|
||||
uint8_t cur_idx = 0, next_idx;
|
||||
uint32_t cur_idx = 0, next_idx;
|
||||
bool found = false;
|
||||
|
||||
if (training_result == LINK_TRAINING_ABORT)
|
||||
|
@ -908,21 +908,17 @@ bool link_decide_link_settings(struct dc_stream_state *stream,
|
|||
|
||||
memset(link_setting, 0, sizeof(*link_setting));
|
||||
|
||||
/* if preferred is specified through AMDDP, use it, if it's enough
|
||||
* to drive the mode
|
||||
*/
|
||||
if (link->preferred_link_setting.lane_count !=
|
||||
LANE_COUNT_UNKNOWN &&
|
||||
link->preferred_link_setting.link_rate !=
|
||||
LINK_RATE_UNKNOWN) {
|
||||
if (dc_is_dp_signal(stream->signal) &&
|
||||
link->preferred_link_setting.lane_count != LANE_COUNT_UNKNOWN &&
|
||||
link->preferred_link_setting.link_rate != LINK_RATE_UNKNOWN) {
|
||||
/* if preferred is specified through AMDDP, use it, if it's enough
|
||||
* to drive the mode
|
||||
*/
|
||||
*link_setting = link->preferred_link_setting;
|
||||
return true;
|
||||
}
|
||||
|
||||
/* MST doesn't perform link training for now
|
||||
* TODO: add MST specific link training routine
|
||||
*/
|
||||
if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
|
||||
} else if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST) {
|
||||
/* MST doesn't perform link training for now
|
||||
* TODO: add MST specific link training routine
|
||||
*/
|
||||
decide_mst_link_settings(link, link_setting);
|
||||
} else if (link->connector_signal == SIGNAL_TYPE_EDP) {
|
||||
/* enable edp link optimization for DSC eDP case */
|
||||
|
|
|
@ -914,10 +914,10 @@ static enum dc_status configure_lttpr_mode_non_transparent(
|
|||
/* Driver does not need to train the first hop. Skip DPCD read and clear
|
||||
* AUX_RD_INTERVAL for DPTX-to-DPIA hop.
|
||||
*/
|
||||
if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA)
|
||||
if (link->ep_type == DISPLAY_ENDPOINT_USB4_DPIA && repeater_cnt > 0 && repeater_cnt < MAX_REPEATER_CNT)
|
||||
link->dpcd_caps.lttpr_caps.aux_rd_interval[--repeater_cnt] = 0;
|
||||
|
||||
for (repeater_id = repeater_cnt; repeater_id > 0; repeater_id--) {
|
||||
for (repeater_id = repeater_cnt; repeater_id > 0 && repeater_id < MAX_REPEATER_CNT; repeater_id--) {
|
||||
aux_interval_address = DP_TRAINING_AUX_RD_INTERVAL_PHY_REPEATER1 +
|
||||
((DP_REPEATER_CONFIGURATION_AND_STATUS_SIZE) * (repeater_id - 1));
|
||||
core_link_read_dpcd(
|
||||
|
|
|
@ -156,11 +156,16 @@ static enum mod_hdcp_status read(struct mod_hdcp *hdcp,
|
|||
uint32_t cur_size = 0;
|
||||
uint32_t data_offset = 0;
|
||||
|
||||
if (msg_id == MOD_HDCP_MESSAGE_ID_INVALID) {
|
||||
if (msg_id == MOD_HDCP_MESSAGE_ID_INVALID ||
|
||||
msg_id >= MOD_HDCP_MESSAGE_ID_MAX)
|
||||
return MOD_HDCP_STATUS_DDC_FAILURE;
|
||||
}
|
||||
|
||||
if (is_dp_hdcp(hdcp)) {
|
||||
int num_dpcd_addrs = sizeof(hdcp_dpcd_addrs) /
|
||||
sizeof(hdcp_dpcd_addrs[0]);
|
||||
if (msg_id >= num_dpcd_addrs)
|
||||
return MOD_HDCP_STATUS_DDC_FAILURE;
|
||||
|
||||
while (buf_len > 0) {
|
||||
cur_size = MIN(buf_len, HDCP_MAX_AUX_TRANSACTION_SIZE);
|
||||
success = hdcp->config.ddc.funcs.read_dpcd(hdcp->config.ddc.handle,
|
||||
|
@ -175,6 +180,11 @@ static enum mod_hdcp_status read(struct mod_hdcp *hdcp,
|
|||
data_offset += cur_size;
|
||||
}
|
||||
} else {
|
||||
int num_i2c_offsets = sizeof(hdcp_i2c_offsets) /
|
||||
sizeof(hdcp_i2c_offsets[0]);
|
||||
if (msg_id >= num_i2c_offsets)
|
||||
return MOD_HDCP_STATUS_DDC_FAILURE;
|
||||
|
||||
success = hdcp->config.ddc.funcs.read_i2c(
|
||||
hdcp->config.ddc.handle,
|
||||
HDCP_I2C_ADDR,
|
||||
|
@ -219,11 +229,16 @@ static enum mod_hdcp_status write(struct mod_hdcp *hdcp,
|
|||
uint32_t cur_size = 0;
|
||||
uint32_t data_offset = 0;
|
||||
|
||||
if (msg_id == MOD_HDCP_MESSAGE_ID_INVALID) {
|
||||
if (msg_id == MOD_HDCP_MESSAGE_ID_INVALID ||
|
||||
msg_id >= MOD_HDCP_MESSAGE_ID_MAX)
|
||||
return MOD_HDCP_STATUS_DDC_FAILURE;
|
||||
}
|
||||
|
||||
if (is_dp_hdcp(hdcp)) {
|
||||
int num_dpcd_addrs = sizeof(hdcp_dpcd_addrs) /
|
||||
sizeof(hdcp_dpcd_addrs[0]);
|
||||
if (msg_id >= num_dpcd_addrs)
|
||||
return MOD_HDCP_STATUS_DDC_FAILURE;
|
||||
|
||||
while (buf_len > 0) {
|
||||
cur_size = MIN(buf_len, HDCP_MAX_AUX_TRANSACTION_SIZE);
|
||||
success = hdcp->config.ddc.funcs.write_dpcd(
|
||||
|
@ -239,6 +254,11 @@ static enum mod_hdcp_status write(struct mod_hdcp *hdcp,
|
|||
data_offset += cur_size;
|
||||
}
|
||||
} else {
|
||||
int num_i2c_offsets = sizeof(hdcp_i2c_offsets) /
|
||||
sizeof(hdcp_i2c_offsets[0]);
|
||||
if (msg_id >= num_i2c_offsets)
|
||||
return MOD_HDCP_STATUS_DDC_FAILURE;
|
||||
|
||||
hdcp->buf[0] = hdcp_i2c_offsets[msg_id];
|
||||
memmove(&hdcp->buf[1], buf, buf_len);
|
||||
success = hdcp->config.ddc.funcs.write_i2c(
|
||||
|
|
|
@ -99,7 +99,7 @@ static void pp_swctf_delayed_work_handler(struct work_struct *work)
|
|||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
struct amdgpu_dpm_thermal *range =
|
||||
&adev->pm.dpm.thermal;
|
||||
uint32_t gpu_temperature, size;
|
||||
uint32_t gpu_temperature, size = sizeof(gpu_temperature);
|
||||
int ret;
|
||||
|
||||
/*
|
||||
|
|
|
@ -30,9 +30,8 @@ int psm_init_power_state_table(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
int result;
|
||||
unsigned int i;
|
||||
unsigned int table_entries;
|
||||
struct pp_power_state *state;
|
||||
int size;
|
||||
int size, table_entries;
|
||||
|
||||
if (hwmgr->hwmgr_func->get_num_of_pp_table_entries == NULL)
|
||||
return 0;
|
||||
|
@ -40,15 +39,19 @@ int psm_init_power_state_table(struct pp_hwmgr *hwmgr)
|
|||
if (hwmgr->hwmgr_func->get_power_state_size == NULL)
|
||||
return 0;
|
||||
|
||||
hwmgr->num_ps = table_entries = hwmgr->hwmgr_func->get_num_of_pp_table_entries(hwmgr);
|
||||
table_entries = hwmgr->hwmgr_func->get_num_of_pp_table_entries(hwmgr);
|
||||
|
||||
hwmgr->ps_size = size = hwmgr->hwmgr_func->get_power_state_size(hwmgr) +
|
||||
size = hwmgr->hwmgr_func->get_power_state_size(hwmgr) +
|
||||
sizeof(struct pp_power_state);
|
||||
|
||||
if (table_entries == 0 || size == 0) {
|
||||
if (table_entries <= 0 || size == 0) {
|
||||
pr_warn("Please check whether power state management is supported on this asic\n");
|
||||
hwmgr->num_ps = 0;
|
||||
hwmgr->ps_size = 0;
|
||||
return 0;
|
||||
}
|
||||
hwmgr->num_ps = table_entries;
|
||||
hwmgr->ps_size = size;
|
||||
|
||||
hwmgr->ps = kcalloc(table_entries, size, GFP_KERNEL);
|
||||
if (hwmgr->ps == NULL)
|
||||
|
|
|
@ -73,8 +73,9 @@ static int atomctrl_retrieve_ac_timing(
|
|||
j++;
|
||||
} else if ((table->mc_reg_address[i].uc_pre_reg_data &
|
||||
LOW_NIBBLE_MASK) == DATA_EQU_PREV) {
|
||||
table->mc_reg_table_entry[num_ranges].mc_data[i] =
|
||||
table->mc_reg_table_entry[num_ranges].mc_data[i-1];
|
||||
if (i)
|
||||
table->mc_reg_table_entry[num_ranges].mc_data[i] =
|
||||
table->mc_reg_table_entry[num_ranges].mc_data[i-1];
|
||||
}
|
||||
}
|
||||
num_ranges++;
|
||||
|
|
|
@ -1036,7 +1036,9 @@ static int smu10_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
|
||||
switch (type) {
|
||||
case PP_SCLK:
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetGfxclkFrequency, &now);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetGfxclkFrequency, &now);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* driver only know min/max gfx_clk, Add level 1 for all other gfx clks */
|
||||
if (now == data->gfx_max_freq_limit/100)
|
||||
|
@ -1057,7 +1059,9 @@ static int smu10_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
i == 2 ? "*" : "");
|
||||
break;
|
||||
case PP_MCLK:
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetFclkFrequency, &now);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetFclkFrequency, &now);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < mclk_table->count; i++)
|
||||
size += sprintf(buf + size, "%d: %uMhz %s\n",
|
||||
|
@ -1550,7 +1554,10 @@ static int smu10_set_fine_grain_clk_vol(struct pp_hwmgr *hwmgr,
|
|||
}
|
||||
|
||||
if (input[0] == 0) {
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMinGfxclkFrequency, &min_freq);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMinGfxclkFrequency, &min_freq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (input[1] < min_freq) {
|
||||
pr_err("Fine grain setting minimum sclk (%ld) MHz is less than the minimum allowed (%d) MHz\n",
|
||||
input[1], min_freq);
|
||||
|
@ -1558,7 +1565,10 @@ static int smu10_set_fine_grain_clk_vol(struct pp_hwmgr *hwmgr,
|
|||
}
|
||||
smu10_data->gfx_actual_soft_min_freq = input[1];
|
||||
} else if (input[0] == 1) {
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxGfxclkFrequency, &max_freq);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxGfxclkFrequency, &max_freq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (input[1] > max_freq) {
|
||||
pr_err("Fine grain setting maximum sclk (%ld) MHz is greater than the maximum allowed (%d) MHz\n",
|
||||
input[1], max_freq);
|
||||
|
@ -1573,10 +1583,15 @@ static int smu10_set_fine_grain_clk_vol(struct pp_hwmgr *hwmgr,
|
|||
pr_err("Input parameter number not correct\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMinGfxclkFrequency, &min_freq);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxGfxclkFrequency, &max_freq);
|
||||
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMinGfxclkFrequency, &min_freq);
|
||||
if (ret)
|
||||
return ret;
|
||||
smu10_data->gfx_actual_soft_min_freq = min_freq;
|
||||
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxGfxclkFrequency, &max_freq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
smu10_data->gfx_actual_soft_max_freq = max_freq;
|
||||
} else if (type == PP_OD_COMMIT_DPM_TABLE) {
|
||||
if (size != 0) {
|
||||
|
|
|
@ -5641,7 +5641,7 @@ static int smu7_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, uint
|
|||
mode = input[size];
|
||||
switch (mode) {
|
||||
case PP_SMC_POWER_PROFILE_CUSTOM:
|
||||
if (size < 8 && size != 0)
|
||||
if (size != 8 && size != 0)
|
||||
return -EINVAL;
|
||||
/* If only CUSTOM is passed in, use the saved values. Check
|
||||
* that we actually have a CUSTOM profile by ensuring that
|
||||
|
|
|
@ -584,6 +584,7 @@ static int smu8_init_uvd_limit(struct pp_hwmgr *hwmgr)
|
|||
hwmgr->dyn_state.uvd_clock_voltage_dependency_table;
|
||||
unsigned long clock = 0;
|
||||
uint32_t level;
|
||||
int ret;
|
||||
|
||||
if (NULL == table || table->count <= 0)
|
||||
return -EINVAL;
|
||||
|
@ -591,7 +592,9 @@ static int smu8_init_uvd_limit(struct pp_hwmgr *hwmgr)
|
|||
data->uvd_dpm.soft_min_clk = 0;
|
||||
data->uvd_dpm.hard_min_clk = 0;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxUvdLevel, &level);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxUvdLevel, &level);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (level < table->count)
|
||||
clock = table->entries[level].vclk;
|
||||
|
@ -611,6 +614,7 @@ static int smu8_init_vce_limit(struct pp_hwmgr *hwmgr)
|
|||
hwmgr->dyn_state.vce_clock_voltage_dependency_table;
|
||||
unsigned long clock = 0;
|
||||
uint32_t level;
|
||||
int ret;
|
||||
|
||||
if (NULL == table || table->count <= 0)
|
||||
return -EINVAL;
|
||||
|
@ -618,7 +622,9 @@ static int smu8_init_vce_limit(struct pp_hwmgr *hwmgr)
|
|||
data->vce_dpm.soft_min_clk = 0;
|
||||
data->vce_dpm.hard_min_clk = 0;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxEclkLevel, &level);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxEclkLevel, &level);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (level < table->count)
|
||||
clock = table->entries[level].ecclk;
|
||||
|
@ -638,6 +644,7 @@ static int smu8_init_acp_limit(struct pp_hwmgr *hwmgr)
|
|||
hwmgr->dyn_state.acp_clock_voltage_dependency_table;
|
||||
unsigned long clock = 0;
|
||||
uint32_t level;
|
||||
int ret;
|
||||
|
||||
if (NULL == table || table->count <= 0)
|
||||
return -EINVAL;
|
||||
|
@ -645,7 +652,9 @@ static int smu8_init_acp_limit(struct pp_hwmgr *hwmgr)
|
|||
data->acp_dpm.soft_min_clk = 0;
|
||||
data->acp_dpm.hard_min_clk = 0;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxAclkLevel, &level);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetMaxAclkLevel, &level);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (level < table->count)
|
||||
clock = table->entries[level].acpclk;
|
||||
|
|
|
@ -354,13 +354,13 @@ static int vega10_odn_initial_default_setting(struct pp_hwmgr *hwmgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void vega10_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
||||
static int vega10_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega10_hwmgr *data = hwmgr->backend;
|
||||
int i;
|
||||
uint32_t sub_vendor_id, hw_revision;
|
||||
uint32_t top32, bottom32;
|
||||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
int ret, i;
|
||||
|
||||
vega10_initialize_power_tune_defaults(hwmgr);
|
||||
|
||||
|
@ -485,9 +485,12 @@ static void vega10_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
|||
if (data->registry_data.vr0hot_enabled)
|
||||
data->smu_features[GNLD_VR0HOT].supported = true;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr,
|
||||
ret = smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GetSmuVersion,
|
||||
&hwmgr->smu_version);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* ACG firmware has major version 5 */
|
||||
if ((hwmgr->smu_version & 0xff000000) == 0x5000000)
|
||||
data->smu_features[GNLD_ACG].supported = true;
|
||||
|
@ -505,10 +508,16 @@ static void vega10_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
|||
data->smu_features[GNLD_PCC_LIMIT].supported = true;
|
||||
|
||||
/* Get the SN to turn into a Unique ID */
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumTop32, &top32);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumBottom32, &bottom32);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumTop32, &top32);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumBottom32, &bottom32);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
adev->unique_id = ((uint64_t)bottom32 << 32) | top32;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef PPLIB_VEGA10_EVV_SUPPORT
|
||||
|
@ -882,7 +891,9 @@ static int vega10_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
|
|||
|
||||
vega10_set_features_platform_caps(hwmgr);
|
||||
|
||||
vega10_init_dpm_defaults(hwmgr);
|
||||
result = vega10_init_dpm_defaults(hwmgr);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
#ifdef PPLIB_VEGA10_EVV_SUPPORT
|
||||
/* Get leakage voltage based on leakage ID. */
|
||||
|
@ -2350,15 +2361,20 @@ static int vega10_acg_enable(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
struct vega10_hwmgr *data = hwmgr->backend;
|
||||
uint32_t agc_btc_response;
|
||||
int ret;
|
||||
|
||||
if (data->smu_features[GNLD_ACG].supported) {
|
||||
if (0 == vega10_enable_smc_features(hwmgr, true,
|
||||
data->smu_features[GNLD_DPM_PREFETCHER].smu_feature_bitmap))
|
||||
data->smu_features[GNLD_DPM_PREFETCHER].enabled = true;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_InitializeAcg, NULL);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_InitializeAcg, NULL);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_RunAcgBtc, &agc_btc_response);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_RunAcgBtc, &agc_btc_response);
|
||||
if (ret)
|
||||
agc_btc_response = 0;
|
||||
|
||||
if (1 == agc_btc_response) {
|
||||
if (1 == data->acg_loop_state)
|
||||
|
@ -2571,8 +2587,11 @@ static int vega10_init_smc_table(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
}
|
||||
|
||||
pp_atomfwctrl_get_voltage_table_v4(hwmgr, VOLTAGE_TYPE_VDDC,
|
||||
result = pp_atomfwctrl_get_voltage_table_v4(hwmgr, VOLTAGE_TYPE_VDDC,
|
||||
VOLTAGE_OBJ_SVID2, &voltage_table);
|
||||
PP_ASSERT_WITH_CODE(!result,
|
||||
"Failed to get voltage table!",
|
||||
return result);
|
||||
pp_table->MaxVidStep = voltage_table.max_vid_step;
|
||||
|
||||
pp_table->GfxDpmVoltageMode =
|
||||
|
@ -3910,11 +3929,14 @@ static int vega10_get_gpu_power(struct pp_hwmgr *hwmgr,
|
|||
uint32_t *query)
|
||||
{
|
||||
uint32_t value;
|
||||
int ret;
|
||||
|
||||
if (!query)
|
||||
return -EINVAL;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrPkgPwr, &value);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrPkgPwr, &value);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* SMC returning actual watts, keep consistent with legacy asics, low 8 bit as 8 fractional bits */
|
||||
*query = value << 8;
|
||||
|
@ -4810,14 +4832,16 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
uint32_t gen_speed, lane_width, current_gen_speed, current_lane_width;
|
||||
PPTable_t *pptable = &(data->smc_state_table.pp_table);
|
||||
|
||||
int i, now, size = 0, count = 0;
|
||||
int i, ret, now, size = 0, count = 0;
|
||||
|
||||
switch (type) {
|
||||
case PP_SCLK:
|
||||
if (data->registry_data.sclk_dpm_key_disabled)
|
||||
break;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrentGfxclkIndex, &now);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrentGfxclkIndex, &now);
|
||||
if (ret)
|
||||
break;
|
||||
|
||||
if (hwmgr->pp_one_vf &&
|
||||
(hwmgr->dpm_level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK))
|
||||
|
@ -4833,7 +4857,9 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
if (data->registry_data.mclk_dpm_key_disabled)
|
||||
break;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrentUclkIndex, &now);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrentUclkIndex, &now);
|
||||
if (ret)
|
||||
break;
|
||||
|
||||
for (i = 0; i < mclk_table->count; i++)
|
||||
size += sprintf(buf + size, "%d: %uMhz %s\n",
|
||||
|
@ -4844,7 +4870,9 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
if (data->registry_data.socclk_dpm_key_disabled)
|
||||
break;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrentSocclkIndex, &now);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrentSocclkIndex, &now);
|
||||
if (ret)
|
||||
break;
|
||||
|
||||
for (i = 0; i < soc_table->count; i++)
|
||||
size += sprintf(buf + size, "%d: %uMhz %s\n",
|
||||
|
@ -4855,8 +4883,10 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
|
|||
if (data->registry_data.dcefclk_dpm_key_disabled)
|
||||
break;
|
||||
|
||||
smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
ret = smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_GetClockFreqMHz, CLK_DCEFCLK, &now);
|
||||
if (ret)
|
||||
break;
|
||||
|
||||
for (i = 0; i < dcef_table->count; i++)
|
||||
size += sprintf(buf + size, "%d: %uMhz %s\n",
|
||||
|
|
|
@ -293,12 +293,12 @@ static int vega12_set_features_platform_caps(struct pp_hwmgr *hwmgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void vega12_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
||||
static int vega12_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega12_hwmgr *data = (struct vega12_hwmgr *)(hwmgr->backend);
|
||||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
uint32_t top32, bottom32;
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
data->smu_features[GNLD_DPM_PREFETCHER].smu_feature_id =
|
||||
FEATURE_DPM_PREFETCHER_BIT;
|
||||
|
@ -364,10 +364,16 @@ static void vega12_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
/* Get the SN to turn into a Unique ID */
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumTop32, &top32);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumBottom32, &bottom32);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumTop32, &top32);
|
||||
if (ret)
|
||||
return ret;
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumBottom32, &bottom32);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
adev->unique_id = ((uint64_t)bottom32 << 32) | top32;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vega12_set_private_data_based_on_pptable(struct pp_hwmgr *hwmgr)
|
||||
|
@ -410,7 +416,11 @@ static int vega12_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
|
|||
|
||||
vega12_set_features_platform_caps(hwmgr);
|
||||
|
||||
vega12_init_dpm_defaults(hwmgr);
|
||||
result = vega12_init_dpm_defaults(hwmgr);
|
||||
if (result) {
|
||||
pr_err("%s failed\n", __func__);
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Parse pptable data read from VBIOS */
|
||||
vega12_set_private_data_based_on_pptable(hwmgr);
|
||||
|
|
|
@ -328,12 +328,12 @@ static int vega20_set_features_platform_caps(struct pp_hwmgr *hwmgr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void vega20_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
||||
static int vega20_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
|
||||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
uint32_t top32, bottom32;
|
||||
int i;
|
||||
int i, ret;
|
||||
|
||||
data->smu_features[GNLD_DPM_PREFETCHER].smu_feature_id =
|
||||
FEATURE_DPM_PREFETCHER_BIT;
|
||||
|
@ -404,10 +404,17 @@ static void vega20_init_dpm_defaults(struct pp_hwmgr *hwmgr)
|
|||
}
|
||||
|
||||
/* Get the SN to turn into a Unique ID */
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumTop32, &top32);
|
||||
smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumBottom32, &bottom32);
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumTop32, &top32);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = smum_send_msg_to_smc(hwmgr, PPSMC_MSG_ReadSerialNumBottom32, &bottom32);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
adev->unique_id = ((uint64_t)bottom32 << 32) | top32;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vega20_set_private_data_based_on_pptable(struct pp_hwmgr *hwmgr)
|
||||
|
@ -427,6 +434,7 @@ static int vega20_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
|
|||
{
|
||||
struct vega20_hwmgr *data;
|
||||
struct amdgpu_device *adev = hwmgr->adev;
|
||||
int result;
|
||||
|
||||
data = kzalloc(sizeof(struct vega20_hwmgr), GFP_KERNEL);
|
||||
if (data == NULL)
|
||||
|
@ -452,8 +460,11 @@ static int vega20_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
|
|||
|
||||
vega20_set_features_platform_caps(hwmgr);
|
||||
|
||||
vega20_init_dpm_defaults(hwmgr);
|
||||
|
||||
result = vega20_init_dpm_defaults(hwmgr);
|
||||
if (result) {
|
||||
pr_err("%s failed\n", __func__);
|
||||
return result;
|
||||
}
|
||||
/* Parse pptable data read from VBIOS */
|
||||
vega20_set_private_data_based_on_pptable(hwmgr);
|
||||
|
||||
|
@ -4091,9 +4102,11 @@ static int vega20_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, ui
|
|||
if (power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
|
||||
struct vega20_hwmgr *data =
|
||||
(struct vega20_hwmgr *)(hwmgr->backend);
|
||||
if (size == 0 && !data->is_custom_profile_set)
|
||||
|
||||
if (size != 10 && size != 0)
|
||||
return -EINVAL;
|
||||
if (size < 10 && size != 0)
|
||||
|
||||
if (size == 0 && !data->is_custom_profile_set)
|
||||
return -EINVAL;
|
||||
|
||||
result = vega20_get_activity_monitor_coeff(hwmgr,
|
||||
|
@ -4155,6 +4168,8 @@ static int vega20_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, ui
|
|||
activity_monitor.Fclk_PD_Data_error_coeff = input[8];
|
||||
activity_monitor.Fclk_PD_Data_error_rate_coeff = input[9];
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
result = vega20_set_activity_monitor_coeff(hwmgr,
|
||||
|
|
|
@ -130,13 +130,17 @@ int vega10_get_enabled_smc_features(struct pp_hwmgr *hwmgr,
|
|||
uint64_t *features_enabled)
|
||||
{
|
||||
uint32_t enabled_features;
|
||||
int ret;
|
||||
|
||||
if (features_enabled == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
smum_send_msg_to_smc(hwmgr,
|
||||
ret = smum_send_msg_to_smc(hwmgr,
|
||||
PPSMC_MSG_GetEnabledSmuFeatures,
|
||||
&enabled_features);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
*features_enabled = enabled_features;
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -1222,19 +1222,22 @@ static int navi10_get_current_clk_freq_by_table(struct smu_context *smu,
|
|||
value);
|
||||
}
|
||||
|
||||
static bool navi10_is_support_fine_grained_dpm(struct smu_context *smu, enum smu_clk_type clk_type)
|
||||
static int navi10_is_support_fine_grained_dpm(struct smu_context *smu, enum smu_clk_type clk_type)
|
||||
{
|
||||
PPTable_t *pptable = smu->smu_table.driver_pptable;
|
||||
DpmDescriptor_t *dpm_desc = NULL;
|
||||
uint32_t clk_index = 0;
|
||||
int clk_index = 0;
|
||||
|
||||
clk_index = smu_cmn_to_asic_specific_index(smu,
|
||||
CMN2ASIC_MAPPING_CLK,
|
||||
clk_type);
|
||||
if (clk_index < 0)
|
||||
return clk_index;
|
||||
|
||||
dpm_desc = &pptable->DpmDescriptor[clk_index];
|
||||
|
||||
/* 0 - Fine grained DPM, 1 - Discrete DPM */
|
||||
return dpm_desc->SnapToDiscrete == 0;
|
||||
return dpm_desc->SnapToDiscrete == 0 ? 1 : 0;
|
||||
}
|
||||
|
||||
static inline bool navi10_od_feature_is_supported(struct smu_11_0_overdrive_table *od_table, enum SMU_11_0_ODFEATURE_CAP cap)
|
||||
|
@ -1290,7 +1293,11 @@ static int navi10_emit_clk_levels(struct smu_context *smu,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!navi10_is_support_fine_grained_dpm(smu, clk_type)) {
|
||||
ret = navi10_is_support_fine_grained_dpm(smu, clk_type);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!ret) {
|
||||
for (i = 0; i < count; i++) {
|
||||
ret = smu_v11_0_get_dpm_freq_by_index(smu,
|
||||
clk_type, i, &value);
|
||||
|
@ -1499,7 +1506,11 @@ static int navi10_print_clk_levels(struct smu_context *smu,
|
|||
if (ret)
|
||||
return size;
|
||||
|
||||
if (!navi10_is_support_fine_grained_dpm(smu, clk_type)) {
|
||||
ret = navi10_is_support_fine_grained_dpm(smu, clk_type);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!ret) {
|
||||
for (i = 0; i < count; i++) {
|
||||
ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, i, &value);
|
||||
if (ret)
|
||||
|
@ -1668,7 +1679,11 @@ static int navi10_force_clk_levels(struct smu_context *smu,
|
|||
case SMU_UCLK:
|
||||
case SMU_FCLK:
|
||||
/* There is only 2 levels for fine grained DPM */
|
||||
if (navi10_is_support_fine_grained_dpm(smu, clk_type)) {
|
||||
ret = navi10_is_support_fine_grained_dpm(smu, clk_type);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (ret) {
|
||||
soft_max_level = (soft_max_level >= 1 ? 1 : 0);
|
||||
soft_min_level = (soft_min_level >= 1 ? 1 : 0);
|
||||
}
|
||||
|
|
|
@ -1009,6 +1009,18 @@ static int vangogh_get_dpm_ultimate_freq(struct smu_context *smu,
|
|||
}
|
||||
}
|
||||
if (min) {
|
||||
ret = vangogh_get_profiling_clk_mask(smu,
|
||||
AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK,
|
||||
NULL,
|
||||
NULL,
|
||||
&mclk_mask,
|
||||
&fclk_mask,
|
||||
&soc_mask);
|
||||
if (ret)
|
||||
goto failed;
|
||||
|
||||
vclk_mask = dclk_mask = 0;
|
||||
|
||||
switch (clk_type) {
|
||||
case SMU_UCLK:
|
||||
case SMU_MCLK:
|
||||
|
@ -2481,6 +2493,8 @@ static u32 vangogh_set_gfxoff_residency(struct smu_context *smu, bool start)
|
|||
|
||||
ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_LogGfxOffResidency,
|
||||
start, &residency);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!start)
|
||||
adev->gfx.gfx_off_residency = residency;
|
||||
|
|
|
@ -1931,7 +1931,8 @@ static int aldebaran_mode2_reset(struct smu_context *smu)
|
|||
|
||||
index = smu_cmn_to_asic_specific_index(smu, CMN2ASIC_MAPPING_MSG,
|
||||
SMU_MSG_GfxDeviceDriverReset);
|
||||
|
||||
if (index < 0 )
|
||||
return -EINVAL;
|
||||
mutex_lock(&smu->message_lock);
|
||||
if (smu_version >= 0x00441400) {
|
||||
ret = smu_cmn_send_msg_without_waiting(smu, (uint16_t)index, SMU_RESET_MODE_2);
|
||||
|
|
|
@ -2058,6 +2058,8 @@ static int smu_v13_0_6_mode2_reset(struct smu_context *smu)
|
|||
|
||||
index = smu_cmn_to_asic_specific_index(smu, CMN2ASIC_MAPPING_MSG,
|
||||
SMU_MSG_GfxDeviceDriverReset);
|
||||
if (index < 0)
|
||||
return index;
|
||||
|
||||
mutex_lock(&smu->message_lock);
|
||||
|
||||
|
|
|
@ -2034,7 +2034,7 @@ static irqreturn_t tc_irq_handler(int irq, void *arg)
|
|||
dev_err(tc->dev, "syserr %x\n", stat);
|
||||
}
|
||||
|
||||
if (tc->hpd_pin >= 0 && tc->bridge.dev) {
|
||||
if (tc->hpd_pin >= 0 && tc->bridge.dev && tc->aux.drm_dev) {
|
||||
/*
|
||||
* H is triggered when the GPIO goes high.
|
||||
*
|
||||
|
|
|
@ -631,6 +631,17 @@ static void drm_fb_helper_add_damage_clip(struct drm_fb_helper *helper, u32 x, u
|
|||
static void drm_fb_helper_damage(struct drm_fb_helper *helper, u32 x, u32 y,
|
||||
u32 width, u32 height)
|
||||
{
|
||||
/*
|
||||
* This function may be invoked by panic() to flush the frame
|
||||
* buffer, where all CPUs except the panic CPU are stopped.
|
||||
* During the following schedule_work(), the panic CPU needs
|
||||
* the worker_pool lock, which might be held by a stopped CPU,
|
||||
* causing schedule_work() and panic() to block. Return early on
|
||||
* oops_in_progress to prevent this blocking.
|
||||
*/
|
||||
if (oops_in_progress)
|
||||
return;
|
||||
|
||||
drm_fb_helper_add_damage_clip(helper, x, y, width, height);
|
||||
|
||||
schedule_work(&helper->damage_work);
|
||||
|
|
|
@ -414,6 +414,12 @@ static const struct dmi_system_id orientation_data[] = {
|
|||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ONE XPLAYER"),
|
||||
},
|
||||
.driver_data = (void *)&lcd1600x2560_leftside_up,
|
||||
}, { /* OrangePi Neo */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "OrangePi"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "NEO-01"),
|
||||
},
|
||||
.driver_data = (void *)&lcd1200x1920_rightside_up,
|
||||
}, { /* Samsung GalaxyBook 10.6 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
|
||||
|
|
|
@ -534,6 +534,7 @@ int meson_plane_create(struct meson_drm *priv)
|
|||
struct meson_plane *meson_plane;
|
||||
struct drm_plane *plane;
|
||||
const uint64_t *format_modifiers = format_modifiers_default;
|
||||
int ret;
|
||||
|
||||
meson_plane = devm_kzalloc(priv->drm->dev, sizeof(*meson_plane),
|
||||
GFP_KERNEL);
|
||||
|
@ -548,12 +549,16 @@ int meson_plane_create(struct meson_drm *priv)
|
|||
else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A))
|
||||
format_modifiers = format_modifiers_afbc_g12a;
|
||||
|
||||
drm_universal_plane_init(priv->drm, plane, 0xFF,
|
||||
&meson_plane_funcs,
|
||||
supported_drm_formats,
|
||||
ARRAY_SIZE(supported_drm_formats),
|
||||
format_modifiers,
|
||||
DRM_PLANE_TYPE_PRIMARY, "meson_primary_plane");
|
||||
ret = drm_universal_plane_init(priv->drm, plane, 0xFF,
|
||||
&meson_plane_funcs,
|
||||
supported_drm_formats,
|
||||
ARRAY_SIZE(supported_drm_formats),
|
||||
format_modifiers,
|
||||
DRM_PLANE_TYPE_PRIMARY, "meson_primary_plane");
|
||||
if (ret) {
|
||||
devm_kfree(priv->drm->dev, meson_plane);
|
||||
return ret;
|
||||
}
|
||||
|
||||
drm_plane_helper_add(plane, &meson_plane_helper_funcs);
|
||||
|
||||
|
|
|
@ -159,8 +159,9 @@ static void read_tempreg_nb_f15(struct pci_dev *pdev, u32 *regval)
|
|||
|
||||
static void read_tempreg_nb_zen(struct pci_dev *pdev, u32 *regval)
|
||||
{
|
||||
amd_smn_read(amd_pci_dev_to_node_id(pdev),
|
||||
ZEN_REPORTED_TEMP_CTRL_BASE, regval);
|
||||
if (amd_smn_read(amd_pci_dev_to_node_id(pdev),
|
||||
ZEN_REPORTED_TEMP_CTRL_BASE, regval))
|
||||
*regval = 0;
|
||||
}
|
||||
|
||||
static long get_raw_temp(struct k10temp_data *data)
|
||||
|
@ -207,27 +208,31 @@ static int k10temp_read_labels(struct device *dev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void hygon_read_temp(struct k10temp_data *data, int channel,
|
||||
static int hygon_read_temp(struct k10temp_data *data, int channel,
|
||||
u32 *regval)
|
||||
{
|
||||
struct hygon_private *h_priv;
|
||||
int ret;
|
||||
|
||||
h_priv = (struct hygon_private *)data->priv;
|
||||
if ((channel - 2) < h_priv->index_2nd)
|
||||
amd_smn_read(amd_pci_dev_to_node_id(data->pdev),
|
||||
ret = amd_smn_read(amd_pci_dev_to_node_id(data->pdev),
|
||||
ZEN_CCD_TEMP(data->ccd_offset, channel - 2),
|
||||
regval);
|
||||
else
|
||||
amd_smn_read(amd_pci_dev_to_node_id(data->pdev),
|
||||
ret = amd_smn_read(amd_pci_dev_to_node_id(data->pdev),
|
||||
ZEN_CCD_TEMP(h_priv->offset_2nd,
|
||||
channel - 2 - h_priv->index_2nd),
|
||||
regval);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int k10temp_read_temp(struct device *dev, u32 attr, int channel,
|
||||
long *val)
|
||||
{
|
||||
struct k10temp_data *data = dev_get_drvdata(dev);
|
||||
int ret = -EOPNOTSUPP;
|
||||
u32 regval;
|
||||
|
||||
switch (attr) {
|
||||
|
@ -245,15 +250,19 @@ static int k10temp_read_temp(struct device *dev, u32 attr, int channel,
|
|||
break;
|
||||
case 2 ... 13: /* Tccd{1-12} */
|
||||
if (hygon_f18h_m4h())
|
||||
hygon_read_temp(data, channel, ®val);
|
||||
ret = hygon_read_temp(data, channel, ®val);
|
||||
else
|
||||
amd_smn_read(amd_pci_dev_to_node_id(data->pdev),
|
||||
ret = amd_smn_read(amd_pci_dev_to_node_id(data->pdev),
|
||||
ZEN_CCD_TEMP(data->ccd_offset, channel - 2),
|
||||
®val);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
*val = (regval & ZEN_CCD_TEMP_MASK) * 125 - 49000;
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
case hwmon_temp_max:
|
||||
|
@ -269,7 +278,7 @@ static int k10temp_read_temp(struct device *dev, u32 attr, int channel,
|
|||
- ((regval >> 24) & 0xf)) * 500 + 52000;
|
||||
break;
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -407,8 +416,20 @@ static void k10temp_get_ccd_support(struct pci_dev *pdev,
|
|||
int i;
|
||||
|
||||
for (i = 0; i < limit; i++) {
|
||||
amd_smn_read(amd_pci_dev_to_node_id(pdev),
|
||||
ZEN_CCD_TEMP(data->ccd_offset, i), ®val);
|
||||
/*
|
||||
* Ignore inaccessible CCDs.
|
||||
*
|
||||
* Some systems will return a register value of 0, and the TEMP_VALID
|
||||
* bit check below will naturally fail.
|
||||
*
|
||||
* Other systems will return a PCI_ERROR_RESPONSE (0xFFFFFFFF) for
|
||||
* the register value. And this will incorrectly pass the TEMP_VALID
|
||||
* bit check.
|
||||
*/
|
||||
if (amd_smn_read(amd_pci_dev_to_node_id(pdev),
|
||||
ZEN_CCD_TEMP(data->ccd_offset, i), ®val))
|
||||
continue;
|
||||
|
||||
if (regval & ZEN_CCD_TEMP_VALID)
|
||||
data->show_temp |= BIT(TCCD_BIT(i));
|
||||
}
|
||||
|
|
|
@ -302,6 +302,34 @@ void __hwspin_unlock(struct hwspinlock *hwlock, int mode, unsigned long *flags)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(__hwspin_unlock);
|
||||
|
||||
/**
|
||||
* hwspin_lock_bust() - bust a specific hwspinlock
|
||||
* @hwlock: a previously-acquired hwspinlock which we want to bust
|
||||
* @id: identifier of the remote lock holder, if applicable
|
||||
*
|
||||
* This function will bust a hwspinlock that was previously acquired as
|
||||
* long as the current owner of the lock matches the id given by the caller.
|
||||
*
|
||||
* Context: Process context.
|
||||
*
|
||||
* Returns: 0 on success, or -EINVAL if the hwspinlock does not exist, or
|
||||
* the bust operation fails, and -EOPNOTSUPP if the bust operation is not
|
||||
* defined for the hwspinlock.
|
||||
*/
|
||||
int hwspin_lock_bust(struct hwspinlock *hwlock, unsigned int id)
|
||||
{
|
||||
if (WARN_ON(!hwlock))
|
||||
return -EINVAL;
|
||||
|
||||
if (!hwlock->bank->ops->bust) {
|
||||
pr_err("bust operation not defined\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
return hwlock->bank->ops->bust(hwlock, id);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hwspin_lock_bust);
|
||||
|
||||
/**
|
||||
* of_hwspin_lock_simple_xlate - translate hwlock_spec to return a lock id
|
||||
* @bank: the hwspinlock device bank
|
||||
|
|
|
@ -21,6 +21,8 @@ struct hwspinlock_device;
|
|||
* @trylock: make a single attempt to take the lock. returns 0 on
|
||||
* failure and true on success. may _not_ sleep.
|
||||
* @unlock: release the lock. always succeed. may _not_ sleep.
|
||||
* @bust: optional, platform-specific bust handler, called by hwspinlock
|
||||
* core to bust a specific lock.
|
||||
* @relax: optional, platform-specific relax handler, called by hwspinlock
|
||||
* core while spinning on a lock, between two successive
|
||||
* invocations of @trylock. may _not_ sleep.
|
||||
|
@ -28,6 +30,7 @@ struct hwspinlock_device;
|
|||
struct hwspinlock_ops {
|
||||
int (*trylock)(struct hwspinlock *lock);
|
||||
void (*unlock)(struct hwspinlock *lock);
|
||||
int (*bust)(struct hwspinlock *lock, unsigned int id);
|
||||
void (*relax)(struct hwspinlock *lock);
|
||||
};
|
||||
|
||||
|
|
|
@ -752,9 +752,11 @@ static ssize_t iio_read_channel_info(struct device *dev,
|
|||
INDIO_MAX_RAW_ELEMENTS,
|
||||
vals, &val_len,
|
||||
this_attr->address);
|
||||
else
|
||||
else if (indio_dev->info->read_raw)
|
||||
ret = indio_dev->info->read_raw(indio_dev, this_attr->c,
|
||||
&vals[0], &vals[1], this_attr->address);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -836,6 +838,9 @@ static ssize_t iio_read_channel_info_avail(struct device *dev,
|
|||
int length;
|
||||
int type;
|
||||
|
||||
if (!indio_dev->info->read_avail)
|
||||
return -EINVAL;
|
||||
|
||||
ret = indio_dev->info->read_avail(indio_dev, this_attr->c,
|
||||
&vals, &type, &length,
|
||||
this_attr->address);
|
||||
|
|
|
@ -285,6 +285,9 @@ static ssize_t iio_ev_state_store(struct device *dev,
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (!indio_dev->info->write_event_config)
|
||||
return -EINVAL;
|
||||
|
||||
ret = indio_dev->info->write_event_config(indio_dev,
|
||||
this_attr->c, iio_ev_attr_type(this_attr),
|
||||
iio_ev_attr_dir(this_attr), val);
|
||||
|
@ -300,6 +303,9 @@ static ssize_t iio_ev_state_show(struct device *dev,
|
|||
struct iio_dev_attr *this_attr = to_iio_dev_attr(attr);
|
||||
int val;
|
||||
|
||||
if (!indio_dev->info->read_event_config)
|
||||
return -EINVAL;
|
||||
|
||||
val = indio_dev->info->read_event_config(indio_dev,
|
||||
this_attr->c, iio_ev_attr_type(this_attr),
|
||||
iio_ev_attr_dir(this_attr));
|
||||
|
@ -318,6 +324,9 @@ static ssize_t iio_ev_value_show(struct device *dev,
|
|||
int val, val2, val_arr[2];
|
||||
int ret;
|
||||
|
||||
if (!indio_dev->info->read_event_value)
|
||||
return -EINVAL;
|
||||
|
||||
ret = indio_dev->info->read_event_value(indio_dev,
|
||||
this_attr->c, iio_ev_attr_type(this_attr),
|
||||
iio_ev_attr_dir(this_attr), iio_ev_attr_info(this_attr),
|
||||
|
|
|
@ -562,6 +562,7 @@ EXPORT_SYMBOL_GPL(devm_iio_channel_get_all);
|
|||
static int iio_channel_read(struct iio_channel *chan, int *val, int *val2,
|
||||
enum iio_chan_info_enum info)
|
||||
{
|
||||
const struct iio_info *iio_info = chan->indio_dev->info;
|
||||
int unused;
|
||||
int vals[INDIO_MAX_RAW_ELEMENTS];
|
||||
int ret;
|
||||
|
@ -573,15 +574,18 @@ static int iio_channel_read(struct iio_channel *chan, int *val, int *val2,
|
|||
if (!iio_channel_has_info(chan->channel, info))
|
||||
return -EINVAL;
|
||||
|
||||
if (chan->indio_dev->info->read_raw_multi) {
|
||||
ret = chan->indio_dev->info->read_raw_multi(chan->indio_dev,
|
||||
chan->channel, INDIO_MAX_RAW_ELEMENTS,
|
||||
vals, &val_len, info);
|
||||
if (iio_info->read_raw_multi) {
|
||||
ret = iio_info->read_raw_multi(chan->indio_dev,
|
||||
chan->channel,
|
||||
INDIO_MAX_RAW_ELEMENTS,
|
||||
vals, &val_len, info);
|
||||
*val = vals[0];
|
||||
*val2 = vals[1];
|
||||
} else if (iio_info->read_raw) {
|
||||
ret = iio_info->read_raw(chan->indio_dev,
|
||||
chan->channel, val, val2, info);
|
||||
} else {
|
||||
ret = chan->indio_dev->info->read_raw(chan->indio_dev,
|
||||
chan->channel, val, val2, info);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
@ -801,11 +805,15 @@ static int iio_channel_read_avail(struct iio_channel *chan,
|
|||
const int **vals, int *type, int *length,
|
||||
enum iio_chan_info_enum info)
|
||||
{
|
||||
const struct iio_info *iio_info = chan->indio_dev->info;
|
||||
|
||||
if (!iio_channel_has_available(chan->channel, info))
|
||||
return -EINVAL;
|
||||
|
||||
return chan->indio_dev->info->read_avail(chan->indio_dev, chan->channel,
|
||||
vals, type, length, info);
|
||||
if (iio_info->read_avail)
|
||||
return iio_info->read_avail(chan->indio_dev, chan->channel,
|
||||
vals, type, length, info);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int iio_read_avail_channel_attribute(struct iio_channel *chan,
|
||||
|
@ -995,8 +1003,12 @@ EXPORT_SYMBOL_GPL(iio_get_channel_type);
|
|||
static int iio_channel_write(struct iio_channel *chan, int val, int val2,
|
||||
enum iio_chan_info_enum info)
|
||||
{
|
||||
return chan->indio_dev->info->write_raw(chan->indio_dev,
|
||||
chan->channel, val, val2, info);
|
||||
const struct iio_info *iio_info = chan->indio_dev->info;
|
||||
|
||||
if (iio_info->write_raw)
|
||||
return iio_info->write_raw(chan->indio_dev,
|
||||
chan->channel, val, val2, info);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
int iio_write_channel_attribute(struct iio_channel *chan, int val, int val2,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
|
||||
/*
|
||||
* Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
* Copyright 2018-2024 Amazon.com, Inc. or its affiliates. All rights reserved.
|
||||
*/
|
||||
|
||||
#include "efa_com.h"
|
||||
|
@ -406,8 +406,8 @@ static struct efa_comp_ctx *efa_com_submit_admin_cmd(struct efa_com_admin_queue
|
|||
return comp_ctx;
|
||||
}
|
||||
|
||||
static void efa_com_handle_single_admin_completion(struct efa_com_admin_queue *aq,
|
||||
struct efa_admin_acq_entry *cqe)
|
||||
static int efa_com_handle_single_admin_completion(struct efa_com_admin_queue *aq,
|
||||
struct efa_admin_acq_entry *cqe)
|
||||
{
|
||||
struct efa_comp_ctx *comp_ctx;
|
||||
u16 cmd_id;
|
||||
|
@ -416,11 +416,11 @@ static void efa_com_handle_single_admin_completion(struct efa_com_admin_queue *a
|
|||
EFA_ADMIN_ACQ_COMMON_DESC_COMMAND_ID);
|
||||
|
||||
comp_ctx = efa_com_get_comp_ctx(aq, cmd_id, false);
|
||||
if (!comp_ctx) {
|
||||
if (comp_ctx->status != EFA_CMD_SUBMITTED) {
|
||||
ibdev_err(aq->efa_dev,
|
||||
"comp_ctx is NULL. Changing the admin queue running state\n");
|
||||
clear_bit(EFA_AQ_STATE_RUNNING_BIT, &aq->state);
|
||||
return;
|
||||
"Received completion with unexpected command id[%d], sq producer: %d, sq consumer: %d, cq consumer: %d\n",
|
||||
cmd_id, aq->sq.pc, aq->sq.cc, aq->cq.cc);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
comp_ctx->status = EFA_CMD_COMPLETED;
|
||||
|
@ -428,14 +428,17 @@ static void efa_com_handle_single_admin_completion(struct efa_com_admin_queue *a
|
|||
|
||||
if (!test_bit(EFA_AQ_STATE_POLLING_BIT, &aq->state))
|
||||
complete(&comp_ctx->wait_event);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void efa_com_handle_admin_completion(struct efa_com_admin_queue *aq)
|
||||
{
|
||||
struct efa_admin_acq_entry *cqe;
|
||||
u16 queue_size_mask;
|
||||
u16 comp_num = 0;
|
||||
u16 comp_cmds = 0;
|
||||
u8 phase;
|
||||
int err;
|
||||
u16 ci;
|
||||
|
||||
queue_size_mask = aq->depth - 1;
|
||||
|
@ -453,10 +456,12 @@ static void efa_com_handle_admin_completion(struct efa_com_admin_queue *aq)
|
|||
* phase bit was validated
|
||||
*/
|
||||
dma_rmb();
|
||||
efa_com_handle_single_admin_completion(aq, cqe);
|
||||
err = efa_com_handle_single_admin_completion(aq, cqe);
|
||||
if (!err)
|
||||
comp_cmds++;
|
||||
|
||||
aq->cq.cc++;
|
||||
ci++;
|
||||
comp_num++;
|
||||
if (ci == aq->depth) {
|
||||
ci = 0;
|
||||
phase = !phase;
|
||||
|
@ -465,10 +470,9 @@ static void efa_com_handle_admin_completion(struct efa_com_admin_queue *aq)
|
|||
cqe = &aq->cq.entries[ci];
|
||||
}
|
||||
|
||||
aq->cq.cc += comp_num;
|
||||
aq->cq.phase = phase;
|
||||
aq->sq.cc += comp_num;
|
||||
atomic64_add(comp_num, &aq->stats.completed_cmd);
|
||||
aq->sq.cc += comp_cmds;
|
||||
atomic64_add(comp_cmds, &aq->stats.completed_cmd);
|
||||
}
|
||||
|
||||
static int efa_com_comp_status_to_errno(u8 comp_status)
|
||||
|
|
|
@ -687,16 +687,26 @@ static int uvc_parse_streaming(struct uvc_device *dev,
|
|||
goto error;
|
||||
}
|
||||
|
||||
size = nformats * sizeof(*format) + nframes * sizeof(*frame)
|
||||
/*
|
||||
* Allocate memory for the formats, the frames and the intervals,
|
||||
* plus any required padding to guarantee that everything has the
|
||||
* correct alignment.
|
||||
*/
|
||||
size = nformats * sizeof(*format);
|
||||
size = ALIGN(size, __alignof__(*frame)) + nframes * sizeof(*frame);
|
||||
size = ALIGN(size, __alignof__(*interval))
|
||||
+ nintervals * sizeof(*interval);
|
||||
|
||||
format = kzalloc(size, GFP_KERNEL);
|
||||
if (format == NULL) {
|
||||
if (!format) {
|
||||
ret = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
|
||||
frame = (struct uvc_frame *)&format[nformats];
|
||||
interval = (u32 *)&frame[nframes];
|
||||
frame = (void *)format + nformats * sizeof(*format);
|
||||
frame = PTR_ALIGN(frame, __alignof__(*frame));
|
||||
interval = (void *)frame + nframes * sizeof(*frame);
|
||||
interval = PTR_ALIGN(interval, __alignof__(*interval));
|
||||
|
||||
streaming->formats = format;
|
||||
streaming->nformats = 0;
|
||||
|
|
|
@ -23,6 +23,15 @@ int cci_read(struct regmap *map, u32 reg, u64 *val, int *err)
|
|||
u8 buf[8];
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* TODO: Fix smatch. Assign *val to 0 here in order to avoid
|
||||
* failing a smatch check on caller when the caller proceeds to
|
||||
* read *val without initialising it on caller's side. *val is set
|
||||
* to a valid value whenever this function returns 0 but smatch
|
||||
* can't figure that out currently.
|
||||
*/
|
||||
*val = 0;
|
||||
|
||||
if (err && *err)
|
||||
return *err;
|
||||
|
||||
|
|
|
@ -2369,7 +2369,8 @@ static void mlx5e_handle_rx_cqe_mpwrq_shampo(struct mlx5e_rq *rq, struct mlx5_cq
|
|||
if (flush)
|
||||
mlx5e_shampo_flush_skb(rq, cqe, match);
|
||||
free_hd_entry:
|
||||
mlx5e_free_rx_shampo_hd_entry(rq, header_index);
|
||||
if (likely(head_size))
|
||||
mlx5e_free_rx_shampo_hd_entry(rq, header_index);
|
||||
mpwrq_cqe_out:
|
||||
if (likely(wi->consumed_strides < rq->mpwqe.num_strides))
|
||||
return;
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
/* don't try to optimize STE allocation if the stack is too constaraining */
|
||||
#define DR_RULE_MAX_STES_OPTIMIZED 0
|
||||
#else
|
||||
#define DR_RULE_MAX_STES_OPTIMIZED 5
|
||||
#define DR_RULE_MAX_STES_OPTIMIZED 2
|
||||
#endif
|
||||
#define DR_RULE_MAX_STE_CHAIN_OPTIMIZED (DR_RULE_MAX_STES_OPTIMIZED + DR_ACTION_MAX_STES)
|
||||
|
||||
|
|
|
@ -234,7 +234,7 @@ static int ionic_request_irq(struct ionic_lif *lif, struct ionic_qcq *qcq)
|
|||
name = dev_name(dev);
|
||||
|
||||
snprintf(intr->name, sizeof(intr->name),
|
||||
"%s-%s-%s", IONIC_DRV_NAME, name, q->name);
|
||||
"%.5s-%.16s-%.8s", IONIC_DRV_NAME, name, q->name);
|
||||
|
||||
return devm_request_irq(dev, intr->vector, ionic_isr,
|
||||
0, intr->name, &qcq->napi);
|
||||
|
|
|
@ -1438,6 +1438,7 @@ static const struct usb_device_id products[] = {
|
|||
{QMI_QUIRK_SET_DTR(0x1546, 0x1312, 4)}, /* u-blox LARA-R6 01B */
|
||||
{QMI_QUIRK_SET_DTR(0x1546, 0x1342, 4)}, /* u-blox LARA-L6 */
|
||||
{QMI_QUIRK_SET_DTR(0x33f8, 0x0104, 4)}, /* Rolling RW101 RMNET */
|
||||
{QMI_FIXED_INTF(0x2dee, 0x4d22, 5)}, /* MeiG Smart SRM825L */
|
||||
|
||||
/* 4. Gobi 1000 devices */
|
||||
{QMI_GOBI1K_DEVICE(0x05c6, 0x9212)}, /* Acer Gobi Modem Device */
|
||||
|
|
|
@ -2140,7 +2140,7 @@ static int virtnet_receive(struct receive_queue *rq, int budget,
|
|||
return packets;
|
||||
}
|
||||
|
||||
static void virtnet_poll_cleantx(struct receive_queue *rq)
|
||||
static void virtnet_poll_cleantx(struct receive_queue *rq, int budget)
|
||||
{
|
||||
struct virtnet_info *vi = rq->vq->vdev->priv;
|
||||
unsigned int index = vq2rxq(rq->vq);
|
||||
|
@ -2158,7 +2158,7 @@ static void virtnet_poll_cleantx(struct receive_queue *rq)
|
|||
|
||||
do {
|
||||
virtqueue_disable_cb(sq->vq);
|
||||
free_old_xmit_skbs(sq, true);
|
||||
free_old_xmit_skbs(sq, !!budget);
|
||||
} while (unlikely(!virtqueue_enable_cb_delayed(sq->vq)));
|
||||
|
||||
if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS)
|
||||
|
@ -2177,7 +2177,7 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
|
|||
unsigned int received;
|
||||
unsigned int xdp_xmit = 0;
|
||||
|
||||
virtnet_poll_cleantx(rq);
|
||||
virtnet_poll_cleantx(rq, budget);
|
||||
|
||||
received = virtnet_receive(rq, budget, &xdp_xmit);
|
||||
|
||||
|
@ -2280,7 +2280,7 @@ static int virtnet_poll_tx(struct napi_struct *napi, int budget)
|
|||
txq = netdev_get_tx_queue(vi->dev, index);
|
||||
__netif_tx_lock(txq, raw_smp_processor_id());
|
||||
virtqueue_disable_cb(sq->vq);
|
||||
free_old_xmit_skbs(sq, true);
|
||||
free_old_xmit_skbs(sq, !!budget);
|
||||
|
||||
if (sq->vq->num_free >= 2 + MAX_SKB_FRAGS)
|
||||
netif_tx_wake_queue(txq);
|
||||
|
|
|
@ -2293,7 +2293,7 @@ static int ath11k_qmi_load_file_target_mem(struct ath11k_base *ab,
|
|||
struct qmi_txn txn;
|
||||
const u8 *temp = data;
|
||||
void __iomem *bdf_addr = NULL;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
u32 remaining = len;
|
||||
|
||||
req = kzalloc(sizeof(*req), GFP_KERNEL);
|
||||
|
|
|
@ -2312,7 +2312,7 @@ static int ath12k_qmi_load_file_target_mem(struct ath12k_base *ab,
|
|||
struct qmi_wlanfw_bdf_download_resp_msg_v01 resp;
|
||||
struct qmi_txn txn = {};
|
||||
const u8 *temp = data;
|
||||
int ret;
|
||||
int ret = 0;
|
||||
u32 remaining = len;
|
||||
|
||||
req = kzalloc(sizeof(*req), GFP_KERNEL);
|
||||
|
|
|
@ -230,8 +230,7 @@ static ssize_t iwl_dbgfs_send_hcmd_write(struct iwl_fw_runtime *fwrt, char *buf,
|
|||
.data = { NULL, },
|
||||
};
|
||||
|
||||
if (fwrt->ops && fwrt->ops->fw_running &&
|
||||
!fwrt->ops->fw_running(fwrt->ops_ctx))
|
||||
if (!iwl_trans_fw_running(fwrt->trans))
|
||||
return -EIO;
|
||||
|
||||
if (count < header_size + 1 || count > 1024 * 4)
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
struct iwl_fw_runtime_ops {
|
||||
void (*dump_start)(void *ctx);
|
||||
void (*dump_end)(void *ctx);
|
||||
bool (*fw_running)(void *ctx);
|
||||
int (*send_hcmd)(void *ctx, struct iwl_host_cmd *host_cmd);
|
||||
bool (*d3_debug_enable)(void *ctx);
|
||||
};
|
||||
|
|
|
@ -702,11 +702,6 @@ static void iwl_mvm_fwrt_dump_end(void *ctx)
|
|||
mutex_unlock(&mvm->mutex);
|
||||
}
|
||||
|
||||
static bool iwl_mvm_fwrt_fw_running(void *ctx)
|
||||
{
|
||||
return iwl_mvm_firmware_running(ctx);
|
||||
}
|
||||
|
||||
static int iwl_mvm_fwrt_send_hcmd(void *ctx, struct iwl_host_cmd *host_cmd)
|
||||
{
|
||||
struct iwl_mvm *mvm = (struct iwl_mvm *)ctx;
|
||||
|
@ -727,7 +722,6 @@ static bool iwl_mvm_d3_debug_enable(void *ctx)
|
|||
static const struct iwl_fw_runtime_ops iwl_mvm_fwrt_ops = {
|
||||
.dump_start = iwl_mvm_fwrt_dump_start,
|
||||
.dump_end = iwl_mvm_fwrt_dump_end,
|
||||
.fw_running = iwl_mvm_fwrt_fw_running,
|
||||
.send_hcmd = iwl_mvm_fwrt_send_hcmd,
|
||||
.d3_debug_enable = iwl_mvm_d3_debug_enable,
|
||||
};
|
||||
|
|
|
@ -308,9 +308,13 @@ static void ser_reset_vif(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif)
|
|||
|
||||
static void ser_sta_deinit_cam_iter(void *data, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw89_vif *rtwvif = (struct rtw89_vif *)data;
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
struct rtw89_vif *target_rtwvif = (struct rtw89_vif *)data;
|
||||
struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
|
||||
struct rtw89_vif *rtwvif = rtwsta->rtwvif;
|
||||
struct rtw89_dev *rtwdev = rtwvif->rtwdev;
|
||||
|
||||
if (rtwvif != target_rtwvif)
|
||||
return;
|
||||
|
||||
if (rtwvif->net_type == RTW89_NET_TYPE_AP_MODE || sta->tdls)
|
||||
rtw89_cam_deinit_addr_cam(rtwdev, &rtwsta->addr_cam);
|
||||
|
|
|
@ -242,18 +242,24 @@ static struct pci_ops al_child_pci_ops = {
|
|||
.write = pci_generic_config_write,
|
||||
};
|
||||
|
||||
static void al_pcie_config_prepare(struct al_pcie *pcie)
|
||||
static int al_pcie_config_prepare(struct al_pcie *pcie)
|
||||
{
|
||||
struct al_pcie_target_bus_cfg *target_bus_cfg;
|
||||
struct dw_pcie_rp *pp = &pcie->pci->pp;
|
||||
unsigned int ecam_bus_mask;
|
||||
struct resource_entry *ft;
|
||||
u32 cfg_control_offset;
|
||||
struct resource *bus;
|
||||
u8 subordinate_bus;
|
||||
u8 secondary_bus;
|
||||
u32 cfg_control;
|
||||
u32 reg;
|
||||
struct resource *bus = resource_list_first_type(&pp->bridge->windows, IORESOURCE_BUS)->res;
|
||||
|
||||
ft = resource_list_first_type(&pp->bridge->windows, IORESOURCE_BUS);
|
||||
if (!ft)
|
||||
return -ENODEV;
|
||||
|
||||
bus = ft->res;
|
||||
target_bus_cfg = &pcie->target_bus_cfg;
|
||||
|
||||
ecam_bus_mask = (pcie->ecam_size >> PCIE_ECAM_BUS_SHIFT) - 1;
|
||||
|
@ -287,6 +293,8 @@ static void al_pcie_config_prepare(struct al_pcie *pcie)
|
|||
FIELD_PREP(CFG_CONTROL_SEC_BUS_MASK, secondary_bus);
|
||||
|
||||
al_pcie_controller_writel(pcie, cfg_control_offset, reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int al_pcie_host_init(struct dw_pcie_rp *pp)
|
||||
|
@ -305,7 +313,9 @@ static int al_pcie_host_init(struct dw_pcie_rp *pp)
|
|||
if (rc)
|
||||
return rc;
|
||||
|
||||
al_pcie_config_prepare(pcie);
|
||||
rc = al_pcie_config_prepare(pcie);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -10,13 +10,65 @@
|
|||
|
||||
#include "cros_ec_lpc_mec.h"
|
||||
|
||||
#define ACPI_LOCK_DELAY_MS 500
|
||||
|
||||
/*
|
||||
* This mutex must be held while accessing the EMI unit. We can't rely on the
|
||||
* EC mutex because memmap data may be accessed without it being held.
|
||||
*/
|
||||
static DEFINE_MUTEX(io_mutex);
|
||||
/*
|
||||
* An alternative mutex to be used when the ACPI AML code may also
|
||||
* access memmap data. When set, this mutex is used in preference to
|
||||
* io_mutex.
|
||||
*/
|
||||
static acpi_handle aml_mutex;
|
||||
|
||||
static u16 mec_emi_base, mec_emi_end;
|
||||
|
||||
/**
|
||||
* cros_ec_lpc_mec_lock() - Acquire mutex for EMI
|
||||
*
|
||||
* @return: Negative error code, or zero for success
|
||||
*/
|
||||
static int cros_ec_lpc_mec_lock(void)
|
||||
{
|
||||
bool success;
|
||||
|
||||
if (!aml_mutex) {
|
||||
mutex_lock(&io_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
success = ACPI_SUCCESS(acpi_acquire_mutex(aml_mutex,
|
||||
NULL, ACPI_LOCK_DELAY_MS));
|
||||
if (!success)
|
||||
return -EBUSY;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* cros_ec_lpc_mec_unlock() - Release mutex for EMI
|
||||
*
|
||||
* @return: Negative error code, or zero for success
|
||||
*/
|
||||
static int cros_ec_lpc_mec_unlock(void)
|
||||
{
|
||||
bool success;
|
||||
|
||||
if (!aml_mutex) {
|
||||
mutex_unlock(&io_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
success = ACPI_SUCCESS(acpi_release_mutex(aml_mutex, NULL));
|
||||
if (!success)
|
||||
return -EBUSY;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* cros_ec_lpc_mec_emi_write_address() - Initialize EMI at a given address.
|
||||
*
|
||||
|
@ -77,6 +129,7 @@ u8 cros_ec_lpc_io_bytes_mec(enum cros_ec_lpc_mec_io_type io_type,
|
|||
int io_addr;
|
||||
u8 sum = 0;
|
||||
enum cros_ec_lpc_mec_emi_access_mode access, new_access;
|
||||
int ret;
|
||||
|
||||
/* Return checksum of 0 if window is not initialized */
|
||||
WARN_ON(mec_emi_base == 0 || mec_emi_end == 0);
|
||||
|
@ -92,7 +145,9 @@ u8 cros_ec_lpc_io_bytes_mec(enum cros_ec_lpc_mec_io_type io_type,
|
|||
else
|
||||
access = ACCESS_TYPE_LONG_AUTO_INCREMENT;
|
||||
|
||||
mutex_lock(&io_mutex);
|
||||
ret = cros_ec_lpc_mec_lock();
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Initialize I/O at desired address */
|
||||
cros_ec_lpc_mec_emi_write_address(offset, access);
|
||||
|
@ -134,7 +189,9 @@ u8 cros_ec_lpc_io_bytes_mec(enum cros_ec_lpc_mec_io_type io_type,
|
|||
}
|
||||
|
||||
done:
|
||||
mutex_unlock(&io_mutex);
|
||||
ret = cros_ec_lpc_mec_unlock();
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return sum;
|
||||
}
|
||||
|
@ -146,3 +203,18 @@ void cros_ec_lpc_mec_init(unsigned int base, unsigned int end)
|
|||
mec_emi_end = end;
|
||||
}
|
||||
EXPORT_SYMBOL(cros_ec_lpc_mec_init);
|
||||
|
||||
int cros_ec_lpc_mec_acpi_mutex(struct acpi_device *adev, const char *pathname)
|
||||
{
|
||||
int status;
|
||||
|
||||
if (!adev)
|
||||
return -ENOENT;
|
||||
|
||||
status = acpi_get_handle(adev->handle, pathname, &aml_mutex);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENOENT;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(cros_ec_lpc_mec_acpi_mutex);
|
||||
|
|
|
@ -8,6 +8,8 @@
|
|||
#ifndef __CROS_EC_LPC_MEC_H
|
||||
#define __CROS_EC_LPC_MEC_H
|
||||
|
||||
#include <linux/acpi.h>
|
||||
|
||||
enum cros_ec_lpc_mec_emi_access_mode {
|
||||
/* 8-bit access */
|
||||
ACCESS_TYPE_BYTE = 0x0,
|
||||
|
@ -45,6 +47,15 @@ enum cros_ec_lpc_mec_io_type {
|
|||
*/
|
||||
void cros_ec_lpc_mec_init(unsigned int base, unsigned int end);
|
||||
|
||||
/**
|
||||
* cros_ec_lpc_mec_acpi_mutex() - Find and set ACPI mutex for MEC
|
||||
*
|
||||
* @adev: Parent ACPI device
|
||||
* @pathname: Name of AML mutex
|
||||
* @return: Negative error code, or zero for success
|
||||
*/
|
||||
int cros_ec_lpc_mec_acpi_mutex(struct acpi_device *adev, const char *pathname);
|
||||
|
||||
/**
|
||||
* cros_ec_lpc_mec_in_range() - Determine if addresses are in MEC EMI range.
|
||||
*
|
||||
|
|
|
@ -359,6 +359,32 @@ static struct qcom_smem *__smem;
|
|||
/* Timeout (ms) for the trylock of remote spinlocks */
|
||||
#define HWSPINLOCK_TIMEOUT 1000
|
||||
|
||||
/* The qcom hwspinlock id is always plus one from the smem host id */
|
||||
#define SMEM_HOST_ID_TO_HWSPINLOCK_ID(__x) ((__x) + 1)
|
||||
|
||||
/**
|
||||
* qcom_smem_bust_hwspin_lock_by_host() - bust the smem hwspinlock for a host
|
||||
* @host: remote processor id
|
||||
*
|
||||
* Busts the hwspin_lock for the given smem host id. This helper is intended
|
||||
* for remoteproc drivers that manage remoteprocs with an equivalent smem
|
||||
* driver instance in the remote firmware. Drivers can force a release of the
|
||||
* smem hwspin_lock if the rproc unexpectedly goes into a bad state.
|
||||
*
|
||||
* Context: Process context.
|
||||
*
|
||||
* Returns: 0 on success, otherwise negative errno.
|
||||
*/
|
||||
int qcom_smem_bust_hwspin_lock_by_host(unsigned int host)
|
||||
{
|
||||
/* This function is for remote procs, so ignore SMEM_HOST_APPS */
|
||||
if (host == SMEM_HOST_APPS || host >= SMEM_HOST_COUNT)
|
||||
return -EINVAL;
|
||||
|
||||
return hwspin_lock_bust(__smem->hwlock, SMEM_HOST_ID_TO_HWSPINLOCK_ID(host));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_smem_bust_hwspin_lock_by_host);
|
||||
|
||||
/**
|
||||
* qcom_smem_is_available() - Check if SMEM is available
|
||||
*
|
||||
|
|
|
@ -495,6 +495,7 @@ static int hisi_spi_probe(struct platform_device *pdev)
|
|||
host->transfer_one = hisi_spi_transfer_one;
|
||||
host->handle_err = hisi_spi_handle_err;
|
||||
host->dev.fwnode = dev->fwnode;
|
||||
host->min_speed_hz = DIV_ROUND_UP(host->max_speed_hz, CLK_DIV_MAX);
|
||||
|
||||
hisi_spi_hw_init(hs);
|
||||
|
||||
|
|
|
@ -2281,7 +2281,17 @@ static inline int ufshcd_hba_capabilities(struct ufs_hba *hba)
|
|||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* The UFSHCI 3.0 specification does not define MCQ_SUPPORT and
|
||||
* LSDB_SUPPORT, but [31:29] as reserved bits with reset value 0s, which
|
||||
* means we can simply read values regardless of version.
|
||||
*/
|
||||
hba->mcq_sup = FIELD_GET(MASK_MCQ_SUPPORT, hba->capabilities);
|
||||
/*
|
||||
* 0h: legacy single doorbell support is available
|
||||
* 1h: indicate that legacy single doorbell support has been removed
|
||||
*/
|
||||
hba->lsdb_sup = !FIELD_GET(MASK_LSDB_SUPPORT, hba->capabilities);
|
||||
if (!hba->mcq_sup)
|
||||
return 0;
|
||||
|
||||
|
@ -6457,7 +6467,8 @@ again:
|
|||
if (ufshcd_err_handling_should_stop(hba))
|
||||
goto skip_err_handling;
|
||||
|
||||
if (hba->dev_quirks & UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS) {
|
||||
if ((hba->dev_quirks & UFS_DEVICE_QUIRK_RECOVERY_FROM_DL_NAC_ERRORS) &&
|
||||
!hba->force_reset) {
|
||||
bool ret;
|
||||
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
|
@ -10386,6 +10397,12 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
|
|||
}
|
||||
|
||||
if (!is_mcq_supported(hba)) {
|
||||
if (!hba->lsdb_sup) {
|
||||
dev_err(hba->dev, "%s: failed to initialize (legacy doorbell mode not supported)\n",
|
||||
__func__);
|
||||
err = -EINVAL;
|
||||
goto out_disable;
|
||||
}
|
||||
err = scsi_add_host(host, hba->dev);
|
||||
if (err) {
|
||||
dev_err(hba->dev, "scsi_add_host failed\n");
|
||||
|
|
|
@ -404,7 +404,7 @@ ucsi_register_displayport(struct ucsi_connector *con,
|
|||
bool override, int offset,
|
||||
struct typec_altmode_desc *desc)
|
||||
{
|
||||
return NULL;
|
||||
return typec_port_register_altmode(con->port, desc);
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
|
|
@ -144,53 +144,62 @@ static int tweak_set_configuration_cmd(struct urb *urb)
|
|||
if (err && err != -ENODEV)
|
||||
dev_err(&sdev->udev->dev, "can't set config #%d, error %d\n",
|
||||
config, err);
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static int tweak_reset_device_cmd(struct urb *urb)
|
||||
{
|
||||
struct stub_priv *priv = (struct stub_priv *) urb->context;
|
||||
struct stub_device *sdev = priv->sdev;
|
||||
int err;
|
||||
|
||||
dev_info(&urb->dev->dev, "usb_queue_reset_device\n");
|
||||
|
||||
if (usb_lock_device_for_reset(sdev->udev, NULL) < 0) {
|
||||
err = usb_lock_device_for_reset(sdev->udev, NULL);
|
||||
if (err < 0) {
|
||||
dev_err(&urb->dev->dev, "could not obtain lock to reset device\n");
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
usb_reset_device(sdev->udev);
|
||||
err = usb_reset_device(sdev->udev);
|
||||
usb_unlock_device(sdev->udev);
|
||||
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
* clear_halt, set_interface, and set_configuration require special tricks.
|
||||
* Returns 1 if request was tweaked, 0 otherwise.
|
||||
*/
|
||||
static void tweak_special_requests(struct urb *urb)
|
||||
static int tweak_special_requests(struct urb *urb)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (!urb || !urb->setup_packet)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if (usb_pipetype(urb->pipe) != PIPE_CONTROL)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
if (is_clear_halt_cmd(urb))
|
||||
/* tweak clear_halt */
|
||||
tweak_clear_halt_cmd(urb);
|
||||
err = tweak_clear_halt_cmd(urb);
|
||||
|
||||
else if (is_set_interface_cmd(urb))
|
||||
/* tweak set_interface */
|
||||
tweak_set_interface_cmd(urb);
|
||||
err = tweak_set_interface_cmd(urb);
|
||||
|
||||
else if (is_set_configuration_cmd(urb))
|
||||
/* tweak set_configuration */
|
||||
tweak_set_configuration_cmd(urb);
|
||||
err = tweak_set_configuration_cmd(urb);
|
||||
|
||||
else if (is_reset_device_cmd(urb))
|
||||
tweak_reset_device_cmd(urb);
|
||||
else
|
||||
err = tweak_reset_device_cmd(urb);
|
||||
else {
|
||||
usbip_dbg_stub_rx("no need to tweak\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return !err;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -468,6 +477,7 @@ static void stub_recv_cmd_submit(struct stub_device *sdev,
|
|||
int support_sg = 1;
|
||||
int np = 0;
|
||||
int ret, i;
|
||||
int is_tweaked;
|
||||
|
||||
if (pipe == -1)
|
||||
return;
|
||||
|
@ -580,8 +590,11 @@ static void stub_recv_cmd_submit(struct stub_device *sdev,
|
|||
priv->urbs[i]->pipe = pipe;
|
||||
priv->urbs[i]->complete = stub_complete;
|
||||
|
||||
/* no need to submit an intercepted request, but harmless? */
|
||||
tweak_special_requests(priv->urbs[i]);
|
||||
/*
|
||||
* all URBs belong to a single PDU, so a global is_tweaked flag is
|
||||
* enough
|
||||
*/
|
||||
is_tweaked = tweak_special_requests(priv->urbs[i]);
|
||||
|
||||
masking_bogus_flags(priv->urbs[i]);
|
||||
}
|
||||
|
@ -594,22 +607,32 @@ static void stub_recv_cmd_submit(struct stub_device *sdev,
|
|||
|
||||
/* urb is now ready to submit */
|
||||
for (i = 0; i < priv->num_urbs; i++) {
|
||||
ret = usb_submit_urb(priv->urbs[i], GFP_KERNEL);
|
||||
if (!is_tweaked) {
|
||||
ret = usb_submit_urb(priv->urbs[i], GFP_KERNEL);
|
||||
|
||||
if (ret == 0)
|
||||
usbip_dbg_stub_rx("submit urb ok, seqnum %u\n",
|
||||
pdu->base.seqnum);
|
||||
else {
|
||||
dev_err(&udev->dev, "submit_urb error, %d\n", ret);
|
||||
usbip_dump_header(pdu);
|
||||
usbip_dump_urb(priv->urbs[i]);
|
||||
if (ret == 0)
|
||||
usbip_dbg_stub_rx("submit urb ok, seqnum %u\n",
|
||||
pdu->base.seqnum);
|
||||
else {
|
||||
dev_err(&udev->dev, "submit_urb error, %d\n", ret);
|
||||
usbip_dump_header(pdu);
|
||||
usbip_dump_urb(priv->urbs[i]);
|
||||
|
||||
/*
|
||||
* Pessimistic.
|
||||
* This connection will be discarded.
|
||||
*/
|
||||
usbip_event_add(ud, SDEV_EVENT_ERROR_SUBMIT);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* Pessimistic.
|
||||
* This connection will be discarded.
|
||||
* An identical URB was already submitted in
|
||||
* tweak_special_requests(). Skip submitting this URB to not
|
||||
* duplicate the request.
|
||||
*/
|
||||
usbip_event_add(ud, SDEV_EVENT_ERROR_SUBMIT);
|
||||
break;
|
||||
priv->urbs[i]->status = 0;
|
||||
stub_complete(priv->urbs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1266,6 +1266,19 @@ static void extent_err(const struct extent_buffer *eb, int slot,
|
|||
va_end(args);
|
||||
}
|
||||
|
||||
static bool is_valid_dref_root(u64 rootid)
|
||||
{
|
||||
/*
|
||||
* The following tree root objectids are allowed to have a data backref:
|
||||
* - subvolume trees
|
||||
* - data reloc tree
|
||||
* - tree root
|
||||
* For v1 space cache
|
||||
*/
|
||||
return is_fstree(rootid) || rootid == BTRFS_DATA_RELOC_TREE_OBJECTID ||
|
||||
rootid == BTRFS_ROOT_TREE_OBJECTID;
|
||||
}
|
||||
|
||||
static int check_extent_item(struct extent_buffer *leaf,
|
||||
struct btrfs_key *key, int slot,
|
||||
struct btrfs_key *prev_key)
|
||||
|
@ -1418,6 +1431,8 @@ static int check_extent_item(struct extent_buffer *leaf,
|
|||
struct btrfs_extent_data_ref *dref;
|
||||
struct btrfs_shared_data_ref *sref;
|
||||
u64 seq;
|
||||
u64 dref_root;
|
||||
u64 dref_objectid;
|
||||
u64 dref_offset;
|
||||
u64 inline_offset;
|
||||
u8 inline_type;
|
||||
|
@ -1461,11 +1476,26 @@ static int check_extent_item(struct extent_buffer *leaf,
|
|||
*/
|
||||
case BTRFS_EXTENT_DATA_REF_KEY:
|
||||
dref = (struct btrfs_extent_data_ref *)(&iref->offset);
|
||||
dref_root = btrfs_extent_data_ref_root(leaf, dref);
|
||||
dref_objectid = btrfs_extent_data_ref_objectid(leaf, dref);
|
||||
dref_offset = btrfs_extent_data_ref_offset(leaf, dref);
|
||||
seq = hash_extent_data_ref(
|
||||
btrfs_extent_data_ref_root(leaf, dref),
|
||||
btrfs_extent_data_ref_objectid(leaf, dref),
|
||||
btrfs_extent_data_ref_offset(leaf, dref));
|
||||
if (unlikely(!is_valid_dref_root(dref_root))) {
|
||||
extent_err(leaf, slot,
|
||||
"invalid data ref root value %llu",
|
||||
dref_root);
|
||||
return -EUCLEAN;
|
||||
}
|
||||
if (unlikely(dref_objectid < BTRFS_FIRST_FREE_OBJECTID ||
|
||||
dref_objectid > BTRFS_LAST_FREE_OBJECTID)) {
|
||||
extent_err(leaf, slot,
|
||||
"invalid data ref objectid value %llu",
|
||||
dref_root);
|
||||
return -EUCLEAN;
|
||||
}
|
||||
if (unlikely(!IS_ALIGNED(dref_offset,
|
||||
fs_info->sectorsize))) {
|
||||
extent_err(leaf, slot,
|
||||
|
@ -1601,6 +1631,8 @@ static int check_extent_data_ref(struct extent_buffer *leaf,
|
|||
return -EUCLEAN;
|
||||
}
|
||||
for (; ptr < end; ptr += sizeof(*dref)) {
|
||||
u64 root;
|
||||
u64 objectid;
|
||||
u64 offset;
|
||||
|
||||
/*
|
||||
|
@ -1608,7 +1640,22 @@ static int check_extent_data_ref(struct extent_buffer *leaf,
|
|||
* overflow from the leaf due to hash collisions.
|
||||
*/
|
||||
dref = (struct btrfs_extent_data_ref *)ptr;
|
||||
root = btrfs_extent_data_ref_root(leaf, dref);
|
||||
objectid = btrfs_extent_data_ref_objectid(leaf, dref);
|
||||
offset = btrfs_extent_data_ref_offset(leaf, dref);
|
||||
if (unlikely(!is_valid_dref_root(root))) {
|
||||
extent_err(leaf, slot,
|
||||
"invalid extent data backref root value %llu",
|
||||
root);
|
||||
return -EUCLEAN;
|
||||
}
|
||||
if (unlikely(objectid < BTRFS_FIRST_FREE_OBJECTID ||
|
||||
objectid > BTRFS_LAST_FREE_OBJECTID)) {
|
||||
extent_err(leaf, slot,
|
||||
"invalid extent data backref objectid value %llu",
|
||||
root);
|
||||
return -EUCLEAN;
|
||||
}
|
||||
if (unlikely(!IS_ALIGNED(offset, leaf->fs_info->sectorsize))) {
|
||||
extent_err(leaf, slot,
|
||||
"invalid extent data backref offset, have %llu expect aligned to %u",
|
||||
|
|
|
@ -4148,7 +4148,7 @@ extern struct kmem_cache *f2fs_inode_entry_slab;
|
|||
* inline.c
|
||||
*/
|
||||
bool f2fs_may_inline_data(struct inode *inode);
|
||||
bool f2fs_sanity_check_inline_data(struct inode *inode);
|
||||
bool f2fs_sanity_check_inline_data(struct inode *inode, struct page *ipage);
|
||||
bool f2fs_may_inline_dentry(struct inode *inode);
|
||||
void f2fs_do_read_inline_data(struct page *page, struct page *ipage);
|
||||
void f2fs_truncate_inline_inode(struct inode *inode,
|
||||
|
|
|
@ -33,11 +33,29 @@ bool f2fs_may_inline_data(struct inode *inode)
|
|||
return !f2fs_post_read_required(inode);
|
||||
}
|
||||
|
||||
bool f2fs_sanity_check_inline_data(struct inode *inode)
|
||||
static bool inode_has_blocks(struct inode *inode, struct page *ipage)
|
||||
{
|
||||
struct f2fs_inode *ri = F2FS_INODE(ipage);
|
||||
int i;
|
||||
|
||||
if (F2FS_HAS_BLOCKS(inode))
|
||||
return true;
|
||||
|
||||
for (i = 0; i < DEF_NIDS_PER_INODE; i++) {
|
||||
if (ri->i_nid[i])
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool f2fs_sanity_check_inline_data(struct inode *inode, struct page *ipage)
|
||||
{
|
||||
if (!f2fs_has_inline_data(inode))
|
||||
return false;
|
||||
|
||||
if (inode_has_blocks(inode, ipage))
|
||||
return false;
|
||||
|
||||
if (!support_inline_data(inode))
|
||||
return true;
|
||||
|
||||
|
|
|
@ -346,7 +346,7 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page)
|
|||
}
|
||||
}
|
||||
|
||||
if (f2fs_sanity_check_inline_data(inode)) {
|
||||
if (f2fs_sanity_check_inline_data(inode, node_page)) {
|
||||
f2fs_warn(sbi, "%s: inode (ino=%lx, mode=%u) should not have inline_data, run fsck to fix",
|
||||
__func__, inode->i_ino, inode->i_mode);
|
||||
return false;
|
||||
|
|
|
@ -75,9 +75,6 @@
|
|||
#define GFS2_QD_HASH_SIZE BIT(GFS2_QD_HASH_SHIFT)
|
||||
#define GFS2_QD_HASH_MASK (GFS2_QD_HASH_SIZE - 1)
|
||||
|
||||
#define QC_CHANGE 0
|
||||
#define QC_SYNC 1
|
||||
|
||||
/* Lock order: qd_lock -> bucket lock -> qd->lockref.lock -> lru lock */
|
||||
/* -> sd_bitmap_lock */
|
||||
static DEFINE_SPINLOCK(qd_lock);
|
||||
|
@ -697,7 +694,7 @@ static int sort_qd(const void *a, const void *b)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void do_qc(struct gfs2_quota_data *qd, s64 change, int qc_type)
|
||||
static void do_qc(struct gfs2_quota_data *qd, s64 change)
|
||||
{
|
||||
struct gfs2_sbd *sdp = qd->qd_sbd;
|
||||
struct gfs2_inode *ip = GFS2_I(sdp->sd_qc_inode);
|
||||
|
@ -722,18 +719,16 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change, int qc_type)
|
|||
qd->qd_change = x;
|
||||
spin_unlock(&qd_lock);
|
||||
|
||||
if (qc_type == QC_CHANGE) {
|
||||
if (!test_and_set_bit(QDF_CHANGE, &qd->qd_flags)) {
|
||||
qd_hold(qd);
|
||||
slot_hold(qd);
|
||||
}
|
||||
} else {
|
||||
if (!x) {
|
||||
gfs2_assert_warn(sdp, test_bit(QDF_CHANGE, &qd->qd_flags));
|
||||
clear_bit(QDF_CHANGE, &qd->qd_flags);
|
||||
qc->qc_flags = 0;
|
||||
qc->qc_id = 0;
|
||||
slot_put(qd);
|
||||
qd_put(qd);
|
||||
} else if (!test_and_set_bit(QDF_CHANGE, &qd->qd_flags)) {
|
||||
qd_hold(qd);
|
||||
slot_hold(qd);
|
||||
}
|
||||
|
||||
if (change < 0) /* Reset quiet flag if we freed some blocks */
|
||||
|
@ -978,7 +973,7 @@ static int do_sync(unsigned int num_qd, struct gfs2_quota_data **qda)
|
|||
if (error)
|
||||
goto out_end_trans;
|
||||
|
||||
do_qc(qd, -qd->qd_change_sync, QC_SYNC);
|
||||
do_qc(qd, -qd->qd_change_sync);
|
||||
set_bit(QDF_REFRESH, &qd->qd_flags);
|
||||
}
|
||||
|
||||
|
@ -1300,7 +1295,7 @@ void gfs2_quota_change(struct gfs2_inode *ip, s64 change,
|
|||
|
||||
if (qid_eq(qd->qd_id, make_kqid_uid(uid)) ||
|
||||
qid_eq(qd->qd_id, make_kqid_gid(gid))) {
|
||||
do_qc(qd, change, QC_CHANGE);
|
||||
do_qc(qd, change);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -99,12 +99,12 @@ out_unlock:
|
|||
*/
|
||||
int gfs2_freeze_lock_shared(struct gfs2_sbd *sdp)
|
||||
{
|
||||
int flags = LM_FLAG_NOEXP | GL_EXACT;
|
||||
int error;
|
||||
|
||||
error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED,
|
||||
LM_FLAG_NOEXP | GL_EXACT,
|
||||
error = gfs2_glock_nq_init(sdp->sd_freeze_gl, LM_ST_SHARED, flags,
|
||||
&sdp->sd_freeze_gh);
|
||||
if (error)
|
||||
if (error && error != GLR_TRYFAILED)
|
||||
fs_err(sdp, "can't lock the freeze glock: %d\n", error);
|
||||
return error;
|
||||
}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue